cPickle десериализация Python от PHP?

Я должен десериализовать словарь в PHP, который был сериализирован с помощью cPickle в Python.

В этом конкретном случае я, вероятно, мог просто regexp требуемая информация, но являюсь там лучшим путем? Какие-либо расширения для PHP, который позволил бы мне десериализовывать более исходно целый словарь?

По-видимому, это сериализируется в Python как это:

import cPickle as pickle

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

Контент такой сериализации не может быть вставлен легко к здесь, потому что она содержит двоичные данные.


Решение

Так как концом Python является Django, я закончил тем, что создал собственный JSON SessionStore.

6
задан Ciantic 16 June 2010 в 19:34
поделиться

3 ответа

Если вы хотите обмениваться объектами данных между программами, написанными на разных языках, может быть проще сериализовать/десериализовать с помощью чего-то вроде JSON. Большинство основных языков программирования имеют библиотеку JSON.

7
ответ дан 8 December 2019 в 18:32
поделиться

Можете ли вы сделать системный вызов? Вы можете использовать сценарий python, подобный этому, для преобразования данных pickle в json:

# 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)

Таким образом, если вы получаете данные из файла, вы можете сделать что-то вроде этого:

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

или если вы хотите сохранить их в напишите это:

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

Весь приведенный выше код, вероятно, не идеален (я не разработчик PHP), но сработает ли что-то подобное для вас?

5
ответ дан 8 December 2019 в 18:32
поделиться

Если pickle создается тем кодом, который вы показали, то он не будет содержать двоичных данных - если только вы не называете новые строки "двоичными данными". См. документацию по Python. Следующий код был запущен Python 2.6.

>>> 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.'
>>>

Какой из приведенных вариантов больше всего похож на то, что вы видите? Можете ли вы опубликовать содержимое маринованного файла, отображаемое шестнадцатеричным редактором/дампером или тем, что является PHP-эквивалентом repr() в Python? Сколько элементов в типичном словаре? Какие типы данных, кроме "целого числа" и "строки из 8-битных байтов" (в какой кодировке?)?

1
ответ дан 8 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: