我建立了一个玩具分布式数据库。这个数据库的事务是这样的:
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不是字典
答案 0 :(得分:1)
您的__getstate__
方法返回一个元组,而不是字典。这很可能是你的问题。虽然您可以使用自定义__getstate__
和__setstate__
使用元组,但默认情况下,Python会使用字典作为状态(具体而言,它会返回self.__dict__
)。
因此,如果您使用较旧的对象进行腌制(在__getstate__
之前),则会存储__dict__
而不是您的元组。