XMLSerializer для XElement - PullRequest
       7

XMLSerializer для XElement

14 голосов
/ 27 октября 2011

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

В базе данных LINQ требовалось поле для хранения XElement.

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 27 октября 2011

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

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);
}
9 голосов
/ 30 марта 2015

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

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, если вы не используете обходной путь здесь .) и помогает нам решить проблему с 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;
}
4 голосов
/ 27 октября 2011

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

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

0 голосов
/ 27 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...