有什么方法可以序列化.net中的匿名类型?普通的XmlSerializer失败,因为该类型没有定义无参数构造函数。并且NetDataContractSeralizer失败,因为我们无法将DataContract或Serializable属性标记为匿名类。
所以有什么聪明的方法,还是我们做不到?
是,可以序列化匿名类型。想到的最简单的方法是创建一个包装器对象,该对象实现ISerializable
并使用反射检查其字段的匿名类型并适当地对其进行序列化。这将是非常丑陋的,但是会起作用。
但是我认为更重要的问题是
是否可以反序列化匿名类型?
答案是“不是一般意义上的”。匿名类型是特定于程序集的类型。因此,虽然可以对特定的匿名类型以特定的方式进行操作,但由于它们是内部的,因此在一般意义上以及在不同的程序集之间都不可行。
定义“序列化”。序列化意味着以后可以反序列化的能力,并且如果没有定义的类,则不会对to进行反序列化。但是,如果您只是希望将数据放置在XML文件中以便以后进行检索,则可以这样做。
创建您选择的XML文档的实例(XmlDocument
,XDocumnet
,任何东西)并以这种方式构建(随您的需要插入节点和值),然后使用基本的文件IO将其保存在某个地方。或者,如果您只是想在进程之间进行传递,则将其作为MemoryStream
或Byte[]
仅从非常一般的意义上讲,没有什么可以阻止您创建表示对象的XML,没有什么可以阻止您创建状态反映某些XML的对象。
从特定意义上说,直接由框架支持,并导致由程序集定义的类型的对象,则否。根据定义,没有定义匿名对象,这就是使它匿名的原因。
我知道这是一篇老文章,但是我的解决方案仅用两行代码即可将匿名类型转换为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>