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