我正在使用serialize :my_array, Array
并且serialize :my_hash, Hash
非常高兴地将设置和数组方便地存储在数据库中。
我可以以这种方式使用哪些其他对象?例如,我知道我可以使用Struct
and OpenStruct
,但是我怎么知道一个对象是否可以使用 ActiveRecord 以这种方式序列化?例如,我怎么知道我是否可以以这种方式使用该类Set
(应该被称为UniqArray
,请注意)?
我正在使用serialize :my_array, Array
并且serialize :my_hash, Hash
非常高兴地将设置和数组方便地存储在数据库中。
我可以以这种方式使用哪些其他对象?例如,我知道我可以使用Struct
and 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
则可以序列化。或者如果可以和. 以这种方式检查:Object
load
dump
YAML
load
dump
Object
object == YAML.load(YAML.dump(object)) # with require 'yaml' in irb