对于我目前正在开发的应用程序,我发现需要将一些业务对象序列化为多种不同的专有格式。
我正在努力做出最佳解决方案的决定,并希望得到一些意见。
我知道.NET为我们提供了ISerializable
接口,我可以在我的业务对象上实现,但是当我需要序列化为3种不同的格式时,我很难理解这将如何应对? / p>
除此之外,我并不太热衷于让所有序列化特定代码“搞砸”我漂亮的干净业务对象 - 我更愿意将这个责任分配给一个专用对象。当有许多不同的格式时,这似乎也是有意义的,因为序列化选项可以在将来通过简单地扩展基类来扩展,或者在不编辑业务对象本身的情况下进行修改。再说一遍,我宁愿不“重新发明轮子”。
我想知道你在这些案件中的集体经验和意见是什么?
ISerializable
是多种格式的可行选项吗?
或者是更适合该任务的自定义类或服务?
是否有任何设计模式或进一步的框架功能覆盖这个领域?
答案 0 :(得分:1)
您可以使用ISerializable
为每个对象(SerializationInfo
)获取一种通用的数据中间存储形式,然后您可以为该中间类型实现三个单独的处理程序以将它们转换为最后的形式。就个人而言,我当然不希望在单个业务对象中看到三种形式的序列化代码。
根据对象的数量和复杂程度,可能更简单,因为您可以创建自己的接口,每个类必须支持序列化。这样就可以完全实现灵活性,代价是不能使用标准的序列化位。
答案 1 :(得分:1)
自定义序列化.NET方式,完全自定义序列化,只标记类,只标记类和添加一些调整都可用:
自定义序列化在以下情况下非常有用:
readonly
)因此必须通过构造函数反序列化(当然,工厂方法也可以通过调用现有的构造函数来工作)。IEnumerable<T>
上,我不知道是否对于所有这样的接口都会发生这种情况,我很确定它不会发生在二进制序列化中 - 实际上它是一个错误,应该修复,但暂时还有它。)ISerialisable将提供一个抽象(命名的东西进入,命名的东西出来),它反过来用于不同的格式。
如果您需要一种非常特定的格式(例如,以特定模式序列化),那么您可能需要在使用序列化方法时更明确地查看其他接口(例如IXmlSerializable),或忽略.NET提供的序列化技术和滚动自己的方法来生成和解析不同的格式。
在另一个极端,您可以将[Serializable]
属性放在类及其拥有成员的任何类上,这将为您提供默认的序列化行为。
进一步调整可以来自[NonSerialized]
对不应序列化的成员(比如说你有BigObject _big; int _bigID
并通过基于{{1来延迟加载_big
来记忆对_bigID
的访问权限在第一次访问时。在这种情况下,您可以通过将_bigID
标记为非序列化来仅序列化_big
。IDeserializationCallback
允许通过反序列化创建刚刚创建的类时进一步调整
答案 2 :(得分:0)
听起来您需要为要将对象序列化的每种格式都使用自定义序列化程序。正如我在评论中提到的那样,您可以使用相同的对象并使用Json序列化程序进行序列化,它会为您提供该对象的Json表示,使用XML序列化程序对其进行序列化,然后获取XML等。
因此,对于每种格式,您只需要一个自定义序列化程序,可以将其序列化/反序列化为该格式。