将对象序列化为JSON,XML,YAML?

时间:2011-10-27 12:30:55

标签: ruby xml json serialization yaml

我问了一个关于序列化和验证的先前问题。有人提到使用JSON gem,它允许我告诉我的对象如何使用to_json方法进行序列化,但是Ruby似乎很容易做很多复杂的事情,但另一方面,一些非常简单的东西似乎是相当的复杂,序列化就是其中之一。

我想知道是否有办法让一个干净的对象:

class CleanClass
    attr_accessor :variable1
    attr_accessor :variable2
    attr_accessor :variable3
end

cleanObject = CleanClass.new

理想情况下,我不想弄脏模型,我只是想将它传递给某些东西并告诉它输出类型应该是什么,让它发挥其魔力。

一个例子是:

jsonOutput = MagicSerializer::Json.Serialize(cleanObject)
xmlOutput = MagicSerializer::Xml.Serialize(cleanObject)
yamlOutput = MagicSerializer::Yaml.Serialize(cleanObject)

revertedJsonObject = MagicSerializer::Json.Unserialize(jsonOutput)
revertedXmlObject = MagicSerializer::Xml.Unserialize(xmlOutput)
revertedYamlObject = MagicSerializer::Yaml.Unserialize(yamlOutput)

我想传递一个对象,然后输出字符串,然后能够将其转换回来。

我知道ActiveModel具有序列化功能,但我需要弄脏我的类来执行此操作,并且如果可能的话我不想更改模型。 ActiveSupport似乎满足JSON标准,因为我可以调用它,它将需要一个对象并吐出JSON,但我想支持其他类型。

任何进一步的信息都会很棒!

3 个答案:

答案 0 :(得分:12)

Ruby内置了二进制和yaml的自动序列化/反序列化。

YAML:

require 'yaml'
serialized = CleanClass.new.to_yaml
object = YAML.load(serialized)

元帅:

serialized = Marshal.dump(CleanClass.new)
object = Marshal.load(serialized)

答案 1 :(得分:1)

对于JSON和YAML,它似乎很简单,因为它们只是to_yamlto_json方法的包装器(或分别是YAML.loadfrom_json

对于JSON,您必须围绕core-Types(或实现to_json的其他类型)包装自己的类,例如首先实现一个to_hash方法,然后可以将其转换为json。

由于层次结构方面,XML要复杂得多,你必须将其标准化, 但实际上我不明白你的解释基本的to_...方法有什么问题。这实际上是我们在Ruby中使用的约定。如果您担心模型的污染,可以将这些方法放在一个模块中,并将该模块包含在类中。

module Foo
  def to_serialized_type
   ...
  end
end
class CleanClass
  include Foo
end

答案 2 :(得分:1)

让你的魔法序列化方法为你弄脏对象; emdirtering可以基于每个对象发生。

或者你班级的肮脏。

无论哪种方式,您的主线代码都看不到它。