【问题标题】:How does ruby serialization (Marshaling) work?ruby 序列化(编组)如何工作?
【发布时间】:2009-01-04 00:50:54
【问题描述】:

我找到了一些关于该主题的信息 (like this link),但没有任何信息告诉我它实际上是如何运作的。如果您不想阅读下面的文章,这里是真正的问题:

  1. 我应该如何实现marshal_dumpmarshal_load 方法?即使是一个简单的例子也可以。

  2. marshal_load 被调用时,它如何“知道”要创建哪种类型的对象?如果文件中有多个相同类型的对象,你怎么知道哪个是哪个?我显然很困惑......

  3. 如果我有一个代表图像的对象,是否有其他方法可以将其写入磁盘?

我的具体问题是这样的:

这有点复杂,因为我没有想要序列化的对象的源代码。

我正在开发游戏引擎的模组(使用 RGSS2 游戏库的 RPG Maker VX)。有一个名为 Bitmap 的类属于(闭源)API。我想在游戏之间保存这个对象/图像,所以我需要将它序列化到保存文件中。我不是 ruby​​ 专业人士,但我知道我可以定义两个方法(marshal_dumpmarshal_load),当我尝试序列化对象时,“Marshal”模块将调用它们。

问题是我不知道如何实现所需的两种方法。实际上,我可以将它们保留为空方法,并且它似乎可以工作,但对象实际上已被处置,图像数据已消失。除此之外,我不明白它在内部做什么,显然创建空方法是错误的。

那么谁能告诉我这些东西在内部是​​如何工作的?我认为这将帮助我解决我的问题。除此之外,我可以使用另一种类型的图像格式,我可以将其保存到文件中并避免自己进行序列化?

【问题讨论】:

    标签: ruby serialization


    【解决方案1】:

    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
    

    【讨论】:

    • 太棒了,谢谢。这几乎是我的想法,但我不知道 marshal_load 传递了数据,我认为它传递了整个序列化文件。再次感谢,这正是我所需要的。
    【解决方案2】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2023-02-14
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      相关资源
      最近更新 更多