当我尝试反序列化新的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
,因此了解正在发生的事情仍然很重要
答案 0 :(得分:3)
如果检查delayed_job结构,那么原因就是存在一个名为serialization/active_record.rb
的文件
现在对于带有syck
(仅发生syck)的Ruby作为YAML引擎,每次调用yaml_new
时都会调用define YAML.load
,如果从技术上检查方法,它会尝试使用从对象属性中提取的id
从数据库构建对象
所以对于这个
YAML.load(Identity.first.to_yaml)
它在内部做到这一点
Identity.find(1)
但在您的情况下Identity.new
没有id
与之关联,因此这会引发您的反序列化
我认为人们回答这个问题花了这么长时间的原因是你列出的错误
Delayed::DeserializationError: Delayed::DeserializationError
因为它确实存在任何关于存在no primary
密钥的信息currently
我认为this提交可能的原因是在您发布问题的同时或多或少地推送了但是也许您仍在使用机器中的旧代码但未报告此< / p>
ActiveRecord::RecordNotFound, class: #{klass} , primary key: #{val['attributes'][klass.primary_key]}
仅syck
测试出pysch
该方法根本不会被调用,或许它用于向后兼容我猜