【发布时间】:2017-11-01 16:08:26
【问题描述】:
我正在尝试使用来自Marshal 的函数dump 和load 在执行我的程序期间保存和加载矩阵的状态(使用Matrix)。我可以序列化矩阵并获得约 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 的参数,但尚未找到不会导致错误的任何内容。
如何将整个文件加载到内存中?如果我可以逐块读取文件,然后循环将其存储在字符串中然后反序列化,它也可以工作。该文件基本上只有一大行,所以我什至不能说我会逐行阅读,问题仍然存在。
我看到了一些关于这个话题的问题:
- “Ruby serialize array and deserialize back”
- “What's a reasonable way to read an entire text file as a single string?”
- “How to read whole file in Ruby?”
但他们似乎都没有我正在寻找的答案。
【问题讨论】:
-
你能用二进制模式读吗?可能包含停止文件读取(EOF)的奇怪二进制数据。参见例如stackoverflow.com/questions/130948/ruby-convert-file-to-string
标签: ruby serialization io