5

当我尝试反序列化新的 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.3delayed_job 2.1.4而我YAML::ENGINE.yamler的 is syck

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

更新:我还发现,如果我删除了delayed_jobgem,那么这个简单的例子确实有效,而我YAML::ENGINE.yamler现在是psych. 但我delayed_job在我的应用程序中使用,所以了解发生了什么仍然很重要

4

1 回答 1

3

那么原因是如果你检查delayed_job结构存在一个名为的文件serialization/active_record.rb

现在对于 Ruby syck(仅 syck 它发生)作为 YAML 引擎,yaml_new每次调用时都会调用定义YAML.load,如果您从技术上检查该方法,它会尝试从数据库中构建对象,并id从对象的属性中提取

所以为此

YAML.load(Identity.first.to_yaml)

它在内部执行此操作

Identity.find(1)

但在你的情况下Identity.new,因为与它没有id关联,所以这会让你反序列化

我认为人们花了这么长时间才回答这个问题的原因是你列出的错误

Delayed::DeserializationError: Delayed::DeserializationError

因为它确实说明了任何关于它当前no primary存在的密钥的信息

我相信这个提交可能的原因是在您发布问题的同时或多或少地被推送,但也许您仍然在您的机器中使用旧代码并没有报告它

ActiveRecord::RecordNotFound, class: #{klass} , primary key: #{val['attributes'][klass.primary_key]} 

笔记 :

它只发生在syck经过测试的情况下pysch,根本没有调用该方法,也许它用于向后兼容我猜

于 2013-08-19T18:54:02.760 回答