2011-01-29 2 views
2

Comment envoyer un objet de classe dans la charge utile d'une tâche en python? Je veux envoyer un objet dans les paramètres d'une tâche.
Lorsque j'utilise simplejson, j'obtiens l'erreur: Object is not serializable. Lorsque j'utilise le cornichon, j'obtiens KeyValue Error.
Comment faire?Objet de charge utile Google App Engine

C'est la classe que je veux sérialisation

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 

Je reçois l'erreur suivante lorsque je passe l'objet décapé comme charge utile et décharger plus tard

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' 
+0

Je m'attendrais à ce que 'Pickle' fonctionne sans accroc. –

Répondre

3

Le problème était avec le type de données qui a été déchargé. Je l'ai casté pour taper str et tout semblait fonctionner correctement. Je viens de modifier à

icfg = Matrix2D_icfg("icfg") #declaring object 
icfg_compress = pickle.dumps(icfg) #to pickle 

icfg = pickle.loads(str(icfg_compress)) # to unload 
0

Ceci est une partie de ma service de mise en file d'attente des tâches. Il publie simplement une liste à une autre tâche pour décomposer le projet en parties gérables. C'est juste une partie, mais vous devriez avoir la plupart de l'idée de ce que vous devez faire.

Pour enregistrer:

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) 

pour le charger:

from django.utils import simplejson as json 

    class TaskQueuer(webapp.RequestHandler): 
    def post(self): 
     request = self.request.body 
     task_list = json.loads(request) 
+0

Cette méthode ne fonctionnera que pour les listes. Il ne fonctionne pas pour les objets de classe – Sam

1

Avez-vous regardé le deferred library? Il est conçu exactement pour cela et prend en charge la sérialisation et la désérialisation pour vous. Pouvez-vous partager la définition de l'objet que vous essayez de sérialiser?