2

我正在使用Marshal类来序列化 Ruby 对象,使用函数:dump()并且load()一切正常,但是当传递与任何序列化数据无关的值时,load()函数返回预期的逻辑错误:

incompatible marshal file format (can't be read)
format version 4.8 required; 45.45 given

我需要的是在加载之前检查这些数据是否已经序列化。我的目标是避免这个错误并做其他事情。

4

3 回答 3

0

行。我遇到了非常相似的问题,根据这篇文章http://lists.danga.com/pipermail/memcached/2007-December/006062.html的提示,我发现当你尝试加载之前未编组的数据数据存储不当(例如,不在数据库的二进制字段中)。

在我的情况下,我在数据库中使用文本类型而不是二进制字段,并且编组数据被破坏了。

将列类型从文本更改为二进制有帮助。不幸的是,您无法转换旧的(损坏的)数据,因此您必须删除该列并再次将其创建为二进制。

于 2014-08-01T08:57:49.867 回答
-1

也许只是从错误中拯救?

begin
  Marshal.load("foobar")
rescue TypeError
  # not a marshalled object, do something else
  puts "warning: could not load ..."
end
于 2012-11-06T16:07:05.110 回答
-1

我已经应用了 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
于 2012-11-07T00:02:25.677 回答