C#中的序列化和对象版本控制

如果我想序列化一个对象,我必须使用[Serializable]属性,所有成员变量都将写入该文件。 什么我不知道如何进行版本控制,例如,如果我添加一个新的成员变量(重命名一个变量或只是删除一个变量),然后我打开(反序列化)该文件如何确定对象/文件版本,以便我可以正确设置新成员还是进行某种迁移? 如何确定变量是否在加载期间初始化(由反序列化器忽略)。

我知道有版本容忍方法,我可以用[OptionalField(VersionAdded = 1)]属性标记变量。 如果我打开一个旧文件,框架将忽略这个可选(新变量),它将只是零/ null。 但是,我又如何确定变量是通过加载初始化还是被忽略。

我可以将类/对象版本号写入流中。 使用ISerializable方法并在constructor(SerializationInfo oInfo, StreamingContext context)方法中读取此版本号。 这将告诉我流中的类版本是什么。

但是我预计C#中的流式传输框架已经实现了这种版本控制。 我试图从SerializationInfo获取Assembly版本,但它始终设置为当前版本而不是保存对象时使用的版本。

什么是首选方法? 我在网上发现了很多文章,但我找不到一个解决版本问题的好方法……

任何帮助表示感谢,谢谢,深渊

如果我写的一些内容太明显,请原谅我

首先,拜托! 你必须停止认为你正在序列化一个对象……这是不正确的,因为作为你对象一部分的方法没有被持久化。 你是持久的信息 – 所以..仅限数据。

.NET序列化还序列化包含程序集名称及其版本的对象的类型名称,因此在反序列化时 – 它会将持久化的程序集信息与将与信息一起显示的类型进行比较 – 如果它们不相同,它将会返回exception。

除了版本控制问题 – 并非所有内容都可以如此轻松地序列化…尝试序列化System.Drawing.Color类型,您将开始了解.NET序列化过度简单机制的问题。

除非你打算序列化一些非常简单但没有计划发展的东西,否则我不会使用.NET提供的序列化机制。

重点回到你的问题,你可以在这里阅读版本无知能力: http : //msdn.microsoft.com/en-us/library/ms229752 (v=vs.80) .aspx ,它是为BinaryFormatter提供的。

您还应该检查具有一些不错function的XML序列化,但最大的好处是您获得了一个人类可读的XML,因此即使您的类型版本复杂,您的数据也不会丢失。

但最后,我建议您使用带有entity framework的数据库来保存您的数据或编写您自己的平面文件管理器。虽然EF对于大多数解决方案非常有用,但有时您可能希望更轻松的东西可以保持非常简单。 (我的暗示是我再也看不到.NET序列化可能相关的解决方案了。)

祝这有帮助,祝你好运。