web-dev-qa-db-ja.com

オブジェクトをファイルに保存するにはどうすればよいですか?

オブジェクトをファイルに保存して、ファイルから簡単に読み取れるようにしたいと思います。簡単な例として、次の3D配列があるとします。

m = [[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]],
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]]

ファイルからのデータを解釈するパーサーをプログラミングせずにこれを達成するために使用できる簡単なRuby APIはありますか?私が与える例では簡単ですが、オブジェクトがより複雑になるにつれて、オブジェクトを永続化するのは面倒です。

25
Flethuseo

マーシャルを参照してください: http://Ruby-doc.org/core/classes/Marshal.html

-または-

YAML: http://www.Ruby-doc.org/core/classes/YAML.html

15
Cory

オブジェクトをファイルに保存し、逆シリアル化して取得する前に、オブジェクトをシリアル化する必要があります。 Coryが述べたように、2つの標準シリアル化ライブラリが広く使用されています Marshal および YAML

MarshalYAMLはどちらも、それぞれシリアル化と逆シリアル化にメソッドdumploadを使用します。

これらの使用方法は次のとおりです。

m = [
     [
      [0, 0, 0],
      [0, 0, 0],
      [0, 0, 0]
     ],
     [
      [0, 0, 0],
      [0, 0, 0],
      [0, 0, 0]
     ]
    ]

# Quick way of opening the file, writing it and closing it
File.open('/path/to/yaml.dump', 'w') { |f| f.write(YAML.dump(m)) }
File.open('/path/to/marshal.dump', 'wb') { |f| f.write(Marshal.dump(m)) }

# Now to read from file and de-serialize it:
YAML.load(File.read('/path/to/yaml.dump'))
Marshal.load(File.read('/path/to/marshal.dump'))

ファイルの読み取り/書き込みに関連するファイルサイズやその他の癖に注意する必要があります。

詳細については、もちろんAPIドキュメントを参照してください。

53
Swanand

YAMLとMarshalが最も明白な答えですが、データをどのように処理するかによっては、 sqlite も便利なオプションになる場合があります。

require 'sqlite3'

m = [[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]],
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]]

db=SQLite3::Database.new("demo.out")
db.execute("create table data (x,y,z,value)")
inserter=db.prepare("insert into data (x,y,z,value) values (?,?,?,?)")
m.each_with_index do |twod,z|
  twod.each_with_index do |row,y|
    row.each_with_index do |val,x|
      inserter.execute(x,y,z,val)
    end
  end
end
3