在我的一个轨道模型中,我保存了一个元帅序列化的类数组。 如果我更改其中一个类的名称,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)