我正在愉快地使用serialize :my_array, Array
和serialize :my_hash, Hash
来方便地在数据库中存储设置和数组。
我可以用这种方式使用哪些其他物品?我知道我可以使用Struct
和OpenStruct
,但我怎么知道是否可以使用ActiveRecord以这种方式序列化对象?例如,我怎么知道我是否可以这样使用班级Set
(本应该被称为UniqArray
,请注意)?
答案 0 :(得分:2)
此代码在Rails'serialize
方法中确定用于序列化的编码器:
if [:load, :dump].all? { |x| class_name.respond_to?(x) }
class_name
else
Coders::YAMLColumn.new(class_name)
end
这意味着简而言之:如果Object
本身具有方法Object
和load
,则可以序列化dump
。或者,如果YAML
可以load
而dump
Object
。检查一下:
object == YAML.load(YAML.dump(object)) # with require 'yaml' in irb
答案 1 :(得分:2)
AR中的序列化使用Psych将实例转储为yaml字符串。
Psych反过来知道如何序列化从Object继承的所有对象(它几乎是Ruby中的所有对象)。
一般情况下,Psych获取对象的所有实例变量并将其转储为yaml字段。
还有一些特殊情况可以转储多个类,例如Array
,Class
,Date
,DateTime
,Exception
,FalseClass
,Float
,Hash
,Integer
,Module
,NilClass
,Range
,Rational
,Regexp
,{ {1}},String
,Struct
,Symbol
,Time
以及其他一些很少使用的。
例如,如果我们有TrueClass
和实例class UniqArray < Set
- dumped string将是UniqArray.new([1,2,3])
(其中"--- !ruby/object:UniqArray\nhash:\n 1: true\n 2: true\n 3: true\n"
是实现set store的实例变量名称)< / p>