这显然提出了通过编排(marshaling)创建的数据文件格式可能与当前 Ruby 应用程序不兼容的潜在问题。另外地,Marshal 版本号不依赖于 Ruby 版本号,因此仅基于 Ruby 版本进行兼容性假设是不安全的。
这种不兼容的可能性意味着我们应该尝试在加载已保存数据之前检查其版本号。但是我们如何获得版本号呢?嵌入式文档再一次提供了线索。它指出:
它提供了这个示例:
好的,让我们在一段完整的代码中尝试这一点。开始…
version_m.rb
打印出:
只有一个问题:当你将数据保存到磁盘上的文件中时, 方法接受 的是IO 或 File 对象,它返回 IO(或 File)对象而不是字符串:
version_error.rb
f = File.open( 'friends.sav', 'w' )
x = Marshal.dump( ["fred", "bert", "mary"], f )
如果你现在尝试获取 x[0]
和 x[1]
的值,你将收到错误消息。从文件加载数据不再具有意义:
这里的两个 语句没有(如我希望)打印出编排(marshaled)数据的主要和次要版本号;事实上,它们打印出了名称,”fred” 和 “bert”,即从数据文件 ‘friends.sav’ 加载到数组 x
中的前两项。
f = File.open('test2.sav')
vMajor = f.getc()
f.close
这里, 方法从输入流读取下一个 8 位字节。我的示例项目 version_m2.rb 给出了一种简单的方法,可以将保存数据的版本号与当前 Marshal 库的版本号进行比较,以确定在尝试重新加载数据之前数据格式是否可能兼容。
version_m2.rb