2

我正在使用serialize :my_array, Array并且serialize :my_hash, Hash非常高兴地将设置和数组方便地存储在数据库中。

我可以以这种方式使用哪些其他对象?例如,我知道我可以使用Structand OpenStruct,但是我怎么知道一个对象是否可以使用 ActiveRecord 以这种方式序列化?例如,我怎么知道我是否可以以这种方式使用该类Set(应该被称为UniqArray,请注意)?

4

2 回答 2

2

AR 中的序列化使用 Psych 将实例转储到 yaml 字符串中。

反过来,Psych 知道如何序列化从 Object 继承的所有对象(它几乎是 Ruby 中的所有对象)。

在一般情况下,Psych 获取对象的所有实例变量并将其转储为 yaml 字段。

转储几个类也有特殊情况,如Array, Class, Date, DateTime, Exception, FalseClass, Float, Hash, Integer, Module, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , NilClass, Range, Rational, Regexp, String, Struct, Symbol, Time,TrueClass

例如,如果我们有class UniqArray < Set, 并且实例UniqArray.new([1,2,3])转储的字符串将是"--- !ruby/object:UniqArray\nhash:\n 1: true\n 2: true\n 3: true\n"hash实现集合存储的实例变量名称在哪里)

于 2013-10-06T07:46:56.503 回答
2

这段代码确定了 Rails 方法中序列化的编码器serialize

 if [:load, :dump].all? { |x| class_name.respond_to?(x) }
   class_name
 else
   Coders::YAMLColumn.new(class_name)
 end

简而言之:如果 a本身具有方法和 ,Object则可以序列化。或者如果可以和. 以这种方式检查:ObjectloaddumpYAMLloaddumpObject

object == YAML.load(YAML.dump(object))  # with require 'yaml' in irb
于 2013-10-06T07:38:50.180 回答