我问了一个关于序列化和验证的先前问题。有人提到使用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,但我想支持其他类型。
任何进一步的信息都会很棒!
答案 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_yaml
和to_json
方法的包装器(或分别是YAML.load
和from_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可以基于每个对象发生。
或者你班级的肮脏。
无论哪种方式,您的主线代码都看不到它。