PHP的cPickle反序列化来自PHP?

时间:2010-06-14 20:58:14

标签: php python json serialization pickle

我必须反序列化PHP中使用 cPickle in Python 序列化的字典

在这种特定情况下,我可能只是正则表达所需信息,但有更好的方法吗? PHP的任何扩展都允许我在整个字典中更加本地反序列化吗?

显然它在Python中是这样序列化的:

import cPickle as pickle

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

这种序列化的内容不能轻易粘贴到此处,因为它包含二进制数据。


解决方案

由于Python结尾是Django,我最终创建了own JSON SessionStore

5 个答案:

答案 0 :(得分:7)

如果要在使用不同语言编写的程序之间共享数据对象,则可能更容易使用JSON之类的序列化/反序列化。大多数主要的编程语言都有一个JSON库。

答案 1 :(得分:5)

你可以打电话吗?您可以使用这样的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开发人员),但是这样的东西对你有用吗?

答案 2 :(得分:1)

如果pickle是由您显示的代码创建的,那么它将不包含二进制数据 - 除非您调用换行符“binary data”。见the Python docs。以下代码由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.'
>>>

上述哪一项最像您所看到的?你可以发布由十六进制编辑器/转储器显示的pickle文件内容,或者Python的repr()的PHP等价物吗?典型字典中有多少项?除了“整数”和“8位字节的字符串”之外的哪些数据类型(什么编码?)?

答案 3 :(得分:1)

我知道这很古老,但我只需要为 Django 1.3 应用程序(大约 2012 年)执行此操作,然后发现:

https://github.com/terryf/Phpickle

以防万一,有一天,其他人需要同样的解决方案。

答案 4 :(得分:0)

我遇到了同样的问题。 我没有找到解决方案所以我在php中创建了自己的简化python模块端口。 后来我从Zend Framework找到了 Zend Serializer Adapter PythonPickle