使用XDocument作为XmlSerializer.Deserialize的源?

Rom*_*kov 36 .net linq-to-xml

我想调用XmlSerializer.Deserialize它来传递它XDocument.它可以采取a Stream,a XmlReader或a TextReader.

我可以生成上面的一个XDocument而不实际转储XDocument到一些中间存储,例如MemoryStream

似乎我所追求的是一个XmlReader适用于它的实现XDocument.我找不到一个.

Ste*_*idi 49

您可以使用XDocument.CreateReader()创建一个XmlReader读取内容的XDocument.

同样,以下内容也适用.

XmlReader GetReader(XDocument doc)
{
    return doc.Root.CreateReader();
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*ver 13

这是一个将对象序列化和反序列化到XDocument或从XDocument反序列化的实用程序.

XDocument doc = SerializationUtil.Serialize(foo);
Foo foo = SerializationUtil.Deserialize<Foo>(doc);
Run Code Online (Sandbox Code Playgroud)

这是班级:

public static class SerializationUtil
{
    public static T Deserialize<T>(XDocument doc)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

        using (var reader = doc.Root.CreateReader())
        {
            return (T)xmlSerializer.Deserialize(reader);
        }
    }

    public static XDocument Serialize<T>(T value)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

        XDocument doc = new XDocument();
        using (var writer = doc.CreateWriter())
        {
            xmlSerializer.Serialize(writer, value);
        }

        return doc;
    }
}
Run Code Online (Sandbox Code Playgroud)


Sla*_*uma 5

(Steve Guidi 回答的附录)

据我所知,没有XmlReader您可以轻松使用的实现,XDocument而无需通过中间存储移动 XML 内容,例如XML 的字符串表示形式,并且支持所有类型,例如System.Xml.XmlNodeReader支持的类型

返回的读取器XDocument.CreateReader(它是一个System.Xml.Linq.XNodeReader内部类)是 aXmlReader并且适用于大多数 Xml 文档,但不适用于具有二进制数据元素的文档,因为它的实现不支持 Base64 或 BinHex 数据

不支持 Base64 和 BinHex 数据。如果您尝试检索这些类型的数据(例如,通过调用 ReadElementContentAsBase64),读取器将抛出 NotSupportedException。

对于这位读者XDocument.CreateReader().CanReadBinaryContentfalse相反的System.Xml.XmlNodeReader

例如这个程序抛出一个异常:

public class SomeTest
{
    public byte[] BinaryTest { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        XDocument document = new XDocument(
            new XElement("SomeTest",
                new XElement("BinaryTest", "VGVzdA==")));

        using (var reader = document.CreateReader())
        {
            var serializer = new XmlSerializer(typeof(SomeTest));
            var someTest = serializer.Deserialize(reader) as SomeTest;
            // NotSupportedException here (as inner exception)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,将 XML 提取为string并将其作为传递TextReader给序列化程序是有效的:

        using (var reader = new StringReader(document.ToString()))
Run Code Online (Sandbox Code Playgroud)

如果有另一种方法可以反序列化XDocument包含二进制数据的 而不先将其转换为字符串的方法,我也会感兴趣。