2009-10-28 57 views
3

是否有任何封闭或开放源码项目为C#中的XML序列化可以序列化在大多数情况下的任何对象,而无需污染我的域对象与吨属性?那也将处理使用内部泛型类构建的集合的序列化?一个好处是它可以处理序列化接口类型的属性。另一个好处是,它可以(注明内部get访问或至少)C#高级XML序列化,不需要域对象的污染

+0

如果您没有找到XML,请查看JSON.NET。 http://www.codeplex.com/Json – Klinger 2009-10-28 22:29:57

+0

我曾经想过,因为我知道有很多JSON序列化程序存在,可能可以做我想做的事情,但是我需要xml来执行XSLT编译转换(文档生成),并且我不会想想要转换JSON是一种可行的方式 – 2009-10-28 23:07:21

+0

默认的XMLSerializer是一个不错的选择。它只需要属性来改变它的默认行为。在我工作的公司中,我们序列化了大量复杂的对象,但没有放置单个属性,因为我们对输出没有兴趣。实际上,任何其他序列化程序也会要求你放置属性来改变行为。 – 2009-10-28 23:49:05

回答

5

那么序列化具有只读属性的对象,首先定义“高级”,即什么专门你需要一个XmlSerializer不有。在POCO方面,XmlSerializer一个重载的构造函数,它接受所有你能曾经要添加,以避免将它们添加到您的对象模型的属性 - 但它仍然需要一个公共的无参数的构造函数,并且仅适用于公共读/写字段/属性。如果你使用这种方法,你应该缓存/重新使用序列化程序。

我不知道有任何类似的替代品,只是因为在大多数情况下,这是“足够好” - 而这往往是一个错误的尝试暴力破解现有的域对象到DTO。这可能是更简单,更易于维护简单域实体映射到一个新的DTO(s)表示归因(并有适当的构造函数/属性/等)。

注意,对于构造函数/属性发出DataContractSerializer一些答案,但这并没有对什么XML是什么样子尽可能多的细粒度控制。

+0

我认为污染物体的路线可能是最好的答案,因为我已经了解到AutoMapper应该能够用零代码完成大部分翻译。 – 2009-11-12 21:06:19

0
  • 您可以通过使用InternalsVisibleToAttribute来允许System.Xml.dll访问您的内部。 从而序列化内部类型和/或内部成员。包括内部的.ctors。
  • 您也可以实现IXmlSerializable的类上定制自己的序列化(如含容器接口引用)。
  • 你不必提供有关你的类XML序列化的属性,而是将它们作为XmlAttributeOverrides代替。

XmlSerializer几乎总是人们想要的,他们只是不知道它是如此灵活。