2010-06-14 5 views
6

Ich habe Deserialize ein Wörterbuch in PHP, die mit cPickle in Python serialisiert wurde.Python cPickle Deserialisierung von PHP?

In diesem speziellen Fall könnte ich wahrscheinlich nur regexp die gesuchte Information, aber gibt es einen besseren Weg? Irgendwelche Erweiterungen für PHP, die es mir ermöglichen würden, das ganze Wörterbuch nativer zu deserialisieren?

Anscheinend ist es in Python wie folgt serialisiert:

import cPickle as pickle 

data = { 'user_id' : 5 } 
pickled = pickle.dumps(data) 
print pickled 

Inhalt solchen Serialisierung kann nicht einfach hier eingefügt werden, weil es binäre Daten enthält.


Lösung

Seit Python Ende Django ist, landete ich own JSON SessionStore Schaffung oben.

+3

Sie erwähnten, dass die Serialisierung nicht unter Ihrer Kontrolle steht. Wie erhalten Sie diese gebeizten Daten? Eine lokale Datei? –

+0

Es kommt aus der Datenbank in Django, es ist Session_Data in Django Session-Tabelle. Ich schreibe wahrscheinlich SessionMiddleware, um die Sitzungsdaten als JSON serialisieren zu können. Ich wünschte nur, ich müsste die Django App dafür nicht ändern. – Ciantic

Antwort

7

Wenn Sie Datenobjekte zwischen Programmen teilen möchten, die in verschiedenen Sprachen geschrieben wurden, ist es möglicherweise einfacher, serialisiert/deserialisiert zu werden, indem Sie beispielsweise JSON verwenden. Die meisten gängigen Programmiersprachen haben eine JSON-Bibliothek.

+2

Python 2.6+ hat es eingebaut, und es gibt simplejson für frühere Versionen. –

+2

Obwohl eine gute Idee, der Serialisierungsteil ist nicht unter meiner Kontrolle. – Ciantic

+0

Ich dachte zuerst, ich möchte nicht die Django App hacken, aber dann könnte es wieder schneller Lösung sein. Also hier ist mein einfacher [JSON SessionStore für Django] (http://gist.github.com/441132) – Ciantic

5

Können Sie einen Systemanruf tätigen? Sie könnten ein Python-Skript wie folgt verwenden, um die Beize Daten in json zu konvertieren:

# pickle2json.py 
import sys, optparse, cPickle, os 
try: 
    import json 
except: 
    import simplejson as json 

# Setup the arguments this script can accept from the command line 
parser = optparse.OptionParser() 
parser.add_option('-p','--pickled_data_path',dest="pickled_data_path",type="string",help="Path to the file containing pickled data.") 
parser.add_option('-j','--json_data_path',dest="json_data_path",type="string",help="Path to where the json data should be saved.") 
opts,args=parser.parse_args() 

# Load in the pickled data from either a file or the standard input stream 
if opts.pickled_data_path: 
    unpickled_data = cPickle.loads(open(opts.pickled_data_path).read()) 
else: 
    unpickled_data = cPickle.loads(sys.stdin.read()) 

# Output the json version of the data either to another file or to the standard output 
if opts.json_data_path: 
    open(opts.json_data_path, 'w').write(json.dumps(unpickled_data)) 
else: 
    print json.dumps(unpickled_data) 

Auf diese Weise, wenn Ihr die Daten aus einer Datei bekommen Sie so etwas tun könnte:

<?php 
    exec("python pickle2json.py -p pickled_data.txt", $json_data = array()); 
?> 

oder wenn Sie wollen, dass es diese in einer Datei speichern aus:

<?php 
    system("python pickle2json.py -p pickled_data.txt -j p_to_j.json"); 
?> 

Alle oben wahrscheinlich der Code nicht perfekt ist (ich bin kein PHP-Entwickler), aber würde so etwas wie dies für Sie arbeiten?

1

Wenn der Pickle mit dem von Ihnen angezeigten Code erstellt wird, enthält er keine Binärdaten - es sei denn, Sie rufen Newlines als "Binärdaten" auf. Siehe the Python docs. Der folgende Code wurde von Python 2.6 ausgeführt.

>>> import cPickle 
>>> data = {'user_id': 5} 
>>> for protocol in (0, 1, 2): # protocol 0 is the default 
...  print protocol, repr(cPickle.dumps(data, protocol)) 
... 
0 "(dp1\nS'user_id'\np2\nI5\ns." 
1 '}q\x01U\x07user_idq\x02K\x05s.' 
2 '\x80\x02}q\x01U\x07user_idq\x02K\x05s.' 
>>> 

Welche der oben genannten sieht am ähnlichsten, was Sie sehen? Kannst du den Inhalt der gebeizten Datei posten, wie er von einem Hex-Editor/Dumper angezeigt wird, oder was ist das PHP-Äquivalent von Pythons repr()? Wie viele Artikel in einem typischen Wörterbuch? Welche Datentypen außer "Integer" und "Zeichenfolge von 8-Bit-Bytes" (welche Codierung?)?

0

Ich hatte das gleiche Problem. Ich habe keine Lösung gefunden, also habe ich meinen eigenen minimalistischen Port des Python-Moduls in PHP erstellt. Später fand ich Zend Serializer Adapter PythonPickle von Zend Framework.