2013-03-13 83 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是一種很好的人類可讀的字符串表示形式,也應該提及