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

Gro*_*fit 7 ruby xml serialization json yaml

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

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

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

cleanObject = CleanClass.new
Run Code Online (Sandbox Code Playgroud)

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

一个例子是:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ewo*_*out 13

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

YAML:

require 'yaml'
serialized = CleanClass.new.to_yaml
object = YAML.load(serialized)
Run Code Online (Sandbox Code Playgroud)

元帅:

serialized = Marshal.dump(CleanClass.new)
object = Marshal.load(serialized)
Run Code Online (Sandbox Code Playgroud)

  • JSON格式太有限,无法捕获整个ruby对象的状态.它只有原语,因此您需要自定义JSON以包含实例变量的类型信息.此外,如果目标是序列化,那么可以在其他地方读回对象,您可能需要遵循API.你可以说一个类的责任是将自身转换为外部格式,并重新读取该格式. (2认同)