Ruby反序列化YAML

时间:2011-07-29 18:56:43

标签: ruby serialization yaml deserialization

我正在使用DelayedJob,我需要覆盖从YAML反序列化对象时我正在使用的思想的方法:self.yaml_new(在{{1}中定义})

我的印象是,当YAML对某些数据进行反序列化时,它会在该数据类型的类上调用delayed/serialization/active_record方法

DJ的yaml_new方法使用传入的内容

从数据库中获取对象

我无法使用自己的类实现此行为。当我在一个类上设置yaml_new方法并在序列化实例上尝试self.yaml_new时,它似乎不会调用YAML.load所以我显然必须弄错。

这种方法的用途是什么?

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

我认为yaml_new是一个钩子方法,当找到某个类型的对象时,如果该方法存在于该类中,则会调用该方法。但我再也无法让它发挥作用。以下是一个示例:

yaml_new

更新

因此,在我的Rails应用程序中玩游戏后,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 实际上从yaml_new调用了。我有一个文件就像这样:

YAML.load

除了我正在记录动作之外,这正是DJ所做的。

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

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

那么我在Rails应用程序之外做错了什么?有没有其他方法让这个方法触发?我问,因为我试图在我自己的gem中测试它并且YAML.load Contact.first.to_yaml # => yaml_new!!! 方法没有触发,所以我的测试失败了,但它确实在Rails中工作

1 个答案:

答案 0 :(得分:0)

您需要添加类似

的内容
yaml_as "tag:ruby.yaml.org,2002:B"

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

  

将taguri 标记添加到类中,在转储或加载类时使用   在YAML。有关键入和输入的详细信息,请参阅YAML :: tag_class   taguris。