谷歌应用引擎有效负载对象
如何在Python中将一个类的对象放到任务的负载中发送?我想把一个对象作为任务的参数发送。
当我使用 simplejson
时,出现了错误:对象无法序列化
。
当我使用pickle时,出现了KeyValue错误
。
我该怎么做呢?
这是我想要序列化的类
class Matrix2D_icfg:
name = ""
indices = []
value = {}
def __init__(self,s):
self.name = s
self.indices = []
def __getitem__(self,i):
self.indices.append(i)
if len(self.indices)==2:
(m,n) = self.indices
self.indices = []
if self.value.has_key(m*4276+n) == True :
value = self.value[m*4276+n]
else :
value = 0
return value
else: return self
def __setitem__(self,i,value):
self.indices.append(i)
if len(self.indices)==2:
(m,n) = self.indices
if value != 0 : self.value[m*4276+n] = value
self.indices = []
return self
icfg = Matrix2D_icfg("icfg") #declaring object
icfg_compress = pickle.dumps(icfg) #to pickle
icfg = pickle.loads(icfg_compress) # to unload
当我将经过pickle处理的对象作为负载传递并在之后解压时,出现了以下错误
File "/Users/praveensekar/myFYP/gaecode/pknots4d.2.3/pknots.py", line 439, in post
icfg = pickle.loads(icfg_compress)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pickle.py", line 1374, in loads
return Unpickler(file).load()
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
KeyError: '\x00'
3 个回答
0
这是我任务队列服务的一部分。它的作用是把一个列表发送到另一个任务中,这样可以把项目分成更容易处理的小部分。这只是其中的一部分,但你应该能大致明白你需要做什么。
要保存它:
from django.utils import simplejson as json
.... stuff happens
index = 0
current_list = []
while index < len(item_list):
if index+500 < len(item_list):
for item in item_list[index:index+500]:
current_list.append(item.item_number)
jsondump = json.dumps(current_list)
taskqueue.add(url = '/queuer',
headers = {'Content-Type':'application/json'},
payload = jsondump)
要加载它:
from django.utils import simplejson as json
class TaskQueuer(webapp.RequestHandler):
def post(self):
request = self.request.body
task_list = json.loads(request)
1
你有没有看过deferred库?这个库就是为这个目的而设计的,它可以帮你处理数据的保存和读取。
3
问题出在卸载的数据类型上。我把它转换成了字符串类型(str),然后一切看起来都正常了。 我只是把它改成了
icfg = Matrix2D_icfg("icfg") #declaring object
icfg_compress = pickle.dumps(icfg) #to pickle
icfg = pickle.loads(str(icfg_compress)) # to unload