XMLSerializer в XElement

Я работал с XML в базе данных LINQ и обнаружил, что очень сложно работать с сериализатором.

для базы данных LINQ требуется поле, которое хранит XElement.

У меня есть сложный объект со многими настраиваемыми классами структуры, поэтому я хотел бы использовать XmlSerializer для сериализации объекта.

однако сериализатор может сериализоваться только в файл ("C:xxxxxx.xml") или поток памяти.

однако, чтобы преобразовать или сериализовать его быть XElement, чтобы я мог хранить в базе данных с помощью LINQ?

а как сделать обратное? т. е. десериализовать XElement...

4 ответов


попробуйте использовать это

using (var stream = new MemoryStream())
{
    serializer.Serialize(stream, value);
    stream.Position = 0;

    using (XmlReader reader = XmlReader.Create(stream))
    {
        XElement element = XElement.Load(reader);
    }
}

десериализовать :

XmlSerializer xs = new XmlSerializer(typeof(XElement));
using (MemoryStream ms = new MemoryStream())
{
     xs.Serialize(ms, xml);
     ms.Position = 0;

     xs = new XmlSerializer(typeof(YourType));
     object obj = xs.Deserialize(ms);
}

чтобы сделать то, что описывал Джон Сондерс, более явным, десериализация очень проста:

public static object DeserializeFromXElement(XElement element, Type t)
{
    using (XmlReader reader = element.CreateReader())
    {
        XmlSerializer serializer = new XmlSerializer(t);
        return serializer.Deserialize(reader);
    }
}

сериализация немного запутаннее, потому что вызов CreateWriter() из XElement или XDocument создает дочерние элементы. (Кроме того, в программе XmlWriter, созданные из XElement с имеет значения conformancelevel.Фрагмент, который вызывает сбой XmlSerialize, если вы не используете обходной путь здесь.) В результате я использую XDocument, так как для этого требуется один элемент, и позволяет обойти проблему XmlWriter:

public static XElement SerializeToXElement(object o)
{
    var doc = new XDocument();
    using (XmlWriter writer = doc.CreateWriter())
    {
        XmlSerializer serializer = new XmlSerializer(o.GetType());
        serializer.Serialize(writer, o);
    }

    return doc.Root;
}

во-первых, см. Сериализовать Способ чтобы увидеть, что сериализатор может обрабатывать больше, чем просто потоки памяти или файлы.

во-вторых, попробуйте использовать XElement.CreateWriter, а затем передает результирующий XmlWriter сериализатору.


SQL имеет тип данных XML может быть это может помочь вам посмотреть на в MSDN