Как работает сериализация ruby (маршалинг)?
я нашел некоторую информацию по этому вопросу (как по этой ссылке), но ничего, что говорит мне, как это на самом деле работает под одеялом. Если вы не хотите читать эссе ниже, вот реальные вопросы:
как я должен использовать тег
marshal_dump
иmarshal_load
методами? подойдет даже простой пример., когда
marshal_load
вызывается, как он "знает", какой тип объекта для создания? Если существует несколько объектов тот же тип в файле, как определить, что есть что? Я в замешательстве...если у меня есть объект, который представляет изображение, есть ли другой способ записать его на диск?
моя конкретная проблема заключается в следующем:
это немного сложно, потому что у меня нет исходного кода для объекта, который я хочу сериализовать.
Я работаю над модом для игрового движка (RPG Maker VX с использованием RGSS2 игровая библиотека.) Существует класс Bitmap, который принадлежит API (с закрытым исходным кодом). Я хотел бы сохранить этот объект / изображение между играми, поэтому мне нужно сериализовать его в файл сохранения. Я не ruby pro, но я знаю, что могу определить два метода (marshal_dump
и marshal_load
), который будет вызываться модулем "Маршал" при попытке сериализации объекта.
проблема в том, что я не знаю как реализовать два необходимых методов. Я могу просто оставить их пустыми методы и кажется для работы, но объект фактически расположен, и данные изображения исчезли. Кроме того, я не понимаю, что он делает внутри, и, очевидно, создание пустых методов просто неправильно.
так может кто-нибудь сказать мне, как это работает внутри? Думаю, это поможет мне решить мою проблему. Кроме того, есть ли другой тип формата изображения, который я могу использовать, который я мог бы просто сохранить в файл и избежать собственной сериализации?
2 ответов
методы маршалинга Ruby хранят тип объекта, который они кодируют. То, как эти два крючка работают, выглядит так:
marshal_dump
должен вернуть некоторые данные, описывающие состояние объекта. Ruby не может заботиться о формате этих данных-это просто должно быть что-то, что вашmarshal_load
метод может использоваться для восстановления состояния объекта.marshal_load
называется упорядоченный объект только после того, как она была воссоздана. Это в основном метод initialize для упорядоченного объекта. Он прошел какой-то объектmarshal_dump
возвращается и должен использовать эти данные для восстановления своего состояния.
вот пример:
class Messenger
attr_accessor :name, :message
def marshal_dump
{'name' => name, 'message' => message}
end
def marshal_load(data)
self.name = data['name']
self.message = data['message']
end
end
вы можете сериализовать необработанные числовые данные, используя NArray следующим образом:
require 'narray'
class NArray
def _dump level
Marshal.dump [to_s, typecode] + shape
end
def self._load arg
NArray.to_na *Marshal.load(arg)
end
end
describe NArray do
let(:arr) { NArray[[2, 3, 5], [7, 11, 13]] }
it 'should load and save an array' do
dumped = Marshal.dump arr
expect(Marshal.load(dumped)).to eq arr
end
end