2017-05-31 66 views
0

我想保存和加载矩阵的状态我的程序与功能dumpMarshalload执行过程中(使用Matrix)。我可以序列化的矩阵,并得到了〜275 KB的文件,但是当我尝试加载回为一个字符串将其反序列化为一个对象,红宝石给我只有它的开始。如何读取大文件到一个字符串

# 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,但没有发现任何东西,它不会导致错误。

我怎样才能加载整个文件到内存?如果我能块读取的文件块,然后循环将其存储在字符串,然后反序列化,它会工作过。该文件基本上有一个大的线,所以我甚至不能说我会逐行阅读它,问题保持不变。

我看到了有关该主题的一些问题:

但没有人似乎有我的答案寻找。

+1

你能以二进制方式读它?也许包含停止文件读取(EOF)的奇怪二进制数据。见例如https://stackoverflow.com/questions/130948/ruby-convert-file-to-string – knut

回答

1

Marshal是二进制格式,所以你需要阅读和以二进制方式写。最简单的方法是使用IO.binread/write

... 
IO.binwrite('mat_save', mat_dump) 
... 
mat_dump = IO.binread('mat_save') 
@mat = Marshal.load(mat_dump) 

请记住,Marshaling是Ruby版本相关的。它只有compatible under specific circumstances与其他Ruby版本。因此请记住:

在正常使用中,封送处理只能加载使用相同主要版本号和相同或较小次版本号编写的数据。

相关问题