Marshal.load 一个类数组,其中一个不再存在



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

以下是您在 IRB 中模拟我的问题的方法

$ irb
> require 'set'
> tmp = Marshal.dump [Hash, Fixnum, Set]
> => "x04b[bctHashcvFixnumcbSet"
> Marshal.load "x04b[bctHashcvFixnumcbSet"
> => [Hash, Fixnum, Set] - like I want
> exit
$ irb
> Marshal.load "x04b[bctHashcvFixnumcbSet"
> # throws error, but what I want is [Hash, Fixnum], or even [Hash, Fixnum, nil]

我有什么办法可以想象吗?

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

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

牛宝石主页

下面是宝石主页上用牛封送的示例:

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)

最新更新