3

我们有一个相当大的对象图,需要以许多不同的方式(模式)进行序列化和反序列化。在某些模式下,我们希望对某些属性进行反序列化,而在某些模式下则不需要。在未来的模式中,属性的选项可能比 yes 或 no 更多。现在的问题是我们如何实现这些模式。

方法 A(使用反序列化构造函数和 ISerializable.GetObjectData):

如果我们让图的每个对象使用反序列化构造函数来序列化自己,我们会为所有不同的反序列化模式获得很多开关。然而,这种方法的优点是所有反序列化逻辑都在一个位置,如果我们添加新属性,我们只需要修改 ISerializable.GetObjectData 和反序列化构造函数。另一个优点是对象可能会考虑可能公开暴露的内部状态。最重要的缺点是我们数据对象本身需要了解所有可能的序列化模式。如果我们需要一个新模式,我们需要修改数据对象。

方法 B(反序列化工厂类/方法):

另一种方法是为在外部进行序列化和反序列化的每种模式(例如 GraphSerializer.SerializeObjectTypeX(ObjectTypeX objectToSerialze))设置某种反序列化工厂类/方法。这里的优点是,每当我们想要一个新模式时,我们只需添加一个新模式工厂类/方法和我们的数据对象不会因为引入的所有序列化模式而变得混乱。这里的主要缺点是我必须为所有不同的模式一遍又一遍地编写相同的序列化代码。如果两种模式只是在一两个属性,但我必须再次为整个图实现完整的逻辑。当我向数据对象添加新属性时,我需要更新所有工厂类。

所以我想知道是否有更好的方法来解决这个恕我直言的一般问题。甚至是 .NET 中的最佳实践?或者,也许我只是从错误的角度看待整个事情?

4

1 回答 1

2

为每种模式创建单独的序列化程序类(a-la XmlSerializer),继承或封装以避免重复。使用属性上的属性来标记它们是否以及如何在特定模式下序列化

于 2008-09-13T07:57:54.157 回答