>>> p = Person('张三' , 30 , False) >>> import pickle >>> pp = pickle.dumps(p) >>> type(pp) <class 'bytes'> >>> pp b'\x80\x03c__main__\nPerson\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x06\x00\x00\x00\xe5\xbc\xa0\xe4\xb8\x89q\x04X\x03\x00\x00\x00ageq\x05K\x1eX\t\x00\x00\x00isMarriedq\x06\x89ub.' >>> p2 = pickle.loads(pp) >>> type(p2) <class '__main__.Person'> >>> p2.name '张三'
甚至pickle模块还能够对Peron本身进行序列化:
>>> per = pickle.dumps(Person) >>> per b'\x80\x03c__main__\nPerson\nq\x00.' >>> per2 = pickle.loads(per) >>> per2 <class '__main__.Person'>
如果用json对Person实例对象进行序列化,就会报错:
>>> import json >>> p = Person('张三' , 30 , False) >>> json.dumps(p) Traceback (most recent call last): File "<pyshell#49>", line 1, in <module> json.dumps(p) …… TypeError: Object of type 'Person' is not JSON serializable
如果非要用json对Person对象进行序列化,必须先定义一个将Person对象转化为字典(dict)的方法:
>>> def person2dict(per): return { 'name':per.name , 'age':per.age , 'isMarried':per.isMarried } >>> p3 = json.dumps(p , default=person2dict) >>> type(p3) <class 'str'> >>> p3 '{"name": "\\u5f20\\u4e09", "age": 30, "isMarried": false}' >>> p3 = json.dumps(p , default=person2dict , ensure_ascii=False) >>> type(p3) <class 'str'> >>> p3 '{"name": "张三", "age": 30, "isMarried": false}'
当然,也不能直接进行反序列化,不然也只会得到一个字典:
>>> p4 = json.loads(p3) >>> type(p4) <class 'dict'> >>> p4 {'name': '张三', 'age': 30, 'isMarried': False}
此时,也要定义一个将字典转换为Person类实例的方法,在进行反序列化:
>>> def dict2person(d): return Person(d['name'],d['age'],d['isMarried']) >>> p5 = json.loads(p3 , object_hook=dict2person) >>> type(p5) <class '__main__.Person'> >>> p5.name '张三'
(2)pickle序列化结果为bites类型,只适合于Python机器之间的交互。
json序列化结果为str类型,能够被多种语言识别,可用于与其他程序设计语言交互。
目前,JSON格式字符串已经成为网络传输中的一种标准格式,所以在web后台开发中通常用json模块来序列化而不是pickle模块。
JSON和Python内置的数据类型对应如下:
JSON类型 Python类型 {} dict [] list "string" 'str'或u'unicode' 1234.56 int或float true/false True/False null None
(1)序列化与反序列化是为了解决内存中对象的持久化与传输问题;
(2)Python中提供了pickle和json两个模块进行序列化与反序列化;
(3)dumps()和dump()用于序列化,loads()和load()用于反序列化;
(4)pickle模块能序列化任何对象,序列化结果为bites类型,只适合于Python机器之间交互;
json模块只能序列化Python基本类型,序列化结果为json格式字符串,适合不同开发语言之间交互。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx