python - 无法用 pickle 序列化 pygame.Surface 对象

标签 python pygame

我正在用 python 3.6 开发一个游戏,我想在它的多人游戏版本中将客户端(玩家)修改的服务器对象发送到我想序列化它们以进行传输。我在我的对象中使用 pygame,因此使用 pygame.Surface

我有具有这种结构的对象:

class Cargo(Bateau):
  dictCargos = dict()
  def __init__(self, map, nom, pos, armateur=None):
    Bateau.__init__(self, map, nom, armateur, pos)
    self.surface = pygame.image.load(f"images/{self.nom}.png").convert_alpha()
    self.rect = self.map.blit(self.surface, self.pos)
    ...
    Cargo.dictCargos[self.nom] = self

当我在没有pygame实例的情况下序列化另一个对象时没问题 但是对于上述对象,我收到此错误消息:

import pickle as pickle
pickle.dump(Cargo.dictCargos, open('file2.pkl', 'wb'), protocol=pickle.HIGHEST_PROTOCOL)

Traceback (most recent call last):
  File "./pytransit.py", line 182, in <module>
    encreG(joueur, event)
  File "/home/patrick/Bureau/PyTransit/modulesJeu/tests.py", line 25, in encreG
    pickle.dump(Cargo.dictCargos, open('file2.pkl', 'wb'), protocol=pickle.HIGHEST_PROTOCOL)
TypeError: can't pickle pygame.Surface objects

你知道如何将这些项目传输到服务器吗?或者绕过这个 pickle 限制?
如果我想保存一部分也会出现同样的问题,所以保存这些对象

最佳答案

这是@IonicSolutions 在评论中指出的示例:

import pickle
import pygame


class Test:
    def __init__(self, surface):
        self.surface = surface
        self.name = "Test"

    def __getstate__(self):
        state = self.__dict__.copy()
        surface = state.pop("surface")
        state["surface_string"] = (pygame.image.tostring(surface, "RGB"), surface.get_size())
        return state

    def __setstate__(self, state):
        surface_string, size = state.pop("surface_string")
        state["surface"] = pygame.image.fromstring(surface_string, size, "RGB")
        self.__dict__.update(state)


t = Test(pygame.Surface((100, 100)))
b = pickle.dumps(t)
t = pickle.loads(b)

print(t.surface)

要查看可以使用哪些模式将数据存储为字符串(此处为“RGB”),请查看 into the documentation

关于python - 无法用 pickle 序列化 pygame.Surface 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150906/

相关文章:

Python 和 Pygame : Ball collision with interior of circle

python - Pygame,玩家与房间中不同墙壁的碰撞

python - 如何在pygame中获取图片大小(python)

python - 列表的 get() 的惯用 python 等价物是什么?

python - Django URL 正则表达式

python - Django rest 框架中的 self.get_serializer 和 Serializer 对象有什么区别?

python - 如何修复 Django 中的 "abort"问题?

python - self.sendLine 还是 self.transport.write?

python - Pygame 声音延迟 - 与缓冲区/采样无关

python - 在 pygame 中显示曲面时出现问题