非侵入式XML序列化技术?

时间:2013-10-02 12:24:49

标签: c# .net xml

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

然而,我从来没有能够以干净的方式实际实现这一点,我想知道是否有任何我忽略的模式来实现这一点。基本上我希望我的对象模型能够做到这一点并忘记XML序列化(或任何其他类似的序列化),然后传递给一些蜘蛛对象并将其序列化的服务。

我尝试使用扩展方法执行此操作,但是当您想要序列化类型对象的集合时,这会失败。我已经看过使用对象包装器和DTO然后进行序列化,但是你有了维护另一组对象的开销,并且当你想要序列化时必须创建这些对象,当你有序列集时它们会变得混乱类型对象。

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

是否有一种理智的方式来做我正在问的问题,或者我应该咬紧牙关并让我的对象知道xml?

1 个答案:

答案 0 :(得分:1)

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

  1. XML Schema
  2. 序列化代码
  3. 使用属性,您可以擦除步骤3.

    XML和C#阻抗不匹配。无论喜欢与否,您需要定义序列化以创建正确的文档模型。

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

    <强>更新

    如果您真的非常讨厌属性,请尝试使用适配器模式来序列化您的模型。 XML代码将位于单独的类或程序集中,您可以跨存储介质使用模型。当您更新模型时,您将不得不单独更新序列化。