gpt4 book ai didi

ruby - ruby 序列化(Marshaling)是如何工作的?

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:48 25 4
gpt4 key购买 nike

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

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

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

  3. 如果我有一个表示图像的对象,是否有不同的方法将其写入磁盘?

我的具体问题是:

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

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

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

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

最佳答案

Ruby 编码方法存储它们正在编码的对象的类型。这两个钩子(Hook)的工作方式是这样的:

  • 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

关于ruby - ruby 序列化(Marshaling)是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com