我尝试在执行程序期间保存并加载矩阵状态(使用Matrix
),其中dump
和load
来自Marshal
}。我可以序列化矩阵并得到一个~275 KB的文件,但是当我尝试将其作为字符串加载回来将其反序列化为一个对象时,Ruby只给我一个开头。
# when I want to save
mat_dump = Marshal.dump(@mat) # serialize object - OK
File.open('mat_save', 'w') {|f| f.write(mat_dump)} # write String to file - OK
# somewhere else in the code
mat_dump = File.read('mat_save') # read String from file - only reads like 5%
@mat = Marshal.load(mat_dump) # deserialize object - "ArgumentError: marshal data too short"
我尝试更改load
的参数,但没有找到任何不会导致错误的内容。
如何将整个文件加载到内存中?如果我可以通过块读取文件块,然后循环将其存储在String中然后反序列化,它也会工作。该文件基本上有一个大行,所以我甚至不能说我会逐行读取它,问题保持不变。
我看到了一些关于这个主题的问题:
但他们似乎都找不到我想要的答案。
答案 0 :(得分:1)
Marshal
是二进制格式,因此您需要以二进制模式进行读写。最简单的方法是使用IO.binread/write
。
...
IO.binwrite('mat_save', mat_dump)
...
mat_dump = IO.binread('mat_save')
@mat = Marshal.load(mat_dump)
请记住,Marshaling依赖于Ruby版本。它与其他Ruby版本只有compatible under specific circumstances。所以记住这一点:
在正常使用中,编组只能加载使用相同主版本号和相同或更低版本号编写的数据。