我使用serialize :my_array, Array
和serialize :my_hash, Hash
很方便地將設置和數組存儲在數據庫中。我可以在ActiveRecord中序列化哪些對象?
我可以用這種方式使用哪些其他物體?我知道我可以使用Struct
和OpenStruct
作爲例子,但是如何知道一個對象是否可以通過ActiveRecord這種方式進行序列化?例如,我怎麼知道我是否可以用這種方式使用Set
類(本應該叫UniqArray
,請注意)?
我使用serialize :my_array, Array
和serialize :my_hash, Hash
很方便地將設置和數組存儲在數據庫中。我可以在ActiveRecord中序列化哪些對象?
我可以用這種方式使用哪些其他物體?我知道我可以使用Struct
和OpenStruct
作爲例子,但是如何知道一個對象是否可以通過ActiveRecord這種方式進行序列化?例如,我怎麼知道我是否可以用這種方式使用Set
類(本應該叫UniqArray
,請注意)?
此代碼確定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
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
是實現集存儲一個實例變量名)