我们有一个相当大的对象图,需要以很多不同的方式(模式)进行序列化和反序列化。在某些模式中,我们希望某些属性被反序列化,而在某些模式中我们不需要。在未来的模式中,可能还有更多的属性选项,而不是是或否。现在问题是我们如何实现这些模式。
方法A(使用反序列化构造函数和ISerializable.GetObjectData):
如果我们让图形的每个对象使用反序列化构造函数序列化自己,我们会为所有不同的反序列化模式获得很多开关。然而,这种方法的优点是所有反序列化逻辑都在一个位置,如果我们添加新属性,我们只需要修改ISerializable.GetObjectData和反序列化构造函数。另一个优点是该对象可能会考虑可能公开暴露的内部状态。最重要的缺点是我们的数据对象本身需要了解所有可能的序列化模式。如果我们需要一个新模式,我们需要修改数据对象。
方法B(反序列化工厂类/方法):
另一种方法是对每个在外部进行序列化和反序列化的模式进行一些反序列化工厂类/方法(例如GraphSerializer.SerializeObjectTypeX(ObjectTypeX objectToSerialze)。这里的优点是每当我们想要一个新模式时我们只是添加一个新的工厂类/方法,我们的Dataobject不会混淆所有引入的序列化模式。这里的主要缺点是我必须反复为所有不同的模式编写相同的序列化代码。如果两种模式只有一两个属性不同,但我必须再次为整个图形实现完整的逻辑。当我向数据对象添加新属性时,我需要更新所有工厂类。
所以我想知道这个恕我直言的一般问题是否有更好的方法。甚至是.NET中的最佳实践?或许我只是从错误的角度来看待整个事情?
答案 0 :(得分:2)
为每种模式创建单独的序列化程序类(a-la XmlSerializer),继承或封装以避免重复。 使用属性上的属性来标记它们是否以及如何在特定模式下序列化