思考:

  内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?
  如果是自己定义的类的实例,如何保存到一个文件中?
  如何从文件中读取数据,并让它们在内存中再次变成自己对应的类的实例?
  要设计一套协议,按照某种规则,把内存中数据保存到文件中,文件是一个字节序列,所以必须把数据转换成字节序列,输出到文件,这就是序列化;反之,从文件的字节序列恢复到内存,就是反序列化;

定义
serialization 序列化
将内存中的对象存储下来,把它变成一个个字节;--->二进制
deserialization 反序列化
将文件中的一个个字节恢复成内存中的对象;<---二进制
序列化保存到文件就是持久化;
可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者从网络接收到的字节序列反序列化;

pickle库
python中的序列化、反序列化模块;
  dumps 对象序列化为bytes对象;
  dump 对象序列化到文件对象,就是存入文件;
  loads 从bytes对象反序列化;
  load 对象反序列化,从文件读取数据

序列化:

import pickle

filename = 'd:/Doc/test'
i = 100
h = '100'
d = {'a':1,'b':'abc','c':[1,2,3]}
l = list('123') with open(filename,'wb') as f:
pickle.dump(i,f)
pickle.dump(h,f)
pickle.dump(d,f)
pickle.dump(l,f)

  执行该脚本,将对象序列化到文件,并用notepad++打开该文件查看它的存储信息;

#先在普通文本模式下查看
€Kd.€? ?100?€? }??a擪?b攲abc攲c擼?KKKeu.€? ]??1攲2攲3攅.

#二进制模式下查看

对照ascii表查看:

  结合代码中的变量值数字100在二进制中被转化成了16进制的数字64,而字符串100、a、b、abc、1、2、3,在二进制中仍然是以字符串的形式出现,其他信息都是以乱码的形式存在;

反序列化:

import pickle

filename = 'd:/Doc/test'
i = 100
h = '100'
d = {'a':1,'b':'abc','c':[1,2,3]}
l = list('123') with open(filename,'wb') as f:
pickle.dump(i,f)
pickle.dump(h,f)
pickle.dump(d,f)
pickle.dump(l,f) with open(filename,'rb') as f:
for _ in range(4):
a = pickle.load(f)
print(a,type(a))
# 执行结果
PS D:\Doc> & D:/Python/Python38/python.exe d:/Doc/test.py
100 <class 'int'>
100 <class 'str'>
{'a': 1, 'b': 'abc', 'c': [1, 2, 3]} <class 'dict'>
['1', '2', '3'] <class 'list'>

不落地的序列化和反序列化

import pickle

filename = 'd:/Doc/test'
x = ['a',100,['abc'],{'a':1,'b':2,'c':3}]
lst = []
with open(filename,'wb') as f:
for i in x:
lst.append(pickle.dumps(i)) with open(filename,'rb') as f:
for i in lst:
a = pickle.loads(i)
print(a,type(a))
# 执行结果
PS D:\Doc> & D:/Python/Python38/python.exe d:/Doc/test.py
a <class 'str'>
100 <class 'int'>
['abc'] <class 'list'>
{'a': 1, 'b': 2, 'c': 3} <class 'dict'>

面向对象序列化

import pickle

class AA:
tttt = 'ABC'
def show(self):
print('abc') a1 = AA() sr = pickle.dumps(a1)
print('sr={}'.format(sr)) a2 = pickle.loads(sr)
print(a2.tttt)
a2.show()
# 执行结果
PS D:\Doc> & D:/Python/Python38/python.exe d:/Doc/test.py
sr=b'\x80\x04\x95\x16\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x02AA\x94\x93\x94)\x81\x94.'
ABC
abc

  从上面的例子可以看出,面向对象的序列化其实就是保存了一个类名,因为所有的其他东西都是类定义的东西,是不变的,所以只序列化一个“AA”类名;反序列化的时候找到类就可以恢复一个对象;

序列化应用
  一般来说,本地序列化的情况,应用较少,大多数场景都应用在网络传输中;将数据序列化后通过网络传输到远程节点,远程服务器上的服务将接收到的数据反序列化后,就可以使用了;但是要注意一点,远程接收端,反序列化时必须有对应的数据类型,否则就会报错;尤其时自定义类,必须远程得有一致的定义;
  现在大多数项目,都不是单机的,也不是单服务的;需要通过网络将数据传送到其他节点上去,这就需要大量的序列化、反序列化的过程;但是,python程序之间还可以都是pickle解决序列化、反序列化,如果是跨平台、跨语言、跨协议pickle就不合适了,就需要公共的协议,例如XML、Json、Protocol Buffer等;

第十八天python3 序列化和反序列化的更多相关文章

  1. Python3 json、pickle序列化与反序列化

    注意:可以dumps多次,loads只能一次,一般我们只dumps一次,loads一次,多个版本就写入多个文件 一.json序列化与反序列化: 支持各种语言数据交互,但只能处理字典,列表,集合等简单的 ...

  2. Python库:序列化和反序列化模块pickle介绍

    1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装pyt ...

  3. Django restful Framework 之序列化与反序列化

    1. 首先在已建好的工程目录下新建app命名为snippets,并将snippets app以及rest_framework app加到工程目录的 INSTALLED_APPS 中去,具体如下: IN ...

  4. Python 中数据的序列化和反序列化(json处理)

    概念: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming ...

  5. python序列化与反序列化(json、pickle)-(五)

    1.什么是序列化&反序列化? 序列化:将字典.列表.类的实例对象等内容转换成一个字符串的过程. 反序列化:将一个字符串转换成字典.列表.类的实例对象等内容的过程 PS:Python中常见的数据 ...

  6. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  7. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  8. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  9. C#中怎样实现序列化和反序列化

    我们想要将数据进行持久化的操作的话,也就是将数据写入到文件中,我们在C#中可以通过IO流来操作,同时也可以通过序列化来操作,本人是比较推荐使用序列化操作的 因为我们如果想要将一个对象持久化到文件中 如 ...

随机推荐

  1. maccms10二开批量入库和资源打包

    批量入库 因为maccms自带的采集采集起来很慢,而且很多资源站的采集接口不能对内容排序,导致最旧的数据最后入库.用java写个采集程序,采集完入库的时候发现不能一次性入库多个数据,导致入库也很慢,所 ...

  2. 从NSSRound#1学到了什么

    sql_by_sql 二次注入: 更改密码的功能形如: update user set password='%s' where username='%s'; 的语句就可以存在二次注入,即假设有个adm ...

  3. spring aop 记录 service 方法调用时长 - 环绕通知

    添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  4. 认识并安装WSL

    认识并安装WSL(基于Windows的Linux子系统) 什么是WSL WSL(Windows Subsystem for Linux),这是在windows平台运行的linux子系统.也就是说可是不 ...

  5. CSS的几种选择器

    选择器 目录 选择器 基础选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 子选择器 并集选择器 伪类选择器 基础选择器 标签选择器 标签选择器可以把一类标签全部选择出来 ...

  6. 【原创】史上最简单易懂的kali修改主机名方法

    前言 主机名:在一个局域网中,每台机器都有IP地址,但是IP地址不便于人们记忆.于是采用主机名,即利于主机之间的区分,又方便人们的记忆主机.--和域名差不多. 一,查看当前的主机名 ┌──(root㉿ ...

  7. 接口测试postman深度挖掘应用①

    一.测试接口前需要搞明白的原理: 1.在讲如何使用postman时,我们首先应该要了解网络的请求相应的知识,下面以fiddle进行抓包为例分析: 通过fiddler抓包我们不难发现,客户端也就是用户会 ...

  8. Java实现http大文件流读取并批量插入数据库

    1.概述 请求远程大文本,使用流的方式进行返回.需要设置http链接的超时时间 循环插入到List中,使用mybatis-plus批量插入到mysql中 2.需求 两台服务器 大文件放到其中一台服务器 ...

  9. 2021.10.19 CSP 模拟赛 总结

    T1 题意: \(n\) 个人摘苹果,跳起高度为 \(a_i\),苹果高度为 \(h_i\),高度小的先摘,摘了就没了 直接排序+双指针,复杂度 \(O(n+m)\) T2 题意:要轰炸一个有向图的所 ...

  10. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...