use*_*502 12 .net c# versioning migration serialization
如果我想序列化一个对象,我必须使用[Serializable]属性,所有成员变量都将写入该文件.我不知道如何进行版本控制,例如,如果我添加一个新的成员变量(重命名一个变量或只是删除一个变量),然后打开(反序列化)该文件,我如何确定对象/文件版本,这样才能正确设置新成员还是进行某种迁移?如何确定变量是否在加载期间初始化(由反序列化器忽略).
我知道有版本容忍方法,我可以用[OptionalField(VersionAdded = 1)]属性标记变量.如果我打开一个旧文件,框架将忽略这个可选(新变量),它将只是零/ null.但是,我如何确定变量是通过加载初始化还是被忽略.
我可以将类/对象版本号写入流中.使用ISerializable方法并在constructor(SerializationInfo oInfo, StreamingContext context)方法中读取此版本号.这将告诉我流中的类版本是什么.
但是我预计C#中的流式传输框架已经实现了这种版本控制.我试图从中获取程序集版本,SerializationInfo但它始终设置为当前版本而不是保存对象时使用的版本.
什么是首选方法?我在网上发现了很多文章,但我找不到一个很好的解决方案来解决版本问题......
任何帮助表示感谢,谢谢,深渊
如果我写的有些内容太明显了,请原谅我,
首先请您!你必须停止认为你正在序列化一个对象...这是完全错误的,因为作为你的对象一部分的方法没有被持久化。您正在保存信息 - 等等......仅数据。
.NET 序列化还会序列化包含程序集名称及其版本的对象的类型名称,因此当您反序列化时 - 它将保留的程序集信息与将用该信息显示的类型进行比较 - 如果它们不相同,它将返回异常。
除了版本控制问题 - 并非所有内容都可以如此轻松地序列化。尝试序列化 System.Drawing.Color 类型,您将开始理解 .NET 序列化机制过于简单的问题。
除非您打算序列化一些非常简单且没有发展计划的东西,否则我不会使用 .NET 提供的序列化机制。
将焦点回到您的问题,您可以在此处阅读有关版本控制无知能力的信息: http://msdn.microsoft.com/en-us/library/ms229752 (v=vs.80).aspx,这是为 BinaryFormatter 提供的。
您还应该检查 XML 序列化,它具有一些不错的功能,但最大的好处是您可以获得人类可读的 XML,因此即使您的类型版本控制复杂化,您的数据也永远不会丢失。
但最后,我建议您使用带有实体框架的数据库来保存数据,或者编写自己的平面文件管理器。虽然 EF 对于大多数解决方案都非常有用,但有时您可能需要更轻的东西来保存非常简单的东西。(我的意思是我再也看不到与 .NET 序列化相关的解决方案了。)
我希望这有帮助,祝你好运。