C# 非侵入式XML序列化技术?

C# 非侵入式XML序列化技术?,c#,.net,xml,C#,.net,Xml,我一直认为域模型不应该负责将自身序列化为XML。我过去曾使用IXmlSerializable接口来控制对象的序列化方式,但在理想情况下,我更希望序列化的细节位于对象之外 然而,我从来没有能够以一种干净的方式真正实现这一点,我想知道是否有任何我忽略的模式可以实现这一点。基本上,我希望我的对象模型能够做到这一点,而不去理会XML序列化(或任何其他的序列化),然后交给某个服务来抓取对象并对其进行序列化 我已经尝试过使用扩展方法来实现这一点,但当您想要序列化类型为object的集合时,这一点就不够了。我

我一直认为域模型不应该负责将自身序列化为XML。我过去曾使用IXmlSerializable接口来控制对象的序列化方式,但在理想情况下,我更希望序列化的细节位于对象之外

然而,我从来没有能够以一种干净的方式真正实现这一点,我想知道是否有任何我忽略的模式可以实现这一点。基本上,我希望我的对象模型能够做到这一点,而不去理会XML序列化(或任何其他的序列化),然后交给某个服务来抓取对象并对其进行序列化

我已经尝试过使用扩展方法来实现这一点,但当您想要序列化类型为object的集合时,这一点就不够了。我已经研究过如何使用对象包装器和DTO进行序列化,但这样做会带来维护另一组对象的开销,并且在需要序列化时必须创建这些对象,而当您拥有object类型的集合时,这些对象又会变得混乱

唯一的另一件事是使用反射,但我担心处理开销


有没有一种明智的方法来完成我的要求,或者我应该咬紧牙关,让我的对象知道xml吗?

使用
System.xml。序列化
属性将螺母和螺栓放在代码之外。您正在定义元数据,除可选参数外,不需要额外的代码。实现IXmlSerializable和手动执行序列化容易出错,应该避免。为什么?您正在定义数据3次

  • XML模式
  • 阶级
  • 序列化代码
  • 使用属性,可以拖动步骤3

    XML和C#的阻抗不匹配。不管您喜欢与否,在某些时候,您将需要定义序列化来创建正确的文档模型

    可以说,序列化的类不应该执行任何工作。它们只是一个数据存储。尝试将逻辑从序列化对象中抽象出来——这可能会给您一种温暖的感觉

    更新


    如果您真的非常讨厌属性,请尝试使用适配器模式序列化您的模型。XML代码将位于单独的类或程序集中,您可以跨存储介质使用您的模型。更新模型时,您将不得不单独更新序列化。使用
    System.Xml.serialization
    属性将螺母和螺栓置于代码之外。您正在定义元数据,除可选参数外,不需要额外的代码。实现IXmlSerializable和手动执行序列化容易出错,应该避免。为什么?您正在定义数据3次

  • XML模式
  • 阶级
  • 序列化代码
  • 使用属性,可以拖动步骤3

    XML和C#的阻抗不匹配。不管您喜欢与否,在某些时候,您将需要定义序列化来创建正确的文档模型

    可以说,序列化的类不应该执行任何工作。它们只是一个数据存储。尝试将逻辑从序列化对象中抽象出来——这可能会给您一种温暖的感觉

    更新


    如果您真的非常讨厌属性,请尝试使用适配器模式序列化您的模型。XML代码将位于单独的类或程序集中,您可以跨存储介质使用您的模型。更新模型时,您将不得不单独更新序列化。如果您想要性能,XML不是适合您的格式。如果您想要性能,XML不是适合您的格式。这可能只是我的一个缺点,但我从未热衷于用属性装饰对象。它会弄脏您的代码库(imho),并且仍然有效地将您的模型与序列化联系起来,这正是我试图避免的。@David这在过去对您来说是个问题吗?我很难理解在什么情况下绑定到模式会导致问题。你担心版本控制吗?这可能只是我的一个缺点,但我从来没有热衷于用属性装饰对象。它会弄脏您的代码库(imho),并且仍然有效地将您的模型与序列化联系起来,这正是我试图避免的。@David这在过去对您来说是个问题吗?我很难理解在什么情况下绑定到模式会导致问题。你担心版本控制吗?