2017-02-05 3 views
0

Я делаю простую игру палача в проекте Odin с возможностью сохранения и загрузки игры.Ruby - Почему unserialization от JSON выводит Array вместо моего класса?

Я уже сериализовать мой класс в формате JSON и сохранить его в файл, содержимое выглядеть следующим образом:

{"@password":["p","r","o","f","u","s","e","l","y"],"@password_checked":["_","_","_","_","u","_","_","_","_"],"@chances":8,"@picked_letters":["u","a"]} 

Мои методы сериализации и десериализации приходят из https://www.sitepoint.com/choosing-right-serialization-format/, и они выглядят следующим образом:

require 'json' 

module BasicSerializable 

    @@serializer = JSON 

    def serialize 
    obj = {} 
    instance_variables.map do |var| 
     obj[var] = instance_variable_get(var) 
    end 

    @@serializer.dump obj 
    end 

    def unserialize(string) 
    obj = @@serializer.parse(string) 
    obj.keys.each do |key| 
     instance_variable_set(key, obj[key]) 
    end 
    end 
end 

Мой код десериализируются выглядеть следующим образом

file = File.new(game_to_load, 'r') 
serialized_object = file.gets  # serialized_object is the file from above 
p @password.class       #=> Password 
@password = unserialize(serialized_object) 
p @password.class       #=> Array 
p @password  #=> ["@password", "@password_checked", "@chances", "@picked_letters"] 

Проблема в том, что я не могу понять, почему unserialization serialized_object выводит мне массив. Как заставить его выводить мой класс с состоянием объекта, сохраненного в файле, указанном в начале?

+0

Где этот незамерзающий код в конце? Это в классе? Или он сидит в главном коде? – Schwern

ответ

1

Вы не вызывали unserialize на объект @password, поэтому он будет вызываться на текущем объекте. Вы не показали, что это такое, но я думаю, что это массив.

Вместо этого вы хотите @password.unserialize.


Некоторые заметки ...

Поскольку unserialize изменяет объект и сдувает существующие данные, вероятно, следует unserialize!.

Обратите внимание, что Ruby уже имеет Marshal class для сериализации и десериализации. Он находится в двоичном формате, а не JSON.

Сохранение ваших паролей в виде чистого текста действительно Плохая идея. Пароли никогда не должны никогда, EVER хранить только их хеши. Хорошее хеширование означает, что если файл паролей украден, есть дополнительные препятствия для перехода атакующего. Если вы все сделаете правильно, они почти небьются.

См. Salted Password Hashing - Doing it Right.

+0

Да. '@ password.unserialize (serialized_object)' решил. Спасибо, Шверн. Я попытался отладить это в течение трех часов. – ToTenMilan

+0

Спасибо за советы. Фактически, это упражнение сосредоточено на сохранении и загрузке состояния классов, которое может быть чем угодно, а не паролем для палача. Сейчас я не хочу спускаться с кроличьих ям. Придет время узнать о безопасности. Я снял вашу ссылку на хеширование паролей и сохранил ее в закладках. На данный момент я рассматриваю это только как краткое введение. – ToTenMilan

+0

@ToTenMilan Ах, вот, это не настоящий пароль! Мне было интересно, почему он хранится в виде списка символов. – Schwern