0

在我的一个 Rails 模型中,我保存了一个 Marshal 序列化的类数组。如果我更改其中一个类的名称,Marshal 将不再能够反序列化数组。有没有办法获得数组中未更改的部分?

以下是如何在 IRB 中模拟我的问题

$ irb
> require 'set'
> tmp = Marshal.dump [Hash, Fixnum, Set]
> => "\x04\b[\bc\tHashc\vFixnumc\bSet"
> Marshal.load "\x04\b[\bc\tHashc\vFixnumc\bSet"
> => [Hash, Fixnum, Set] - like I want
> exit

$ irb
> Marshal.load "\x04\b[\bc\tHashc\vFixnumc\bSet"
> # throws error, but what I want is [Hash, Fixnum], or even [Hash, Fixnum, nil]

有什么办法可以让我做到这一点?

4

1 回答 1

0

在您的示例中,require 'set'当您跳回irb. 我对此进行了测试,如果您这样做,marshal 将正确反序列化数组。

附带说明一下,比 Marshal 更好的选择是使用像 Ox 这样的东西,它将 Ruby 对象序列化为 XML。使用它可能会容易得多。

牛宝石主页

下面是 gem 主页上使用 Ox 编组的示例:

require 'ox'

class Sample
  attr_accessor :a, :b, :c

  def initialize(a, b, c)
    @a = a
    @b = b
    @c = c
  end
end

# Create Object
obj = Sample.new(1, "bee", ['x', :y, 7.0])
# Now dump the Object to an XML String.
xml = Ox.dump(obj)
# Convert the object back into a Sample Object.
obj2 = Ox.parse_obj(xml)
于 2012-09-23T03:22:19.103 回答