【问题标题】:Serialization to blob in rails 3序列化到rails 3中的blob
【发布时间】:2011-05-16 04:37:21
【问题描述】:
我有一个 Rails 应用程序,其中一个对象的属性之一是一个数据集,该数据集由一组 x,y 坐标组成。我目前正在使用 rails serialize helper 将其存储在 sql 数据库中:
序列化:数据,数组
这会将数组转换为 yaml,然后将其存储在 sql 数据库中的字符串字段中。问题是我们的数据库在这样做时变得非常大,我们需要让它更小。是否可以序列化为原始二进制而不是字符串并存储在 blob 中?这将大大减少大小并帮助我们解决问题。
我已经搜索了一个 gem 来执行此操作,甚至是一个 ruby 方法,它可以在没有太多帮助的情况下将数组转换为二进制数据。任何建议将不胜感激。
【问题讨论】:
标签:
ruby-on-rails
serialization
binary
【解决方案1】:
您可能对 Array.pack 和 String.unpack 方法感兴趣。请参阅 ruby 文档:输入 ri Array.pack
您可能希望在数据库中使用“packed_data”属性,然后添加访问器以对其进行打包/解包:
def data
packed_data.unpack('....')
end
def data=(v)
self.packed_data = v.pack('....')
end
为了使其更有用,您可以将解压后的表单存储在一个变量中,但您必须记住在 packed_data 属性更改时清除它,例如当您调用 .reload 时
before_validation :pack_data
UNPACK_FORMAT = '.....' # See ri Array.pack
def data
@data ||= packed_data.unpack(UNPACK_FORMAT)
end
def data=(v)
@data = v
end
def reload(options=nil)
@data = nil
super
end
def pack_data
self.packed_data = self.data.pack(UNPACK_FORMAT)
true # Because we are in a before_.. callback
end
用于打包/解包数据的魔术字符串的格式取决于数组中的数据。文档将帮助您选择正确的。
我相信打包和解包的格式是一样的,但不要太相信我。 ;)