当我尝试反序列化一个新的 ActiveRecord 对象时为什么会出现这个错误:
[Dev]> YAML.load(Identity.new.to_yaml)
Delayed::DeserializationError: Delayed::DeserializationError
与此同时,这个带有现有 AR 对象的示例按预期工作:
[Dev]> YAML.load(Identity.first.to_yaml)
=> #<Identity id: 1, ...
一些看起来相关的事情,基于对答案的搜索:
我正在使用 ruby 1.9.2p318
、rails 3.1.3
、delayed_job 2.1.4
和我的 YAML::ENGINE.yamler
是 syck
。
我该怎么做才能将新的身份记录序列化为 YAML,然后再反序列化?
更新:我还发现,如果我删除 delayed_job
gem,那么这个简单的示例就可以工作,并且我的 YAML::ENGINE.yamler
现在是 psych
。但是我在我的应用程序中使用了 delayed_job
,所以了解发生了什么仍然很重要
最佳答案
如果你检查 delayed_job 结构,那是因为存在一个名为 serialization/active_record.rb
的文件。
现在,对于使用 syck
(只有 syck 会发生)作为 YAML 引擎的 Ruby,每次 YAML.load
都会调用定义 yaml_new
被调用,如果您从技术上检查该方法,它会尝试使用从对象属性中提取的 id
构建对象
为此
YAML.load(Identity.first.to_yaml)
它在内部做这个
Identity.find(1)
但在你的情况下 Identity.new
因为没有 id
与之相关联所以这会让你反序列化
我认为人们花了这么长时间才回答这个问题的原因是你列出的错误
延迟::反序列化错误:延迟::反序列化错误
因为它确实说明了关于没有 不存在主
键的信息 currently
我相信的原因是this提交可能在您发布问题时或多或少地同时被推送,但也许您仍在机器中使用旧代码的地方没有报告此
ActiveRecord::RecordNotFound, class: #{klass} , primary key: #{val['attributes'][klass.primary_key]}
注意:
它只发生在 syck
测试 pysch
方法根本没有被调用也许它用于向后兼容我猜
关于ruby-on-rails - 从 YAML 加载 ActiveRecord 对象时出现反序列化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056834/