我们把变量从内存中变成可存储或传输的过程称之为序列化

(memory to HD)序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

(HD to memory)反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

---如何序列化?

在python中提供了两个模块可进行序列化。分别是pickle和json

pickle

pickle是python中独有的序列化模块,所谓独有,就是指不能和其他编程语言的序列化进行交互,因为pickle将数据对象转化为bytes

pickle模块提供了四个功能:dumps、dump、loads、load

dumps和dump都是进行序列化,而loads和load则是反序列化

>>> import pickle
>>> d=[1,2,3,4]
>>> pickle.dumps(d)
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
>>> type(pickle.dumps(d))
<class 'bytes'>     #类型为bytes

json

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

json中的方法和pickle中差不多,也是dumps,dump,loads,load。使用上也没有什么区别,区别在于,json中的序列化后格式为字符

因为python中一切事物皆对象,所有对象都是基于类创建

的,所以,‘类’在python中占据了相当大的比重。但是我们不能将类的实例进行序列化

>>> class student(object):
...     def __init__(self,name,age,course):
...         self.name=name
...         self.age=age
...         self.course=course
...         
>>> a=student('linghuchong',24,'xixingdafa')
>>> import json
>>> json.dumps(a)
TypeError: <student object at 0x035B8230> is not JSON serializable

前面的代码之所以无法把student类实例序列化为JSON,是因为默认情况下,dumps方法不知道如何将student实例变为一个JSON的'{}'对象。

我们需要’告诉‘json模块如何转换。

>>> def st_to_dict(a):
...     return {'name':a.name,'age':a.age,'course':a.course}
...     
>>> print(json.dumps(a,default=st_to_dict))          #default参数就是告知json如何进行序列化
{"course": "xixingdafa", "name": "linghuchong", "age": 24}

当然,如果我们每定义一个类,还得再定义一下这个类的实例转换为字典的函数实在是太麻烦了!!我们有一个一劳永逸的办法。

print(json.dumps(a, default=lambda obj: obj.__dict__))

其中的__dict__不需我们在类中定义,因为通常class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量。

>>> print(a.__dict__)
{'course': 'xixingdafa', 'age': 24, 'name': 'linghuchong'}

results matching ""

    No results matching ""