Python对象序列化-Pickle模块
一 前言
一般情况下,如果要在不同的主机上传递数据,其传递的数据格式是二进制或字符串。字符串的传输是日常网络通信中的普遍情况,如socket、后端接口、下位机与上位机的通信等等,所以这篇主要来解决数据的序列化和反序列化。
二 序列化与反序列化
2.1 为什么需要序列化与反序列化?
首先在解释之前,我们需要一些共识
- 程序运行时,变量才存在,一旦程序停止运行,变量会被回收。
- 变量存在于内存中,而不是以文件的形式存在硬盘上。
- 内存不能永久保留变量。
- 使用变量必须要访问内存中存放变量的区域。
在日常编写代码过程中,我们会使用各种类型的数据,如整型、字符型、浮点型等。在一个程序中,我们使用这些变量很方便,那如果要在两台主机上共享相同的数据,或者说是变量时,我们又该怎么办呢?
有人说这简单,只要利用通信协议传输数据就行,在处理非字符串时,将其转化为字符串。对方按照一定的协议规则来接收数据,将数据进行还原,转化为原来的数据类型并用新的变量来存放这些数据。
我们来分析上面这个过程,假设有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/python3import picklewith 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 picklewith 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,可以用于多种编程语言。
Python对象序列化-Pickle模块相关推荐
- python:marshal --- 内部 Python 对象序列化
python:marshal --- 内部 Python 对象序列化 此模块包含一此能以二进制格式来读写 Python 值的函数. 这种格式是 Python 专属的,但是独立于特定的机器架构(即你可以 ...
- pickle —— Python 对象序列化(python=3.8)
模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化. "Pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 & ...
- [转载] pickle:让python对象序列化
参考链接: pickle - Python对象序列化 一.dump()方法 pickle.dump(obj, file, [,protocol]) 注释:序列化对象,将对象obj保存到文件file中去 ...
- 【pickle】详解python中的pickle模块(常用函数、示例)
1.序列化.反序列化介绍 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 2.pickle模块说明 python中的pickle模块实现 ...
- Python 对象序列化
#1.对象序列化(serialize): # 将对象这种抽象概念转化为字节或者字符串这种可以被计算机直接识别的数据的过程 #2.对象反序列化: # 将字符串或者字节数据转化为抽象的对象 #3.持久化: ...
- Python中的pickle模块
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. Pickle模块的作用 Pickle模块用于将python对象序列化为字节流,可存储在文件或数据库中,也可同通过网络进行 ...
- python 对象序列化 pickling_[Python]对dat文件的操作:序列化对象
一:dat文件 在我之前的博客中,我介绍了对txt文件操作的一些相关知识,以及如何对其进行读写操作,也介绍了文本文件和二进制文件的一些区别.虽然对txt文件操作已经能够满足储存数据的需求,但txt文件 ...
- python对象序列化或持久化的方法
http://blog.csdn.net/chen_lovelotus/article/details/7233293 一.Python对象持久化方法 目前为止,据我所知,在python中对象持久化有 ...
- python 对象序列化 pickling_python操作文件——序列化pickling和JSON
当我们在内存中定义一个dict的时候,我们是可以随时修改变量的内容的: >>> d=dict(name='wc',age=28)>>>d {'name': 'wc' ...
最新文章
- 人工神经网络-2020-第十四周-人工神经网络硬件实现-备课
- 同网段不同网段主机间通信原理
- vue开发黑科技--利用引用类型的值处理复杂数据的编辑
- MySQL select后面的子查询使用
- 可视化运行Python的神器Jupyter Notebook
- 万网独享主机Apache为Ecshop商城添加404页面详解
- apache camel_REST与Apache Camel
- 前端学习(579):chrome devtools功能简介
- 山寨版项目管理经验小结
- CanFestival移植到STM32F103
- iis7 64位 操作excel的一系列问题(未完待续)
- 如何将类添加到给定的元素?
- PCL1.8.0 error C4996: 'pcl::SAC_SAMPLE_SIZE'编译错误
- 学习,不仅要知其然,更要知其所以然。
- 【JavaWeb】最详细的小白笔记!!!
- 从Logistic回归到神经网络的一点感悟
- python中fontsize_更改MatPlotLib中顶部xaxis的fontsize
- 用狼的处世哲学做SOHO(一)
- DNS工作原理及其过程
- 凌晨3点不回家,你咋不去死