我通过pickle转储一个selfdefine类对象,但有时无法加载它

2024-05-29 04:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我建立了一个玩具分布式数据库。该数据库的事务如下:

class Handle(object):
def __init__(self,fragment_no,table,key,data):
    self.fragment_no=fragment_no
    self.data=data
    self.table=table
    self.key=key
def __setstate__(self,state):
    self.fragment_no,self.table,self.key,self.data=state
def __getstate__(self):
    return (self.fragment_no,self.table,self.key,self.data)
class Transaction(object):
def __init__(self,fragment_no,t_id,tran_type="a"):
    self.t_id=t_id
    self.fragment_no=fragment_no
    self.t_handles=[]
    self.checksum=""
    self.tran_type=tran_type
def add_handle(self,handle):
    self.t_handles.append(handle)
def compute_checksum(self):
    self.checksum=""
def test_checksum(self):
    return True
def is_valiad(self):
    pass
def __setstate__(self,state):
    self.t_id,self.t_handles,self.fragment_no,self.tran_type,self.checksum=state
def __getstate__(self):
    return (self.t_id,self.t_handles,self.fragment_no,self.tran_type,self.checksum)
class RemoteTransaction(Transaction):
"""
state consist of:
    cordinator:begin,ask,commit(abort),end
    particapant:begin,replayed,end
"""
def __init__(self,dbt_id,fragment_no=0,t_id=0,tran_type="a"):
    Transaction.__init__(self, fragment_no, t_id, tran_type)
    self.state="begin"
    self.dbt_id=dbt_id
def set_data(self,fragment_no,t_id):
    self.fragment_no=fragment_no
    self.t_id=t_id
def __setstate__(self,state):
    self.state,self.dbt_id,self.t_id,self.t_handles,self.fragment_no,self.tran_type,self.checksum=state
def __getstate__(self):
    return (self.state,self.dbt_id,self.t_id,self.t_handles,self.fragment_no,self.tran_type,self.checksum)    

在提交部分,代码是

f=open("./"+str(self.port)+"/database/"+str(tran.fragment_no)+"/journal/"+str(tran.t_id),"wb")
pickle.dump(tran,f)
f.close()
file=open("./"+str(self.port)+"/database/"+str(tran.fragment_no)+"/journal/"+str(tran.t_id),'rb')
c=pickle.load(file)

有时这个代码是有效的。但是当事务有两个句柄时,这部分代码可能会中断 下面是事务崩溃时的状态(我使用print(tran.getstate()func)):

(1, [<Journal.transaction.Handle object at 0x03D3F7D0>, <Journal.transaction.Handle object at 0x03D3F950>], 1, 'a', '')

错误在于: faultString:str::state不是字典


Tags: keynoselfiddatadeftypetable
1条回答
网友
1楼 · 发布于 2024-05-29 04:21:37

您的__getstate__方法返回的是元组,而不是字典。这很可能是你的问题。虽然您可以有一个使用元组的自定义__getstate____setstate__,但是默认情况下Python使用字典作为状态(具体来说,它返回self.__dict__)。你知道吗

因此,如果对旧对象进行pickle处理(在__getstate__之前),它们将存储__dict__,而不是元组。你知道吗

相关问题 更多 >

    热门问题