2013-03-13 2 views
4

Итак, моя цель - легко сохранить некоторые данные на диск для последующего использования. Как вы просто пишете и затем читаете объект? Так что, если у меня есть простой классRuby запись и чтение объекта в файл

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 

Тогда я могу превратить это в любопытное идентификатор

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

я могу наконец, напечатайте эту строку в файле или что-то в этом роде. Мой вопрос: как мне снова включить этот идентификатор обратно в объект? Я знаю, что я мог бы разобрать информацию самостоятельно и сделать функцию инициализации, которая берет эту информацию, но, безусловно, у рубина есть что-то встроенное, чтобы превратить это обратно в объект, не так ли?

ответ

5

Рубина имеет несколько способов сериализации объекта:

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

Библиотека маршалинга преобразует коллекции объектов Ruby, в поток байтов , что позволяет им храниться вне текущего активного сценария. Эти данные могут быть впоследствии прочитаны, а исходные объекты восстановлены.

Есть всегда проблемы безопасности, когда делать это, убедитесь, что вы знаете, что вы читаете в

Также обратите внимание на некоторые типы объектов не могут быть выстраивали, вещи, которые связаны с IO и т.д.

EDIT.: Кроме того, ямль, как указывает Кайл, является хорошей читаемой человеком формой строкового представления, которая также должна упоминаться

Смежные вопросы