gpt4 book ai didi

ruby-on-rails - Rails 不会在反序列化 YAML/Marshal 对象时加载类

转载 作者:行者123 更新时间:2023-12-01 21:34:35 25 4
gpt4 key购买 nike

  • rails :3.0.3
  • ruby :1.9.2

尝试使用 YAML.loadMarshal.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

使用此代码,我们可以运行此 shell 控制台 session ,不会出现任何错误:

$ 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.

最佳答案

好吧,在阅读了 @tadman 以及我在西类牙 ror 邮件列表 [1] 中收到的一堆答案之后,我收集了一些当您必须处理 Ruby 反序列化和类时的热门提示在 Rails 中加载:

超快速解决方案

在您的development.rb中使用config.cache_classes = true,但您将失去类自动刷新功能。

更好的解决方案

需要所有要反序列化的类,但不是使用 require 而是使用 require_dependency[2],因此在开发环境中,类 auto -刷新将继续工作。

优雅的解决方案

猴子修补YAMLMarshal gem,告诉它们在找到要反序列化的未定义类时调用require_dependency

并且@Xavi向我发送了猴子补丁Marshal的提议(他说他在广播中写了它,并且没有经过测试,所以在你自己的中使用它风险)[3]

关于ruby-on-rails - Rails 不会在反序列化 YAML/Marshal 对象时加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com