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

标签 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,所以了解发生了什么仍然很重要

最佳答案

如果你检查 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/

相关文章:

ruby-on-rails - 如何使用带有变体的 Imagemagick 命令行选项创建裁剪和居中的图像?

ruby-on-rails - 'starts_with' 和 'start_with' 在 Ruby 中有相同的功能吗?

ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error?

ruby-on-rails - 重复授权给 Doorkeeper 错误 422(资源所有者凭据流)

mysql - 无法使用 MySQL 在 Windows 上运行 Rails 服务器

ruby-on-rails - 添加新列后更新脚手架 View

ruby-on-rails - 将 Rails 代码放入 jQuery

ruby-on-rails - 何时在 Rails 中使用 "has_many :through"关系?

ruby-on-rails-3 - Rails 3 RESTful 身份验证 - 未初始化常量 ApplicationController::AuthenticatedSystem

ruby - 无法重新索引太阳黑子。 "Solr Response: Bad Request"