我使用Marshal
类来序列化Ruby对象,使用函数:dump()
和load()
一切正常,但是当传递与任何序列化数据无关的值时, load()
函数返回预期和逻辑错误:
incompatible marshal file format (can't be read)
format version 4.8 required; 45.45 given
我需要的是在加载之前检查这些数据是否已经序列化。我的目标是避免这个错误并做其他事情。
答案 0 :(得分:0)
确定。我遇到了非常类似的问题,根据这篇文章http://lists.danga.com/pipermail/memcached/2007-December/006062.html中的提示,我发现当您尝试加载未在或<之前编组的数据时会发生这种情况/ em>数据存储不正确(例如,不在数据库中的二进制字段中)。
在我的案例中,我在数据库中使用了 text 类型而不是 binary 字段,并且编组数据被破坏了。
将列的类型从文本更改为二进制有助于。遗憾的是,您无法转换旧的(损坏的)数据,因此您必须删除该列并将其再次创建为二进制文件。
答案 1 :(得分:-1)
也许只是从错误中解救?
begin
Marshal.load("foobar")
rescue TypeError
# not a marshalled object, do something else
puts "warning: could not load ..."
end
答案 2 :(得分:-1)
我已经应用了Padde方式,但是使用了一个为我完成工作的函数并让我回到对象中,可以是preexistent,也可以是new,如下所示:
def get_serialized_banner
begin
@banner_obj = Marshal.load(self.path)
rescue TypeError
self.path = Marshal.dump(Banner.new())
self.save
@banner_obj = Marshal.load(self.path)
end
return @banner_obj
end