在外部文件中存储无法反序列化的pygame.Surface对象

3 投票
2 回答
1793 浏览
提问于 2025-04-16 12:41

我遇到了一个问题——我正在用Python和Pygame写一个游戏原型,想要保存我的游戏。所有和游戏相关的数据都在三个特定的类的实例里,我想把这三个实例保存到一个文件中。不过,我尝试用“序列化”(也就是把数据转成可以存储的格式)来保存这些实例,但没成功。相反,我收到了一个错误提示:“TypeError: can't pickle Surface objects”,意思是我不能保存Surface对象。

我愿意尝试其他的保存方法,使用其他类型的数据。最重要的是,我希望这些实例能够被保存,并且它们的数据可以在以后取出来。所以,我该怎么解决这个问题呢?请记住,我不是一个很有经验的程序员,去年在空闲时间学的Python,其他语言写得不多,虽然我正在慢慢学习C++。

2 个回答

2

在阅读 这个链接 时,你会发现需要让 Surface 对象提供一个 reduce 方法,或者使用 copy_reg 模块来告诉 pickle 怎么处理这些数据,具体可以参考 这个链接

无论哪种方式,pickle 需要一个函数,这个函数可以把它无法处理的数据变成 (某个类, [这里是参数]) 的形式。然后,当你进行反序列化(unpickle)时,它会用这些参数创建一个这个类的新实例。

5

简单来说,"序列化"就是把一个对象转换成可以保存或传输的格式。比如说,SDL表面是一个在内存中存储很多运行时状态的对象。试图直接把它序列化并不是个明智的选择。

你应该把游戏的状态和渲染部分分开,这样你就可以只序列化那些状态(无论是用序列化还是其他方法)。

这就像是试图保存一个视频的状态,结果却是想保存存放解码后视频的内存缓冲区。这是行不通的。正确的做法是序列化视频文件的位置和时间偏移。这样,下次你恢复应用时,就可以继续播放了。

撰写回答