将python对象序列化成php能读取的格式(即能反序列化到对象)
转载自:http://my.oschina.net/zuoan001/blog/94914
代码如下:
#coding:utf-8
# vim: encoding=utf-8:ft=python:et:sw=4:ts=8:sts=4:
#
# Copyright (c) 2005 Scott Hurring.
# Licensed under the GPL (undefined version). import types, string """
Serialize class for the PHP serialization format. @version v0.4 BETA
@author Scott Hurring; scott at hurring dot com
@copyright Copyright (c) 2005 Scott Hurring
@license http://opensource.org/licenses/gpl-license.php GNU Public License
$Id: PHPSerialize.py,v 1.1 2006/01/08 21:53:19 shurring Exp $ Most recent version can be found at:
http://hurring.com/code/python/phpserialize/ Usage:
# Create an instance of the serialize engine
s = PHPSerialize()
# serialize some python data into a string
serialized_string = s.serialize(string)
# encode a session list (php's session_encode)
serialized_string = s.session_encode(list)
""" class PHPSerialize(object):
"""
Class to serialize data using the PHP Serialize format. Usage:
serialized_string = PHPSerialize().serialize(data)
serialized_string = PHPSerialize().session_encode(list)
""" def __init__(self):
pass def session_encode(self, session):
"""Thanks to Ken Restivo for suggesting the addition
of session_encode
"""
out = ""
for (k,v) in session.items():
out = out + "%s|%s" % (k, self.serialize(v))
return out def serialize(self, data):
return self.serialize_value(data) def is_int(self, data):
"""
Determine if a string var looks like an integer
TODO: Make this do what PHP does, instead of a hack
"""
try:
int(data)
return True
except:
return False def serialize_key(self, data):
"""
Serialize a key, which follows different rules than when
serializing values. Many thanks to Todd DeLuca for pointing
out that keys are serialized differently than values! From http://us2.php.net/manual/en/language.types.array.php
A key may be either an integer or a string.
If a key is the standard representation of an integer, it will be
interpreted as such (i.e. "8" will be interpreted as int 8,
while "08" will be interpreted as "08").
Floats in key are truncated to integer.
"""
# Integer, Long, Float, Boolean => integer
if type(data) is types.IntType or type(data) is types.LongType \
or type(data) is types.FloatType or type(data) is types.BooleanType:
return "i:%s;" % int(data) # String => string or String => int (if string looks like int)
elif type(data) is types.StringType:
if self.is_int(data):
return "i:%s;" % int(data)
else:
return "s:%i:\"%s\";" % (len(data), data); # None / NULL => empty string
elif type(data) is types.NoneType:
return "s:0:\"\";" # I dont know how to serialize this
else:
raise Exception("Unknown / Unhandled key type (%s)!" % type(data)) def serialize_value(self, data):
"""
Serialize a value.
""" # Integer => integer
if type(data) is types.IntType:
return "i:%s;" % data # Float, Long => double
elif type(data) is types.FloatType or type(data) is types.LongType:
return "d:%s;" % data # String => string or String => int (if string looks like int)
# Thanks to Todd DeLuca for noticing that PHP strings that
# look like integers are serialized as ints by PHP
elif type(data) is types.StringType:
if self.is_int(data):
return "i:%s;" % int(data)
else:
return "s:%i:\"%s\";" % (len(data), data); # None / NULL
elif type(data) is types.NoneType:
return "N;"; # Tuple and List => array
# The 'a' array type is the only kind of list supported by PHP.
# array keys are automagically numbered up from 0
elif type(data) is types.ListType or type(data) is types.TupleType:
i = 0
out = []
# All arrays must have keys
for k in data:
out.append(self.serialize_key(i))
out.append(self.serialize_value(k))
i += 1
return "a:%i:{%s}" % (len(data), "".join(out)) # Dict => array
# Dict is the Python analogy of a PHP array
elif type(data) is types.DictType:
out = []
for k in data:
out.append(self.serialize_key(k))
out.append(self.serialize_value(data[k]))
return "a:%i:{%s}" % (len(data), "".join(out)) # Boolean => bool
elif type(data) is types.BooleanType:
return "b:%i;" % (data == 1) # I dont know how to serialize this
else:
raise Exception("Unknown / Unhandled data type (%s)!" % type(data)) #!/usr/bin/env python2.4
# vim: encoding=utf-8:ft=python:et:sw=4:ts=8:sts=4:
#
# Copyright (c) 2005 Scott Hurring.
# Licensed under the GPL (undefined version). import types, string, re """
Unserialize class for the PHP serialization format. @version v0.4 BETA
@author Scott Hurring; scott at hurring dot com
@copyright Copyright (c) 2005 Scott Hurring
@license http://opensource.org/licenses/gpl-license.php GNU Public License
$Id: PHPUnserialize.py,v 1.1 2006/01/08 21:53:19 shurring Exp $ Most recent version can be found at:
http://hurring.com/code/python/phpserialize/ Usage:
# Create an instance of the unserialize engine
u = PHPUnserialize()
# unserialize some string into python data
data = u.unserialize(serialized_string)
""" class PHPUnserialize(object):
"""
Class to unserialize something from the PHP Serialize format. Usage:
u = PHPUnserialize()
data = u.unserialize(serialized_string)
""" def __init__(self):
pass def session_decode(self, data):
"""Thanks to Ken Restivo for suggesting the addition
of session_encode
"""
session = {}
while len(data) > 0:
m = re.match('^(\w+)\|', data)
if m:
key = m.group(1)
offset = len(key)+1
(dtype, dataoffset, value) = self._unserialize(data, offset)
offset = offset + dataoffset
data = data[offset:]
session[key] = value
else:
# No more stuff to decode
return session return session def unserialize(self, data):
return self._unserialize(data, 0)[2] def _unserialize(self, data, offset=0):
"""
Find the next token and unserialize it.
Recurse on array. offset = raw offset from start of data return (type, offset, value)
""" buf = []
dtype = string.lower(data[offset:offset+1]) #print "# dtype =", dtype # 't:' = 2 chars
dataoffset = offset + 2
typeconvert = lambda x : x
chars = datalength = 0 # int => Integer
if dtype == 'i':
typeconvert = lambda x : int(x)
(chars, readdata) = self.read_until(data, dataoffset, ';')
# +1 for end semicolon
dataoffset += chars + 1 # bool => Boolean
elif dtype == 'b':
typeconvert = lambda x : (int(x) == 1)
(chars, readdata) = self.read_until(data, dataoffset, ';')
# +1 for end semicolon
dataoffset += chars + 1 # double => Floating Point
elif dtype == 'd':
typeconvert = lambda x : float(x)
(chars, readdata) = self.read_until(data, dataoffset, ';')
# +1 for end semicolon
dataoffset += chars + 1 # n => None
elif dtype == 'n':
readdata = None # s => String
elif dtype == 's':
(chars, stringlength) = self.read_until(data, dataoffset, ':')
# +2 for colons around length field
dataoffset += chars + 2 # +1 for start quote
(chars, readdata) = self.read_chars(data, dataoffset+1, int(stringlength))
# +2 for endquote semicolon
dataoffset += chars + 2 if chars != int(stringlength) != int(readdata):
raise Exception("String length mismatch") # array => Dict
# If you originally serialized a Tuple or List, it will
# be unserialized as a Dict. PHP doesn't have tuples or lists,
# only arrays - so everything has to get converted into an array
# when serializing and the original type of the array is lost
elif dtype == 'a':
readdata = {} # How many keys does this list have?
(chars, keys) = self.read_until(data, dataoffset, ':')
# +2 for colons around length field
dataoffset += chars + 2 # Loop through and fetch this number of key/value pairs
for i in range(0, int(keys)):
# Read the key
(ktype, kchars, key) = self._unserialize(data, dataoffset)
dataoffset += kchars
#print "Key(%i) = (%s, %i, %s) %i" % (i, ktype, kchars, key, dataoffset) # Read value of the key
(vtype, vchars, value) = self._unserialize(data, dataoffset)
dataoffset += vchars
#print "Value(%i) = (%s, %i, %s) %i" % (i, vtype, vchars, value, dataoffset) # Set the list element
readdata[key] = value # +1 for end semicolon
dataoffset += 1
#chars = int(dataoffset) - start # I don't know how to unserialize this
else:
raise Exception("Unknown / Unhandled data type (%s)!" % dtype) return (dtype, dataoffset-offset, typeconvert(readdata)) def read_until(self, data, offset, stopchar):
"""
Read from data[offset] until you encounter some char 'stopchar'.
"""
buf = []
char = data[offset:offset+1]
i = 2
while char != stopchar:
# Consumed all the characters and havent found ';'
if i+offset > len(data):
raise Exception("Invalid")
buf.append(char)
char = data[offset+(i-1):offset+i]
i += 1 # (chars_read, data)
return (len(buf), "".join(buf)) def read_chars(self, data, offset, length):
"""
Read 'length' number of chars from data[offset].
"""
buf = []
# Account for the starting quote char
#offset += 1
for i in range(0, length):
char = data[offset+(i-1):offset+i]
buf.append(char) # (chars_read, data)
return (len(buf), "".join(buf)) def dumps(data, protocol=None):
return PHPSerialize().serialize(data) def loads(data):
return PHPUnserialize().unserialize(data)
完毕
将python对象序列化成php能读取的格式(即能反序列化到对象)的更多相关文章
- C#对象序列化成XML,以及自定义标签名
C#对象序列化操作: public class XMLHelper { /// <summary> /// 对象序列化成 XML String /// </summary> p ...
- C#将对象序列化成JSON字符串
C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...
- 将Java对象序列化成JSON和XML格式
1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...
- 在C#中将对象序列化成Json格式
在C#中将对象转换为Json格式的字符串. //匿名对象 var dataObj = new { Number = 1, Name = "Json" }; //将返回的时间格式解析 ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- 对象序列化成Json字符串 及 反序列化成对象
一. public static string JsonSerializer<T>(T t) { DataContractJsonSerializer ...
- ObjC 利用反射和KVC实现嵌套对象序列化成JSON数据
原理: 0.创建一个新的可变字典:NSMutableDictionary 1.采用class_copyPropertyList函数遍历对象的属性 2.property_getName获取属性名,val ...
- C#实体对象序列化成Json并让字段的首字母小写的两种解决方法
引言:最近在工作中遇到与某些API对接的post的数据需要将对象的字段首字母小写.解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性 ...
- XmlSerializer 对象序列化成XML 自定义编码格式(gb2312)
随着面向服务(SOA)的开发方式的兴起,客户端和服务端之间的消息传送,很多采用了XML的格式.但是大家在日常的开发中,应该会有这么种体验,就是组织xml格式的代码太繁琐,这篇随笔也是为了和大家分享下简 ...
随机推荐
- 通过Cookie来记住用户名出现乱码问题(URL编码)
在登录时,提交一个中文名的用户名到服务器并返回到客户端的Cookie中时, 这个过程会后台会报 java.lang.IllegalArgumentException (非法数据异常) -->在给 ...
- 一个LaTeX 中文文档的简单而实用的模板
网上找的一个latex中文模板,感觉很简单,在我机器上有点小问题,完善记录一下. %要运行该模板,LaTex需要安装CJK库以支持汉字. %字体大小为12像素,文档类型为article %如果你要写论 ...
- (8)python 类和对象
一.类和对象 python可以动态的添加删除变量和方法 类中的方法至少要有一个参数,第一个参数会被绑定到类的实例上,通常命名为self 1.构造函数 类中的构造方法名为 __init__(self,. ...
- Codeforces #445 Div2 D
#445 Div2 D 题意 给出一些字符串,要求构造一个最短的且字典序最小的字符串,使得给出的字符串都为目标字符串的子串,且这些字符串作为子串出现的次数都是最多的,如果不存在目标字符串输出 &quo ...
- RobotFramework自动化测试框架系统关键字之断言
一.基础 RobotFramework带有丰富的系统关键,使用时无需导入,直接使用,为写自动化用例带来了极大的方便:不能停留在知道或者是会得程度,只有熟练使用各关键字,才能提升自动化用例的写作效率.下 ...
- [Codeforces 8E] Beads
Brief Intro: 将所有n位二进制串中满足字典序不大于其逆序串,取反串,逆序取反串中按字典序排序的第m个输出 n<=50 Algorithm: 首次接触数位DP的题目 根据数据范围,我们 ...
- 【博弈论】【SG函数】hdu1848 Fibonacci again and again
某个状态的SG函数被定义为 除该状态能一步转移到的状态的SG值以外的最小非负整数. 有如下性质:从SG值为x的状态出发,可以转移到SG值为0,1,...,x-1的状态. 不论SG值增加与否,我们都可以 ...
- 【权值分块】bzoj1503 [NOI2004]郁闷的出纳员
权值分块,离散化非常蛋疼,只能离散化搞…… 需要支持操作:删除<=某个值得所有权值==打标记 O(sqrt(n)) 码长和我的平衡树差不多……速度快3倍左右. #include<cstdi ...
- Scala实战高手****第3课:在IDE下开发第一个Scala程序纯傻瓜式彻底透彻解析
- javascript快速入门6--Script标签与访问HTML页面
Script标签 script标签用于在HTML页面中嵌入一些可执的脚本 <script> //some script goes here </script> script标签 ...