【问题标题】:What object can I serialize in ActiveRecord?我可以在 ActiveRecord 中序列化什么对象?
【发布时间】:2013-10-12 22:26:23
【问题描述】:
我很乐意使用serialize :my_array, Array 和serialize :my_hash, Hash 方便地将设置和数组存储在数据库中。
我还能以这种方式使用哪些其他对象?例如,我知道我可以使用Struct 和OpenStruct,但是我怎么知道一个对象是否可以使用ActiveRecord 以这种方式序列化?例如,我怎么知道我是否可以这样使用 Set 类(请注意,它应该被称为 UniqArray)?
【问题讨论】:
标签:
ruby-on-rails
ruby
activerecord
serialization
【解决方案1】:
此代码确定 Rails 的serialize 方法中用于序列化的编码器:
if [:load, :dump].all? { |x| class_name.respond_to?(x) }
class_name
else
Coders::YAMLColumn.new(class_name)
end
简而言之:如果Object 本身具有load 和dump 方法,则可以序列化Object。或者如果YAML可以load和dumpObject。以这种方式检查:
object == YAML.load(YAML.dump(object)) # with require 'yaml' in irb
【解决方案2】:
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 是实现集合存储的实例变量名称)