Marshal类,有没有办法查找数据是否已经序列化?

时间:2012-11-06 15:34:33

标签: ruby serialization

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

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

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

3 个答案:

答案 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