Ruby предоставляет вам другой метод хранения данных, который называется Marshaling . Это позволит вам сохранить класс / объект в файле и восстановить его позже. Если все ваши пользовательские настройки хранятся в одном объекте (или вы можете создать объект, который может содержать все необходимые вам данные), может быть проще упорядочить данные, чем записывать процедуры импорта / экспорта в текстовые основанный формат или попытка получить дополнительную библиотеку или гем.
Относительно того, где на диске хранить данные, решать только вам. Большинство платформ имеют стандартное расположение для хранения данных приложения в зависимости от того, доступно ли оно одному пользователю или всем пользователям. Обычно наиболее безопасно следовать общепринятой практике на выбранной вами целевой платформе.
Обновление: Простейший пример маршалинга, вероятно, будет следующим: скажем, у вас есть класс с именем UserPrefs
, который вы используете для хранения всех ваших пользовательских настроек. Вы можете использовать следующий код для сохранения данных настроек в файл:
my_prefs = UserPrefs.new
# ... Fill in the 'my_prefs' object with the user's preferences, etc ...
# Store the object into a file
File.open("user_prefs.data", "wb") do |file|
Marshal.dump(my_prefs, file)
end
При следующей загрузке приложения вы можете восстановить эти настройки, используя следующую команду:
# Load prefs from file
my_prefs = nil
File.open("user_prefs.data", "rb") {|f| my_prefs = Marshal.load(f)}
На этом этапе объект my_prefs
должен быть точно таким же, каким он был при первоначальном запуске кода маршалинга. По сути, это позволяет вам делать «снимок» объекта в определенный момент времени (скажем, когда ваша программа завершает работу) и восстанавливать его позже (например, когда ваша программа загружается). Внутри все данные в структуре закодированы в одну строку, и эта строка хранится на диске; модуль Marshal просто заботится о кодировании и декодировании для вас.
Здесь - еще один пример использования маршалинга для хранения и извлечения данных.
Процедуры кодирования / декодирования по умолчанию, встроенные в модуль Marshal, обычно достаточны для большинства классов хранения данных. Особенно сложные классы могут иметь проблемы, и если это так, то вы можете определить свои собственные методы кодирования и декодирования ( первая ссылка включает пример определения пользовательских методов).
Однако некоторые типы данных нельзя маршалировать (например, дескрипторы для открытия файлов, Proc
объекты и т. Д.), Поскольку они обычно не сохраняются в сеансах Ruby. Если вам нужно маршалировать класс, который включает в себя такие элементы, которые не нравятся Marshal
, вы можете использовать пользовательские функции кодирования / декодирования, чтобы маршалировать остальную часть класса и опускать проблемные элементы.