1

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

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

我试过用扩展方法来做这件事,但是当你想序列化一个类型对象的集合时,这就不够了。我已经研究过使用对象包装器和 DTO 来实现它,然后进行序列化,但是当你想要序列化时,你需要维护另一组对象并且必须创建这些对象,当你有集合时,这又会变得混乱类型对象。

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

有没有一种理智的方法来做我所要求的,或者我应该硬着头皮让我的对象 xml 感知?

4

1 回答 1

1

使用System.Xml.SerializationAttributes就是将具体细节放在代码之外。您正在定义元数据,除了可选参数之外,不需要额外的代码。实现 IXmlSerializable 并手动进行序列化很容易出错,应该避免。为什么?您正在定义数据 3 次。

  1. XML 模式
  2. 班级
  3. 序列化代码

使用属性,您可以擦洗步骤 3。

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

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

更新

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

于 2013-10-02T12:27:49.013 回答