2010-06-07 2 views
3

У меня возникла проблема десериализации класса ruby, который я написал YAML.Ruby custom class to и от YAML;

Где я хочу быть

Я хочу, чтобы иметь возможность пройти один объект вокруг как полный «вопрос», который включает в себя текст вопроса, некоторые возможные варианты ответов (для нескольких. Выбор) и правильный ответ , Один модуль (Кодер) принимает входные данные, выстраивает из него класс вопросов и добавляет его в пул вопросов. Другой модуль читает пул вопросов и строит массив объектов «вопрос».

Где я в настоящее время

Пример вопроса Бассейн

--- | 
--- !ruby/object:MultiQ 
a: "no" 
answer: "no" 
b: "no" 
c: "no" 
d: "no" 
text: "yes?" 

кодировщика дамп YAML файл. Объект MultiQ заполняется вводом. (См. Ниже) определение

def dump(file, object) 
    File.open(file, 'a') do |out| 
    YAML.dump(object.to_yaml, out) 
    end 
    object = nil 
end 

MultiQ Класс

class MultiQ 
    attr_accessor :text, :answer, :a, :b, :c, :d 

    def initialize(text, answer, a, b, c, d) 
    @text = text 
    @answer = answer 
    @a = a 
    @b = b 
    @c = c 
    @d = d 
    end 
end 

Декодер (Я пытался разные вещи, так что здесь не было моим первым или догадка. Но я в потери и документация не объясняют вещи достаточно тщательно.)

File.open("test_set.yaml") do |yf| 
    YAML.load_documents(yf) { |item| 
     new = YAML.object_maker(MultiQ, item) 
     puts new 
    } 
    end 

Вопросов вы можете ответить

  1. Как достичь своей цели? Какие методы следует использовать, между парсингами, загрузкой файлов или документов, чтобы успешно десериализовать класс Ruby? Я уже просмотрел YAML Rdoc, и я не очень сильно впитывался, поэтому, пожалуйста, не связывайте меня с этим.
  2. Какие другие методы вы бы предложили использовать? Есть ли лучший способ хранить такие вопросы? Должен ли я использовать документ db, реляционный db, xml? Какой-то другой формат?

ответ

3

Когда вы пишете в YAML, вам не нужно сначала to_yaml вызова, просто передать сам объект YAML.dump (объект)

Это, вероятно, привело вас в другие проблемы, потому что выход to_yaml была строкой .. и YAML.dump фактически написал ваш объект в виде строки к файлу (поэтому у вас есть начальная строка «- |». Любой код, загружающий этот файл, будет загружать эти данные в виде строки.

Загрузить такой объект:

File.open('test_set.yaml', 'r') { |fh| mq_loaded = YAML.load(fh) } 

«Новый», который вы используете, в целом запутан, потому что новое - это ключевое слово.