- レール:3.0.3
- Ruby:1.9.2
YAML.load
に属するクラスが逆シリアル化プロセスに必要ないため、またはMarshal.load
破損したオブジェクトを使用して非常に単純なオブジェクトを逆シリアル化しようとしています。
例:
# app/models/my_model.rb
class MyModel
attr_accessor :id
end
# test/unit/serializing_test.rb
require 'test_helper'
class SerializingTest < Test::Unit::TestCase
def test_yaml_serialize_structure
my_model = MyModel.new
my_model.id = 'my model'
File.open( "#{Rails.root}/tmp/object.yml" , 'w' ) do |f|
YAML::dump(my_model, f)
end
end
def test_yaml_deserialize_structure
object = YAML.load_file "#{Rails.root}/tmp/object.yml"
assert( object.instance_of? MyModel )
assert_equal( 'my model', object.id )
end
end
このコードを使用すると、このシェルコンソールセッションをエラーなしで実行できます。
$ ruby -Itest test/unit/serializing_test.rb -n test_yaml_serialize_structure
$ ruby -Itest test/unit/serializing_test.rb -n test_yaml_deserialize_structure
しかし、Railsコンソールから逆シリアル化呼び出しを実行すると、クラスが必要になることがないため、オブジェクトは適切に逆シリアル化されません。
$ rails c
ruby-1.9.2-p0 > object = YAML.load_file "#{Rails.root}/tmp/object.yml"
=> #<Syck::Object:0x0000010322ea30 @class="MyModel", @ivars={"id"=>"my model"}>
唯一の問題は、クラスが必要ないことです。手動で必要な場合は、すべてが機能するためです。
ruby-1.9.2-p0 > require "#{Rails.root}/app/models/my_model"
=> ["MyModel"]
ruby-1.9.2-p0 > object = YAML.load_file "#{Rails.root}/tmp/object.yml"
=> #<MyModel:0x0000010320c8e0 @id="my model">
YAMLの例のみを示しましたが、Marshalの場合もほとんど同じです。
また、私はRailsコンソールで問題を再現していますが、この問題は、アプリケーションへの通常の要求で私を夢中にさせていたとも言います。
したがって、問題は次のとおりです。すべてのクラスを手動で要求せずに、Railsでオブジェクトを逆シリアル化するにはどうすればよいですか?
ありがとう
f。