Как работает сериализация ruby ​​(Marshaling)? - PullRequest
9 голосов
/ 04 января 2009

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

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

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

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

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

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

Я работаю над модом для игрового движка (RPG Maker VX с использованием игровой библиотеки RGSS2). Существует класс Bitmap, который принадлежит API (с закрытым исходным кодом). Я хотел бы сохранить этот объект / изображение между играми, поэтому мне нужно сериализовать его в файл сохранения. Я не специалист по ruby, но я знаю, что могу определить два метода (marshal_dump и marshal_load), которые будут вызываться модулем "Marshal" при попытке сериализации объекта.

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

Так может кто-нибудь сказать мне, как это работает внутренне? Я думаю, что это поможет мне решить мою проблему. Помимо этого, есть ли другой тип формата изображения, который я могу использовать, который я могу просто сохранить в файл и избежать собственной сериализации?

Ответы [ 2 ]

8 голосов
/ 04 января 2009

Методы сортировки в Ruby хранят тип объекта, который они кодируют. Вот как работают эти два крючка:

  • marshal_dump должен вернуть некоторые данные, описывающие состояние вашего объекта. Ruby не должно волновать формат этих данных - это просто должно быть то, что ваш marshal_load метод может использовать для восстановления состояния объекта.

  • marshal_load вызывается для маршаллированного объекта сразу после его воссоздания. Это в основном метод инициализации для маршаллированного объекта. Он передает любой объект 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
0 голосов
/ 17 октября 2016

Вы можете сериализовать необработанные числовые данные, используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...