有什么方法可以使用C#对.net中的匿名类型进行xml序列化

问题描述 投票:4回答:3

有什么方法可以序列化.net中的匿名类型?普通的XmlSerializer失败,因为该类型没有定义无参数构造函数。并且NetDataContractSeralizer失败,因为我们无法将DataContract或Serializable属性标记为匿名类。

所以有什么聪明的方法,还是我们做不到?

c# .net serialization anonymous-types
3个回答
3
投票

是,可以序列化匿名类型。想到的最简单的方法是创建一个包装器对象,该对象实现ISerializable并使用反射检查其字段的匿名类型并适当地对其进行序列化。这将是非常丑陋的,但是会起作用。

但是我认为更重要的问题是

是否可以反序列化匿名类型?

答案是“不是一般意义上的”。匿名类型是特定于程序集的类型。因此,虽然可以对特定的匿名类型以特定的方式进行操作,但由于它们是内部的,因此在一般意义上以及在不同的程序集之间都不可行。


1
投票

定义“序列化”。序列化意味着以后可以反序列化的能力,并且如果没有定义的类,则不会对to进行反序列化。但是,如果您只是希望将数据放置在XML文件中以便以后进行检索,则可以这样做。

创建您选择的XML文档的实例(XmlDocumentXDocumnet,任何东西)并以这种方式构建(随您的需要插入节点和值),然后使用基本的文件IO将其保存在某个地方。或者,如果您只是想在进程之间进行传递,则将其作为MemoryStreamByte[]

传递

0
投票

仅从非常一般的意义上讲,没有什么可以阻止您创建表示对象的XML,没有什么可以阻止您创建状态反映某些XML的对象。

从特定意义上说,直接由框架支持,并导致由程序集定义的类型的对象,则否。根据定义,没有定义匿名对象,这就是使它匿名的原因。


0
投票

我知道这是一篇老文章,但是我的解决方案仅用两行代码即可将匿名类型转换为XML。

首先将您的匿名类型转换为JSON,然后从JSON转换为XML。

var jsonText = JsonConvert.SerializeObject(data);           // convert to JSON
XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonText); // convert JSON to XML Document

样本

var data = new       // data - Anonymous Type
{
    Request = new
    {
        OrderNumber = 123,
        Note = "Hello World"
    }
};

var jsonText = JsonConvert.SerializeObject(data);           
XmlDocument doc = JsonConvert.DeserializeXmlNode(jsonText);

Console.WriteLine(doc.OuterXml);                            

输出

<Request>
    <OrderNumber>123</OrderNumber>
    <Note>Hello World</Note>
</Request>
© www.soinside.com 2019 - 2024. All rights reserved.