在DataMapper中序列化和反序列化Ruby对象

时间:2013-02-19 18:10:00

标签: ruby yaml datamapper

我刚开始使用DataMapper,发现自己做了很多这样的事情:

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :serialized_credentials, String

  def credentials
    @credentials ||= YAML.load(self.serialized_credentials)
  end

  def credentials=(c)
    @credentials = nil
    self.serialized_credentials = YAML.dump(c)
  end

end

这允许我传递一个哈希(例如)凭证。

但DataMapper是否已经为此提供了一种机制?

2 个答案:

答案 0 :(得分:2)

您可以使用DataMapper提供的Object类型:

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :credentials, Object
end

然而,这会使用Marshal.dump代替YAML.dump,但您可以通过定义自己的类型来解决这个问题:

class YAMLObject < DataMapper::Type
  primitive String

  def self.dump(value, property)
    Base64.encode64(YAML.dump(value))
  end

  def self.load(value, property)
    value.nil? ? nil : YAML.load(Base64.decode64(value))
  end
end

然后你可以像任何其他类型一样使用它:

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :credentials, YAMLObject
end

最后但并非最不重要的是,Json gem提供了dm-types类型,它使用MultiJson转储和加载数据。

参考文献(对象类型):

引用(定义自己的类型):

参考文献(Json Type):

答案 1 :(得分:1)

看起来您也可以使用本机DataMapper类型。

来自http://datamapper.org/docs/dm_more/types.html

  

串行器

     

这些使用基于文本的序列化在数据存储中存储值   格式。它们通过调用将对象转储到格式来工作   保存并解析文本以在加载时重新初始化它们。

Csv
Json
Yaml

类似

class MyModel
  include DataMapper::Resource

  property :id, Serial
  property :credentials, Json
end