我使用BinaryFormatter序列化一个类。当我在文本编辑器中打开创建的文件时,我可以看到,在开始时,有些属性(如名称空间,版本,cultureInfo,...)被写入其中。如何在再次反序列化此文件时读取此版本字符串? 提前谢谢!反序列化二进制对象时获取版本
回答
你应该看看这个文章在MSDN:
的BinaryFormatter的有两个属性:Binder
和SurrogateSelector
。
通过这些,您可以干涉序列化/反序列化过程并访问这些信息。有关它的更多信息可以在上面的文章中找到。
您可能应该像读普通文件一样读取该部分(读取和检查字节)。
但是,为什么你会对这部分感兴趣?如果你是这样,最好是以正常的方式添加你自己的版本属性作为其他待被序列化的数据,并以正常的方式(像所有其他数据一样通过反序列化)检索它。
备注到您的评论:
- 如果这是第一次,你可以写一个“更新”,其内容为旧文件,并用新的(所以更改枚举值),把它转换。对于新的序列化对象,添加一个版本(总是,并为您发布的每个版本进行更新)。这种情况下,你可以随时改变。通过创建这样的更新功能,您始终可以将旧版本的数据更改为新版本。在这种情况下(因为你没有版本),你可以认为它是旧版本。
我做了一件非常愚蠢的事情:在序列化类中有一个枚举。我改变了中间添加一些条目的枚举。现在,当我加载一个旧文件时,旧的枚举int值与当前的值不兼容。读出版本后,我希望能够使用“旧”枚举或“新”枚举来依赖版本。但是,也许你有更好的主意? – Holger2012 2014-08-27 09:57:18
我将编辑这个答案。 – 2014-08-27 10:01:46
好的,但是如何检测它是旧的还是新的文件? – Holger2012 2014-08-27 10:55:25
- 1. 二进制反序列化:获取对象数据
- 2. 不同程序集版本的二进制反序列化
- 3. C#对象二进制序列化
- 4. 将对象二进制反序列化为XML?
- 5. 从二进制文件反序列化对象
- 6. 二进制反序列化的通用对象
- 7. 使用C#进行二进制Plist序列化/反序列化#
- 8. 二进制反序列化的泛型
- 9. 重构后对旧版(二进制)文件进行反序列化
- 10. 将二进制数据反序列化为对象时出现StackOverflowError
- 11. C# - XML反序列化与二进制反序列化与二元期权+ Deflate
- 12. Java:序列化/反序列化到XML /而不是二进制
- 13. Parallel.ForEach中的二进制序列化/反序列化(BinaryFormatter)
- 14. 谷物二进制归档序列化/反序列化
- 15. 在Flex中反序列化二进制对象时,对象初始化是如何发生的?
- 16. DataSerializable - 对二维数组进行序列化和反序列化
- 17. 对二进制类文件的内容进行反序列化时的ClassNotFoundException
- 18. 对象反序列化 - 从序列化对象中取回int数组对象
- 19. 跨版本序列化和反序列化.net对象的最佳实践
- 20. 反序列化序列化对象
- 21. 反序列化对象本身
- 22. (java)ObjectInputStream反序列化对象的错误版本
- 23. 反序列化到对象
- 24. 反序列化到对象
- 25. Memcached对象反序列化
- 26. JSON对象反序列化
- 27. 反序列化JSON对象
- 28. 反序列化对象
- 29. 如何使用Compact Framework二进制序列化对象?
- 30. Java - 修改二进制序列化对象的serialVersionUID
完美,与Binder和BindToType函数我能够找出作为参数提交的前缀字符串。在那里我可以解析出版本。感谢您的帮助! – Holger2012 2014-08-27 11:58:25