【问题标题】:C# Advanced XML Serializer that doesn't require domain object pollution不需要域对象污染的 C# 高级 XML 序列化程序
【发布时间】:2009-10-28 22:23:29
【问题描述】:

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

【问题讨论】:

  • 如果您没有找到 XML 文件,请查看 JSON.NET。 codeplex.com/Json
  • 我曾考虑过,因为我知道存在许多 JSON 序列化程序,它们可能会做我想做的事,但我需要 xml 来执行 XSLT 编译转换(文档生成),我不认为尝试转换 JSON 是要走的路
  • 默认 XMLSerializer 是一个不错的选择。它只需要属性来改变它的默认行为。在我工作的公司中,我们序列化大量复杂对象而没有放置单个属性,因为我们对输出不感兴趣。实际上,任何其他序列化程序也将要求您放置属性以更改行为。

标签: c# xml-serialization domain-driven-design poco


【解决方案1】:

好吧,首先定义“高级”,即具体你需要XmlSerializer没有的东西。就 POCO 而言,XmlSerializer 有一个重载的 ctor,它接受您可能曾经想要添加的所有属性,以避免将它们添加到您的对象模型中 - 但它仍然需要一个公共无参数构造函数,并且仅适用于公共读/写字段/属性。如果您使用这种方法,您应该缓存/重用序列化程序。

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

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

【讨论】:

  • 我认为污染对象路线可能是最好的答案,因为我已经了解了 AutoMapper,它应该能够用零代码完成大部分翻译。
【解决方案2】:
  • 您可以使用 InternalsVisibleToAttribute 允许 System.Xml.dll 访问您的内部。 从而序列化内部类型和/或内部成员。包括内部 .ctors。
  • 您还可以在类上实现 IXmlSerializable 以自定义它们的序列化(例如包含接口引用的容器)。
  • 您不必在类中提供 XML 序列化属性,而是将它们作为 XmlAttributeOverrides 提供。

XmlSerializer 几乎总是人们想要的,只是他们不知道它是否像实际那样灵活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多