我有一个插入MongoDB的put和get函数:
def put(self,key,value):
key = self.path+"&&"+key
value1 = Binary(pickle.dumps(value))
entry = {"keyname":key,"info":value1}
self.filenode.update({"keyname":key}, { "$set" : entry }, upsert=True)
def get(self,key):
key1 = key
key = self.path+"&&"+key
res = self.filenode.find_one({"keyname":key})
if "info" in res:
x = res["info"]
res1 = pickle.loads(x)
return res1
else:
return None
如果put中的value是简单类型,比如string、dict等,那么这是有效的;但是如果value是一个对象,它就不能在put函数中进行pickle。我得到的错误是:
^{pr2}$类型错误:无法pickle锁定对象
您可以使用更好的序列化程序,如
dill
,它可以pickleLock
和python中的大多数对象。在然后,通过首先转换为pickled字符串,可以将大多数对象保存到数据库中。在
阅读一下Python关于序列化的文档-pickle — Python object serialization。如果控制对象的定义,则可以提供一个
__getstate__()
方法,该方法可以删除锁等不可序列化的属性。在我使用这个方法将锁设置为
None
,然后使用__setstate__()
作为反序列化钩子来重新初始化锁。在相关问题 更多 >
编程相关推荐