从YAML加载ActiveRecord对象时出现反序列化错误

时间:2012-08-21 14:15:47

标签: ruby-on-rails ruby ruby-on-rails-3 yaml delayed-job

当我尝试反序列化新的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.2p318rails 3.1.3delayed_job 2.1.4而我的YAML::ENGINE.yamlersyck

我能做些什么才能将新的身份记录序列化为YAML,然后再反序列化呢?

更新:我还发现,如果我删除了delayed_job gem,那么这个简单的示例就可以了,我的YAML::ENGINE.yamler现在是psych。但我在我的应用中使用了delayed_job,因此了解正在发生的事情仍然很重要

1 个答案:

答案 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该方法根本不会被调用,或许它用于向后兼容我猜