【问题标题】:How to serialize Anonymous-typed Objects to XML?如何将匿名类型的对象序列化为 XML?
【发布时间】:2012-08-07 10:26:11
【问题描述】:

有没有办法将动态创建的对象序列化为 xml 字符串?

var foobar = new { foo = "bar" };
string xml = ConvertToXMLString(foobar);
//xml should be something like : 
//<foo>bar</foo>

我可以查看 XMLSerializer 和 DataContractSerializer,但 XMLSerializer 需要对象类型,而 DataContractSerializer 需要需要序列化的属性的属性。

出于绝望,我先将对象转换为 JSON,然后从 JSON 将其转换为 XML。

var foobar = new { foo = "bar" };
JavaScriptSerializer js = new JavaScriptSerializer();
jsonString = js.Serialize(values);
//Json.NET at http://json.codeplex.com/
XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(jsonString);

【问题讨论】:

  • "dynamic" 对象不同:new {..} 产生静态类型表达式。
  • 感谢您指出这一点。我搞混了这些术语。
  • 很好地调用 hack 来转换为 JSON,然后是 XML =)

标签: .net xml json xml-serialization


【解决方案1】:

不使用标准的内置序列化程序,不; XmlSerializer 要求公共类型(匿名类型不是),并且仅适用于读写成员(匿名类型没有 em>)。 DataContractSerializer 想要属性(匿名类型没有)。

坦率地说,这里最简单和最受支持的“修复”是正式声明一个与您所追求的相匹配的 POCO DTO,即:不要在这里使用匿名类型。例如:

public class MyDto {
    public string foo {get;set;}
}
...
var foobar = new MyDto { foo = "bar" };

替代方法是基本上编写自己的 xml 序列化程序。那……听起来不好玩。

【讨论】:

    【解决方案2】:

    可以使用反射来完成,请查看此线程中的第二个和第三个答案以获取代码示例:Can I serialize Anonymous Types as xml?

    MartinHN also blogged about this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2011-03-13
      • 2011-10-17
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多