XMLSerializer到XElement

use*_*434 14 .net c# xml linq serializer

我一直在使用数据库LINQ中的XML,并发现使用序列化器非常困难.

数据库LINQ需要一个存储的字段XElement.

我有一个复杂的对象有很多自定义的结构类,所以我想使用XmlSerializer来序列化对象.

但是,序列化程序只能序列化为文件("C:\ xxx\xxx.xml")或内存流.

但是要将它转换或序列化为XElement,以便我可以使用LINQ存储在数据库中?

以及如何做到相反?即反序列化XElement ...

Ste*_*cya 14

试着用这个

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

    using (XmlReader reader = XmlReader.Create(stream))
    {
        XElement element = XElement.Load(reader);
    }
}
Run Code Online (Sandbox Code Playgroud)

反序列化:

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);
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*thy 9

为了使John Saunders所描述的更加明确,反序列化非常简单:

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

序列化有点混乱,因为CreateWriter()从XElement或XDocument 调用会创建子元素.(此外,从XElement创建的XmlWriter具有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;
}
Run Code Online (Sandbox Code Playgroud)