我正在使用serialize :my_array, Array并且serialize :my_hash, Hash非常高兴地将设置和数组方便地存储在数据库中。
我可以以这种方式使用哪些其他对象?例如,我知道我可以使用Structand OpenStruct,但是我怎么知道一个对象是否可以使用 ActiveRecord 以这种方式序列化?例如,我怎么知道我是否可以以这种方式使用该类Set(应该被称为UniqArray,请注意)?
我正在使用serialize :my_array, Array并且serialize :my_hash, Hash非常高兴地将设置和数组方便地存储在数据库中。
我可以以这种方式使用哪些其他对象?例如,我知道我可以使用Structand OpenStruct,但是我怎么知道一个对象是否可以使用 ActiveRecord 以这种方式序列化?例如,我怎么知道我是否可以以这种方式使用该类Set(应该被称为UniqArray,请注意)?
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实现集合存储的实例变量名称在哪里)
这段代码确定了 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