我可以在ActiveRecord中序列化什么对象?

时间:2013-10-06 07:10:18

标签: ruby-on-rails ruby activerecord serialization

我正在愉快地使用serialize :my_array, Arrayserialize :my_hash, Hash来方便地在数据库中存储设置和数组。

我可以用这种方式使用哪些其他物品?我知道我可以使用StructOpenStruct,但我怎么知道是否可以使用ActiveRecord以这种方式序列化对象?例如,我怎么知道我是否可以这样使用班级Set(本应该被称为UniqArray,请注意)?

2 个答案:

答案 0 :(得分:2)

此代码在Rails'serialize方法中确定用于序列化的编码器:

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

这意味着简而言之:如果Object本身具有方法Objectload,则可以序列化dump。或者,如果YAML可以loaddump Object。检查一下:

object == YAML.load(YAML.dump(object))  # with require 'yaml' in irb

答案 1 :(得分:2)

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

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

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

还有一些特殊情况可以转储多个类,例如ArrayClassDateDateTimeExceptionFalseClassFloatHashIntegerModuleNilClassRangeRationalRegexp,{ {1}},StringStructSymbolTime以及其他一些很少使用的。

例如,如果我们有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>