Ответ 1
См. Маршал: http://ruby-doc.org/core/classes/Marshal.html
-или -
Я хотел бы сохранить объект в файл, а затем легко прочитать его из файла. В качестве простого примера предположим, что у меня есть следующий трехмерный массив:
m = [[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]]
Есть ли простой Ruby API, который я могу использовать для достижения этого без программирования парсера для интерпретации данных из файла? В примере, который я даю, это легко, но по мере усложнения объектов становится раздражающим, чтобы объекты сохранялись.
См. Маршал: http://ruby-doc.org/core/classes/Marshal.html
-или -
Вам нужно сериализовать объекты, прежде чем вы сможете их сохранить в файл, и десериализовать их, чтобы вернуть их. Как уже упоминалось Кори, широко используются две стандартные библиотеки сериализации, Marshal
и YAML
.
Оба Marshal
и YAML
используют методы dump
и load
для сериализации и десериализации соответственно.
Вот как вы могли бы их использовать:
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.
YAML и маршал являются наиболее очевидными ответами, но в зависимости от того, что вы планируете делать с данными, sqlite3 может быть полезным вариант тоже.
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