4

我有一个简单的类来存储与这样的电路板关联的数据:

class boardClass():

    def __init__(self,boardName):
        self.__name=boardName
        self.__boardMappings= {boardName:{
                                  'FastMode':
                                  {'CPU_A':{'mipi':[], 'gpen':[]},
                                   'CPU_B':{'mipi':[], 'gpen':[]}

                                  'SlowMode':
                                  {'CPU_A':{'mipi':[], 'gpen':[]},
                                   'CPU_B':{'mipi':[], 'gpen':[]}                                   
                                  }
                                 }                       
                               }


    def setMode(self, board, mode, cpu,mipi,gpen):
        self.__boardMappings[board][mode][cpu]['mipi']=mipi
        self.__boardMappings[board][mode][cpu]['gpen']=gpen

    def getName(self):
        return self.__name

我在另一个类中使用 pickle 将boardClass数据存储在文件中,然后读取它们:

def onSave(self,boardName):
        board=boardClass.boardClass(boardName)
        name=boardName+".brd"
        file=open(name,"wb")            
        pickle.dump(board,file)                        
        loadedBoard= pickle.load( open( file, "rb" ))            
        print "Loaded board name is : ",loadedBoard.getName()

当我调用onSave()方法来腌制 boardClass 时,它会给出几个以这个结尾的错误:

File "C:\Python27\lib\copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle PySwigObject objects

这个 boardClass 是一个非常简单的容器。为什么不能腌制?

4

4 回答 4

5

不是从“无”继承,而是从“对象”继承——这样你的类将不再是“类实例”——它将是新式类的适当实例,因此是“可挑选的”

换句话说,只需尝试更改此行:

class boardClass():

对此:

class boardClass(object):

更新:这个答案来自 Python 2 时代 - 并且需要从对象显式继承。在 Python 3 中不再是这种情况:继承object自是自动的,如果 pickle 失败是由于其他原因。

于 2012-04-25T03:05:46.110 回答
1

你不能 pickle PySwigObjects,但是这里有一个解决方法:Pickling objects

于 2015-01-22T14:41:15.093 回答
1

如果您真的想保留您的对象,使其在参数中不采用“对象”,您可以使用类似dillcloudpickle可以序列化旧式和新式类实例的序列化程序(对于 python 2.x 和 3.x 都适用)。 x 语法)。

于 2014-07-10T03:41:07.657 回答
1

这是一个老问题,名字很笼统,所以如果你现在看到它,你可能想设置__getstate____setstate__的类,这样泡菜就会知道如何转储和加载你定义的类。

请参阅此处的示例

如果您的类很简单(例如,只有整数和字符串作为成员和任何方法),它应该可以自动选择。

于 2020-03-12T16:35:51.630 回答