C#高级XML序列化程序,不';不需要域对象污染

C#高级XML序列化程序,不';不需要域对象污染,c#,xml-serialization,domain-driven-design,poco,C#,Xml Serialization,Domain Driven Design,Poco,对于C#的XML序列化程序,是否有任何封闭或开放源代码项目可以序列化大部分对象,而无需使用大量属性污染我的域对象?这也将处理用内部泛型类构建的集合的序列化?一个好处是它可以处理序列化接口类型属性。另一个好处是,它可以序列化具有只读属性的对象(或者至少是带有标记为internal的get访问器的对象)首先,定义“advanced”,也就是说,XmlSerializer没有具体需要什么。就POCO而言,XmlSerializer有一个重载的ctor,它接受您可能想要添加的所有属性,以避免将它们添加到

对于C#的XML序列化程序,是否有任何封闭或开放源代码项目可以序列化大部分对象,而无需使用大量属性污染我的域对象?这也将处理用内部泛型类构建的集合的序列化?一个好处是它可以处理序列化接口类型属性。另一个好处是,它可以序列化具有只读属性的对象(或者至少是带有标记为internal的get访问器的对象)

首先,定义“advanced”,也就是说,
XmlSerializer
没有具体需要什么。就POCO而言,
XmlSerializer
有一个重载的ctor,它接受您可能想要添加的所有属性,以避免将它们添加到对象模型中——但它仍然需要一个公共的无参数构造函数,并且只对公共读/写字段/属性有效。如果使用这种方法,则应该缓存/重用序列化程序

我不知道有任何类似的替代方案,只是因为在大多数情况下,这是“足够好的”-并且尝试将现有的域对象暴力强制到DTO中通常是错误的。只需将域实体映射到具有属性(并具有适当的ctor/properties/etc)的新DTO上,可能会更简单、更易于维护

请注意,对于ctor/properties问题,
DataContractSerializer
有一些答案,但这并没有对xml外观的细粒度控制。

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

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

如果你找不到一个XML的,看看JSON.NET。我曾经考虑过,因为我知道存在许多JSON序列化程序,它们可能可以实现我想要的功能,但是我需要xml来执行XSLT编译的转换(文档生成),我不认为尝试转换JSON是goDefault XMLSerializer的好方法。它只需要属性来改变它的默认行为。在我工作的公司里,我们序列化了大量复杂对象,而没有添加任何属性,因为我们对输出不感兴趣。事实上,任何其他序列化程序也会要求您放置属性以更改行为。我认为受污染对象路由可能是最好的答案,因为我了解了AutoMapper,它应该能够用零代码完成大部分转换。