【问题标题】:Non-intrusive XML Serialization techniques?非侵入式 XML 序列化技术?
【发布时间】:2013-10-02 20:52:51
【问题描述】:

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

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

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

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

有没有一种理智的方法来做我所要求的事情,还是我应该硬着头皮让我的对象识别 xml?

【问题讨论】:

  • 如果您想要性能,XML 不适合您。

标签: c# .net xml


【解决方案1】:

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

  1. XML 架构
  2. 序列化代码

使用属性,您可以清理第 3 步。

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

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

更新

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

【讨论】:

  • 这可能只是我的一个小缺点,但我从来没有热衷于用属性来装饰对象。它弄脏了您的代码库(恕我直言),并且仍然有效地将您的模型与您的序列化联系起来,这是我试图避免的。
  • @David 过去这对您来说是个问题吗?我正在努力理解与模式绑定会导致问题的情况。您是否担心版本控制?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多