Python开发之序列化与反序列化:pickle、json模块使(3)

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

 

5 总结

  (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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7e62b360d6abbdcb09359ab29f772ae7.html