python中的序列化

序列化(picking)

把不方便存储或不可传输的对象转换为可存储或可传输的数据的过程称之为序列化。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把从磁盘或网络得到的序列化数据重建为对象的过程称之为反序列化(unpickling)。序列化和反序列化实际是为了通用存储或传输而编码和解码的过程。

举例:网络游戏mabi洛奇的存档功能,当每次不想玩的时候就可以存档到服务器,然后再玩的时候不需要重新开始玩,只需要从服务器读档就可以了。现在学习的是面向对象的思想,那么不管是游戏人物还是游戏中的怪物、装备等都可以看成是一个对象。

人物对象(包含等级、性别、生命值、魔法值等等属性)
武器对象(包含武器类型、伤害值、特殊技能等等属性)
怪物对象(包含等级、经验值、攻击力、防御力等等属性)

游戏的过程就变成了:创建游戏人物就是先在内存中创建了一个人物对象,拿到武器就是在内存中创建了一个武器对象,遇到的怪物同样是在内存中生成了怪物对象。
根据学过的知识进行分析,对象数据都是保存在内存中的,但内存中的数据在断电以后是会消失的,而游戏经过存档以后,就算关机再进入游戏读取存档,这些对象数据依旧还在,因为对象数据是存储在服务器硬盘这个外部存储器,对象的数据通过存档被保存在了服务器上因而不会因为断电而丢失,存档过程就是对象的序列化。那么反序列化就是反过来将存放在硬盘中的数据再度取出形成对象。

序列化方法

在python中提供了两个模块可进行序列化。分别是 pickle 和 json ,pickle是将对象与格式为二进制编码的bytes字符之间转换,而json是将对象与格式为utf-8标准编码的str字符串之间转换,因而json的跨语言通用性更高。

pickle

pickle是python中独有的序列化模块,独有意味着只适用于python,不能和其他编程语言的序列化进行交互,因为pickle将对象与bytes数据之间进行转换。

pickle模块提供了四个方法:dumps、dump、loads、load。
dumps和dump都是进行序列化,而loads和load则是反序列化。

dumps将所传入的变量的值序列化为一个bytes二进制字节数据,然后可通过其他操作将这个bytes数据写入磁盘或者进行传输。

#使用pickle.dumps()方法仅把对象序列化为bytes数据
>>> 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二进制字节

而dump则在dumps的转换操作的基础上增加文件操作,将上述dumps序列化和文件写入两步整合为一步,序列化后直接写入文件,因此在指定dump参数时,不光要指定参数——需要传入的序列化变量,还需要指定另一个参数——写入的文件。

#使用pickle.dump()方法是把对象序列化为数据并写入文件(写入前需要open文件对象并开启文件对应的权限)
>>> f = open('pickle_test' , 'wb')    #pickle.dump方法是把对象序列化为数据并写入文件,因此需要设置文件pickle_test对应的二进制写入权限
>>> d = [1,2,3

你可能感兴趣的:(Python,python,序列化,pickle,json)