在外部文件中存储unpicklabe pygame.Surface对象

时间:2011-02-28 17:58:02

标签: python serialization pygame pickle

所以我遇到了一个问题 - 我正在用Python编写游戏原型,使用Pygame,我想保存我的游戏。所有与游戏相关的数据都在某些类的三个实例中,我想将这三个实例保存到一个文件中。但是,我试过腌制这些实例,但它不起作用。相反,我得到“TypeError:不能pickle Surface对象”。这是一个问题,因为我想存储Surface对象。

我对使用任何其他类型的数据类型可能存在的酸洗方法持开放态度。重要的是这些实例被存储,然后可以检索它们的数据。那么我该怎么做才能克服这个问题呢?请记住,我不是一个非常有经验的程序员,一年前在我的业余时间学习过Python,虽然我正在慢慢学习C ++,但我不能写很多其他语言。

2 个答案:

答案 0 :(得分:5)

酸洗的基本点是你应该能够以某种方式序列化对象。 SDL表面是一个内存对象,具有很多运行时状态。试图将其序列化并不是完全合情合理的。

你应该做的是将你的游戏状态与渲染组件分离,以便你可以将那些(酸洗或其他)串行化。

这就像试图通过某种方式保存保存解码视频的内存缓冲区来保存视频状态。这不行。相反,您如何保存它是序列化视频文件的位置和时间偏移。然后,您可以在下次还原应用程序时继续播放。

答案 1 :(得分:2)

阅读http://docs.python.org/library/pickle.html#pickle-protocol,您需要让Surface对象导出 reduce 方法,或者使用copy_reg模块告诉pickle如何处理http://docs.python.org/library/copy_reg.html#module-copy_reg中记录的数据。

无论哪种方式,pickle需要的是一个将它无法处理的blob转换为(some_class, [arguments here])的函数。然后当你解开它时,它将使用这些参数构造该类的新东西。