ruby - 루비 직렬화(마샬링)는 어떻게 작동합니까?



serialization (2)

Ruby 마샬링 메소드는 인코딩중인 객체의 유형을 저장합니다. 이 두 가지 고리가 작동하는 방식은 다음과 같습니다.

  • marshal_dump 는 객체 상태를 설명하는 데이터를 반환해야합니다. Ruby는이 데이터의 형식을 덜 신경 쓸 수 없었습니다. marshal_load 메서드가 객체의 상태를 재구성하는 데 사용할 수 있어야합니다.

  • 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

주제 ( 이 링크와 같은) 에 대한 정보를 찾았으나 실제로 실제로 어떻게 작동하는지 알려주는 것은 아닙니다. 아래 에세이를 읽고 싶지 않다면, 진짜 질문이 있습니다.

  1. marshal_dumpmarshal_load 메소드를 어떻게 구현해야합니까? 심지어 간단한 예제도 할 것이다.

  2. marshal_load 가 호출 될 때 생성 할 객체의 유형을 어떻게 알 수 있습니까? 파일에 같은 유형의 객체가 여러 개있는 경우 어떤 객체가 어떤 객체인지 어떻게 알 수 있습니까? 나는 분명히 혼란 스럽다 ...

  3. 내가 이미지를 나타내는 객체를 가지고 있다면, 그것을 디스크에 쓰는 다른 방법이 있습니까?

내 구체적인 문제는 다음과 같습니다.

직렬화하고자하는 객체의 소스 코드가 없기 때문에 약간 복잡합니다.

게임 엔진 (RPG Maker VX, RGSS2 게임 라이브러리 사용)에 대한 mod 작업을하고 있습니다. 거기에 (폐쇄 소스) API에 속하는 비트 맵이라는 클래스가 있습니다. 이 개체 / 이미지를 게임 플레이간에 저장하고 싶습니다. 그래서이를 저장 파일에 직렬화해야합니다. 나는 루비 프로가 아니지만 객체를 직렬화하려고 할 때 "마샬 ( marshal_load )"모듈에서 호출 할 두 가지 메소드 ( marshal_dumpmarshal_load )를 정의 할 수 있음을 알고 있습니다.

문제는 필요한 두 가지 방법을 구현하는 방법을 모른다는 것입니다. 사실 저는 그것들을 빈 메서드로 남겨두고 작동하는 것처럼 보일 수 있지만 개체는 실제로 처리되고 이미지 데이터는 사라집니다. 그 외에, 나는 내부적으로 무엇을하는지 이해하지 못하고 분명히 빈 방법을 만드는 것은 잘못된 것이다.

그렇다면이 제품이 내부적으로 어떻게 작동하는지 누군가가 알 수 있습니까? 내 문제를 해결하는 데 도움이 될 것 같아. 그 외에, 내가 사용할 수있는 또 다른 형식의 이미지 형식이 파일에 저장할 수 있으며 자체 직렬화를하지 않을 수 있습니까?


다음과 같이 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




serialization