XMLSerializer для XElement

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

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

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

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

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

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

Ответ 1

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

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

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

deserialize:

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);
}

Ответ 2

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

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.Fragment, что приводит к сбою 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;
}

Ответ 3

Прежде всего, см. Serialize Method, чтобы увидеть, что сериализатор может обрабатывать гораздо больше, чем просто потоки или файлы памяти.

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

Ответ 4

У SQL может быть тип данных XML, это может помочь вам взглянуть на msdn