2013-03-13 55 views
4

好的,所以我的目标是轻松地将一些数据保存到磁盘供以后使用。你如何简单地编写然后读取一个对象? 所以,如果我有一个简单的类红宝石写入和读取对象到文件

class C 
    attr_accessor :a, :b 
    def initialize(a, b) 
     @a, @b = a, b 
    end 
end 

所以,如果我做一个OBJ从真快

obj = C.new("foo", "bar") #just gave it some random values 

然后我就可以把它转换成一个有点ID

string = obj.to_s #which returns "<C:0x240dcf8 @a="foo", @b="bar">" 

我可以最后打印这个字符串到一个文件或其他东西。我的问题是,我如何将这个id再次变成一个对象?我知道我可以自己挑选信息,并创建一个初始化函数来获取这些信息,但是肯定ruby有内置的东西可以将它转换回对象,对吧?

回答

5

Ruby有几个方法序列化对象:

c = C.new("foo", "bar") 

# using YAML 
require 'yaml' 
yaml_serialized = c.to_yaml 
c_object = YAML.load yaml_serialized 

# using Marshal 
marshal_serialized = Marshal.dump c 
c_object = Marshal.load marshal_serialized 
2

该字符串不能变回成一个对象,它本质上只是一个哈希值。

您正在寻找对象的编组或序列化。

http://www.ruby-doc.org/core-2.0/Marshal.html

的编组库转换红宝石的集合对象转换为 字节流,从而允许它们被存储在当前激活的 脚本之外。随后可以读取该数据并重新构造原始对象 。

这样做时,总有一些安全问题,确保你知道你在读什么

还要注意一些类型的对象不能被封,事情涉及IO等

编辑:另外,正如Kyle所指出的,yaml是一种很好的人类可读的字符串表示形式,也应该提及