0

Rails モデルの 1 つで、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 よりも優れた代替手段は、Ruby オブジェクトを XML としてシリアル化する Ox のようなものを使用することです。おそらく、はるかに簡単に作業できます。

オックスジェム ホームページ

以下は、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 に答える