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

本文关键字:对象 版本控制 序列化 | 更新日期: 2023-09-27 18:05:46

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

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

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

然而,我期望这种版本控制已经在c#的流框架中实现了。我试图从SerializationInfo获得汇编版本,但它总是被设置为当前版本,而不是对象保存时使用的版本。

首选的方法是什么?我在网上找到了很多文章,但我找不到一个很好的解决方案来解决这个问题。

任何帮助都是感激的谢谢,深渊

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

如果我写得太明显,请原谅我,

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

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

除了版本问题——不是所有的东西都可以这么容易地序列化。尝试序列化System.Drawing.Color类型,你就会开始理解。net序列化过于简单的机制所带来的问题。

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

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

你还应该检查XML序列化,它有一些很好的功能,但最大的好处是你得到一个人类可读的XML,所以即使你有复杂的类型版本控制,你的数据也不会丢失。

但最后,我建议你要么使用数据库与实体框架来持久化你的数据,要么编写自己的平面文件管理器。虽然EF对于大多数解决方案都非常好,但有时您可能需要更轻松的东西来持久化非常简单的东西。(我的意思是,我再也看不到。net序列化可以相关的解决方案了。)

祝你好运。