将自定义序列化实现为多种格式:ISerializable还是自定义解决方案?

时间:2010-08-20 09:35:09

标签: c# .net serialization

对于我目前正在开发的应用程序,我发现需要将一些业务对象序列化为多种不同的专有格式。

我正在努力做出最佳解决方案的决定,并希望得到一些意见。

我知道.NET为我们提供了ISerializable接口,我可以在我的业务对象上实现,但是当我需要序列化为3种不同的格式时,我很难理解这将如何应对? / p>

除此之外,我并不太热衷于让所有序列化特定代码“搞砸”我漂亮的干净业务对象 - 我更愿意将这个责任分配给一个专用对象。当有许多不同的格式时,这似乎也是有意义的,因为序列化选项可以在将来通过简单地扩展基类来扩展,或者在不编辑业务对象本身的情况下进行修改。再说一遍,我宁愿不“重新发明轮子”。

我想知道你在这些案件中的集体经验和意见是什么?

ISerializable是多种格式的可行选项吗? 或者是更适合该任务的自定义类或服务? 是否有任何设计模式或进一步的框架功能覆盖这个领域?

3 个答案:

答案 0 :(得分:1)

您可以使用ISerializable为每个对象(SerializationInfo)获取一种通用的数据中间存储形式,然后您可以为该中间类型实现三个单独的处理程序以将它们转换为最后的形式。就个人而言,我当然不希望在单个业务对象中看到三种形式的序列化代码。

根据对象的数量和复杂程度,可能更简单,因为您可以创建自己的接口,每个类必须支持序列化。这样就可以完全实现灵活性,代价是不能使用标准的序列化位。

答案 1 :(得分:1)

自定义序列化.NET方式,完全自定义序列化,只标记类,只标记类和添加一些调整都可用:

自定义序列化在以下情况下非常有用:

  1. 一个对象是完全或部分不可变的(一个或多个成员是readonly)因此必须通过构造函数反序列化(当然,工厂方法也可以通过调用现有的构造函数来工作)。
  2. 图表很复杂,但是大部分内容都可以通过系统知识进行简化(例如“我知道我不需要完全序列化该成员,我可以序列化足够的信息来创建反序列化的新实例”。
  3. 通用类以特定的方式使用(好吧,它们总是......),并且对这些细节的了解可以降低图的复杂性。
  4. 你正在进行一个继承或实现模板类或抽象参数化的类的XMLSeriazation(这在映射图时会进入无限循环,至少在IEnumerable<T>上,我不知道是否对于所有这样的接口都会发生这种情况,我很确定它不会发生在二进制序列化中 - 实际上它是一个错误,应该修复,但暂时还有它。)
  5. 您需要保证向后和/或向前兼容该类的更高版本(由您决定是否有效,但如果您不在“那里”,则无法实现。)
  6. 您有一个无法编辑的类的成员(框架或第三部分提供的)不可序列化,因此您需要提供自己的序列化方法。
  7. ISerialisable将提供一个抽象(命名的东西进入,命名的东西出来),它反过来用于不同的格式。

    如果您需要一种非常特定的格式(例如,以特定模式序列化),那么您可能需要在使用序列化方法时更明确地查看其他接口(例如IXmlSerializable),或忽略.NET提供的序列化技术和滚动自己的方法来生成和解析不同的格式。

    在另一个极端,您可以将[Serializable]属性放在类及其拥有成员的任何类上,这将为您提供默认的序列化行为。

    进一步调整可以来自[NonSerialized]对不应序列化的成员(比如说你有BigObject _big; int _bigID并通过基于{{1来延迟加载_big来记忆对_bigID的访问权限在第一次访问时。在这种情况下,您可以通过将_bigID标记为非序列化来仅序列化_bigIDeserializationCallback允许通过反序列化创建刚刚创建的类时进一步调整

答案 2 :(得分:0)

听起来您需要为要将对象序列化的每种格式都使用自定义序列化程序。正如我在评论中提到的那样,您可以使用相同的对象并使用Json序列化程序进行序列化,它会为您提供该对象的Json表示,使用XML序列化程序对其进行序列化,然后获取XML等。

因此,对于每种格式,您只需要一个自定义序列化程序,可以将其序列化/反序列化为该格式。

相关问题