序列化和反序列化

举报
子都爱学习 发表于 2021/10/23 19:03:28 2021/10/23
【摘要】 1.什么是序列化和反序列化内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?如果是自己定义的类的实例,如何保存到一个文件中?如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例?要设计一套协议,按照某种规则,把内存中数据保存到文件中,文件是一个字节序列,所以必须把数据转换成字节序列,输出到文件,这就是序列化;反之,从文件的字节序列恢复到内存,就是反序列化;协议:类型,边...

1.什么是序列化和反序列化

内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?
如果是自己定义的类的实例,如何保存到一个文件中?
如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例?

要设计一套协议,按照某种规则,把内存中数据保存到文件中,文件是一个字节序列,所以必须把数据转换成字节序列,输出到文件,这就是序列化;反之,从文件的字节序列恢复到内存,就是反序列化;
协议:类型,边界,数据原体

定义
serialization 序列化
将内存中的对象存储下来,把它变成一个个字节;—>二进制
deserialization 反序列化
将文件中的一个个字节恢复成内存中的对象;<—二进制

序列化保存到文件就是持久化;可以将数据序列化后持久化,或者网络传输;
也可以将从文件中或者从网络接收到的字节序列反序列化;


2.pickle库

python中的序列化、反序列化模块;

dumps 对象序列化为bytes对象;
dump 对象序列化到文件对象,就是存入文件;
loads 从bytes对象反序列化;
load 对象反序列化,从文件读取数据

基本使用:

import pickle

ret = pickle.dumps(“aa”)
# b’\x80\x03X\x02\x00\x00\x00aaq\x00.’

pickle.loads(ret)
# aa

filename = ‘./test/test.bin’
with open(filename, ‘wb’) as f:
pickle.dump(99, f)
pickle.dump(“aa”, f)
pickle.dump([“a”, “b”, “c”], f)
pickle.dump({“a”: 1, “b”: 2, “c”: 3}, f)

# €Kc.€X aaq .€]q (X aqX bqX cqe.€}q (X aqKX bqKX cqKu.

with open(filename, ‘rb’) as f:
for i in range(4):
x = pickle.load(f)
print(type(x), x)

# <class ‘int’> 99
# <class ‘str’> aa
# <class ‘list’> [‘a’, ‘b’, ‘c’]
# <class ‘dict’> {‘a’: 1, ‘b’: 2, ‘c’: 3}

python程序之间还可以都是pickle解决序列化、反序列化,如果是跨平台、跨语言、跨协议pickle就不合适了,就需要公共的协议,如json,msgpack




3.json库

轻量型的数据交换格式,完全独立于编程语言的文本格式来储存和表示数据
类型: 双引号包围起来的任意字符,数值,无序的键值对组合,有序值的集合

序列化与反序列化的过程分别叫做:encoding 和 decoding
encoding: 把Python对象转换成JSON字符串
decoding: 把JSON字符串转换成python对象

用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load()


4.msgpack库

基于二进制高效的对象序列化库,可用于跨语言通信

支持多语言,兼容json,pickle

dumps()、dump()、loads()、load()


5.shelve库

shelve 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 open()

序列化应用

一般来说,本地序列化的情况,应用较少,大多数场景都应用在网络传输中;将数据序列化后通过网络传输到远程节点,远程服务器上的服务将接收到的数据反序列化后,就可以使用了;但是要注意一点,远程接收端,反序列化时必须有对应的数据类型,否则就会报错;尤其时自定义类,必须远程得有一致的定义;

现在大多数项目,都不是单机的,也不是单服务的;需要通过网络将数据传送到其他节点上去,这就需要大量的序列化、反序列化的过程;但是,python程序之间还可以都是pickle解决序列化、反序列化,如果是跨平台、跨语言、跨协议pickle就不合适了,就需要公共的协议,例如XML、Json、Protocol Buffer等;

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。