Ruby 反序列化 YAML

标签 ruby serialization yaml deserialization

我正在使用 DelayedJob,我需要覆盖一个我认为在从 YAML 反序列化对象时使用的方法:self.yaml_new(定义在在 delayed/serialization/active_record)

我的印象是,当YAML反序列化一些数据时,它会调用该数据类型的类的yaml_new方法

DJ 的 yaml_new 方法使用传入的 id 从数据库中获取对象

我无法通过自己的类(class)实现此行为。当我在类上设置 self.yaml_new 方法并尝试在序列化实例上 YAML.load 时,它似乎没有调用 yaml_new 所以我肯定是弄错了。

那么这个方法有什么用呢?

搜索 yaml_new 不会产生太多(只是其他人使用它的 API 文档)。所以我想知道这个方法到底是什么。

我认为 yaml_new 将是某个钩子(Hook)方法,当发现某个类型的对象时调用该方法(如果类中存在该方法)。但我又无法让它发挥作用。下面是一个示例:

class B
  def self.yaml_new(klass, tag, val)
    puts "I'm in yaml new!"
  end
end

b = B.new
YAML.load b.to_yaml    # expected "I'm in yaml new!" got nothing

更新

所以在我的 Rails 应用程序中试玩之后,yaml_new 确实实际上是从 YAML.load 调用的。我有一个这样的文件:

module ActiveRecord
  class Base

    def self.yaml_new(klass, tag, val)
      puts "\n\n yaml_new!!!\n\n"
      klass.find(val['attributes']['id'])
    rescue ActiveRecord::RecordNotFound
      raise Delayed::DeserializationError
    end

    def to_yaml_properties
      ['@attributes', '@database']    # add in database attribute for serialization
    end

  end
end

这正是 DJ 所做的,只是我正在记录操作。

YAML.load Contact.first.to_yaml
# => yaml_new!!!

我实际上得到了记录的输出!

那么我在 Rails 应用程序之外做错了什么?还有其他方法可以触发此方法吗?我问是因为我试图在我自己的 gem 中测试它并且 yaml_new 方法没有触发,所以我的测试失败了,但它确实在 Rails 中工作

最佳答案

你需要添加类似的东西

yaml_as "tag:ruby.yaml.org,2002:B"

self.yaml_new 方法的定义之前。根据yaml/tag.rb中的注释,yaml_as:

Adds a taguri tag to a class, used when dumping or loading the class in YAML. See YAML::tag_class for detailed information on typing and taguris.

关于Ruby 反序列化 YAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877712/

相关文章:

java - 从 Java 创 build 备驱动程序包

php - 无法从数据库检索序列化数据

yaml - CloudFormation YAML 状态机 : INVALID_JSON_DESCRIPTION for unrecognized token

mysql - 尝试使用 Ruby 2 在 Windows 8 上安装 mysql2 gem

ruby - method= 具有多个参数

ruby - private、protected 和 public 的范围

amazon-web-services - 如何处理在 AWS 上从 CloudFormation 模板创建失败的错误?

ruby-on-rails - 更新包含对象的 ruby​​ 数组

java - 将 ArrayList 保存到文本文件时出现 NotSerializedException

kubernetes - 找到哪个 yaml 文件用于任何 kubernetes 资源?