我有一个插入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中的值是简单类型(如string,dict等),则此方法有效。但如果value是对象,则无法在put函数内部进行pickle。我得到的错误是:
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError:无法锁定锁定对象
答案 0 :(得分:3)
您可以使用更好的序列化程序,例如dill
,它可以在python中挑选Lock
和大多数对象。
>>> import threading
>>> l = threading.Lock()
>>>
>>> import dill
>>> dill.dumps(l)
'\x80\x02cdill.dill\n_create_lock\nq\x00\x89\x85q\x01Rq\x02.'
然后,您可以将大多数对象保存到数据库,方法是先转换为pickle字符串。
答案 1 :(得分:1)
阅读Python关于序列化的文档 - pickle — Python object serialization。如果您控制对象的定义,则可以提供__getstate__()
方法,该方法可以删除锁定等不可序列化的属性。
我使用它来设置锁定None
,然后使用__setstate__()
作为反序列化挂钩来重新初始化锁。