Как работает сериализация ruby (маршалинг)?

я нашел некоторую информацию по этому вопросу (как по этой ссылке), но ничего, что говорит мне, как это на самом деле работает под одеялом. Если вы не хотите читать эссе ниже, вот реальные вопросы:

  1. как я должен использовать тег marshal_dump и marshal_load методами? подойдет даже простой пример.

  2. , когда marshal_load вызывается, как он "знает", какой тип объекта для создания? Если существует несколько объектов тот же тип в файле, как определить, что есть что? Я в замешательстве...

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

моя конкретная проблема заключается в следующем:

это немного сложно, потому что у меня нет исходного кода для объекта, который я хочу сериализовать.

Я работаю над модом для игрового движка (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