Python - Blender Game Engine: _pickle.PicklingError: Can't pickle <class '__main__."a class"'>: attribute lookup "a class" on __main__ failed

Python - Blender Game Engine: _pickle.PicklingError: Can't pickle <class '__main__."a class"'>: attribute lookup "a class" on __main__ failed

import pickle

class NoClass():
    def __init__(self, name, level, cls, time_played):
        self.name = name
        self.level = level
        self.cls = cls
        self.time_played = time_played

def Write_char_file(registered_username):
    avatar = NoClass('',1,'',0) #--------i am trying to pickle and write this
    a = str('Characters\%s.txt' % registered_username) #---- the saving file
    f = open(a, 'wb')
    f.write(pickle.dumps(avatar))
    f.close()

def Asign_to_slot(char_lst):
    pass

Asign_to_slot(Write_char_file('my_name'))

When trying to run this in bge it raises that error BUT when i run it with python IDLE there isn't a problem and i manage to write the pickled class in the file though i know classes usually can't be pickled then i even manage to open the file, unpickle it and print the class' attributes

"_pickle.PicklingError: Can't pickle <class '__main__.NoClass'>: attribute lookup NoClass on __main__ failed"

因为这在 blender 中 运行 时有效并且仅在游戏引擎中失败,我认为这与游戏引擎 python 绑定中的优化有关。

遵循 handling stateful objects example and adding a custom __getstate__ also fails, indicating that the game engine probably implements custom __slots__ 仅提供最少的功能集。

解决方案似乎是直接 pickle 对象 __dict__,然后您还可以 unpickle 到新实例 __dict__

f.write(pickle.dumps(avatar.__dict__))