gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:54 26 4
gpt4 key购买 nike

当我尝试反序列化一个新的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com