Python对象序列化-Pickle模块

一 前言

一般情况下,如果要在不同的主机上传递数据,其传递的数据格式是二进制或字符串。字符串的传输是日常网络通信中的普遍情况,如socket、后端接口、下位机与上位机的通信等等,所以这篇主要来解决数据的序列化和反序列化。

二 序列化与反序列化

2.1 为什么需要序列化与反序列化?

首先在解释之前,我们需要一些共识
  1. 程序运行时,变量才存在,一旦程序停止运行,变量会被回收。
  2. 变量存在于内存中,而不是以文件的形式存在硬盘上。
  3. 内存不能永久保留变量。
  4. 使用变量必须要访问内存中存放变量的区域。

在日常编写代码过程中,我们会使用各种类型的数据,如整型、字符型、浮点型等。在一个程序中,我们使用这些变量很方便,那如果要在两台主机上共享相同的数据,或者说是变量时,我们又该怎么办呢?

有人说这简单,只要利用通信协议传输数据就行,在处理非字符串时,将其转化为字符串。对方按照一定的协议规则来接收数据,将数据进行还原,转化为原来的数据类型并用新的变量来存放这些数据。

我们来分析上面这个过程,假设有A和B两台主机,A利用socket向B发送数据,B接收数据。
当A向B发送数据时,A主机需要从内存中提取数据,需要时对数据做一些类型转化,然后调用send函数将数据发送出去(这个函数以后再探讨)。

这时,B主机接收来自A主机的数据,按照一定的规则来接收并解析数据的内容,在解析完数据后,定义新的变量来保存数据,接下来才是对数据的使用。

为了完成这个任务,双方需要设计一种数据的传送规则,保证接收方能够正确接收所有的数据(发送方存在发送多次才把数据传递完的情况)。除此之外,彼此需要一份数据的说明书,包括对哪些数据进行数据类型的转化。

对于一个新手来说,尝试实现上面这个过程是十分繁琐,特别是在调试过程。

对此,引入序列化和反序列化来帮我们简化这个通信过程。

2.2 序列化与反序列化是什么?

其实在上个案例中,我们已经讲解序列化与反序列化的思想。
序列化将变量从内存提取出来,变成数据,而反序列化将数据原封不动重新加载到内存中。
序列化与反序列化的目的在于让变量的内容和类型在这个过程中保持不变,使两台主机就像访问同一块内存空间一样。

三 用pickle实现序列化与反序列化

3.1 dump和load的参数(python3.8引入buffer_callback和buffers)

pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)
pickle.load(file, *, fix_imports=True, encoding=“ASCII”, errors=“strict”, buffers=None)

3.2 序列化案例

PickleDump.py

#!/usr/bin/python3


import pickle

with open(r'TestDump.dat','wb') as f:
	message = "hello"
	lists = [1,2]
	person = dict (name='Jake',age=20)

	pickle.dump(message,f)
	pickle.dump(lists,f)
	pickle.dump(person,f)
	print(type(message))
	print(type(lists))
	print(type(person))

3.3 反序列化案例

PickleLoad.py

#!/usr/bin/python3
import pickle

with open('TestDump.dat','rb') as f:
	message = pickle.load(f)
	lists = pickle.load(f)
	person = pickle.load(f)

	print(type(message),message)
	print(type(lists),lists)
	print(type(person),person)

3.4 运行

python3 PickleDump.py

<class 'str'>
<class 'list'>
<class 'dict'>

python3 PickleLoad.py

<class 'str'> hello
<class 'list'> [1, 2]
<class 'dict'> {'name': 'Jake', 'age': 20}

四 总结

序列化与反序列的目的是让变量能够跨越时间与空间,实现对变量的共享(数据一致,类型一致)。
本文用pickle简单描述这个过程,不过pickle只实用于python语言,下一篇介绍另外一种常用的工具json,可以用于多种编程语言。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值