思考:

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

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

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

序列化:

  1. import pickle
  2.  
  3. filename = 'd:/Doc/test'
  4. i = 100
  5. h = '100'
  6. d = {'a':1,'b':'abc','c':[1,2,3]}
  7. l = list('123')
  8.  
  9. with open(filename,'wb') as f:
  10. pickle.dump(i,f)
  11. pickle.dump(h,f)
  12. pickle.dump(d,f)
  13. pickle.dump(l,f)

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

  1. #先在普通文本模式下查看
  2. Kd.€? ?100?€? }??a擪?babcc擼?KKKeu.€? ]??123攅.

#二进制模式下查看

对照ascii表查看:

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

反序列化:

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

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

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

面向对象序列化

  1. import pickle
  2.  
  3. class AA:
  4. tttt = 'ABC'
  5. def show(self):
  6. print('abc')
  7.  
  8. a1 = AA()
  9.  
  10. sr = pickle.dumps(a1)
  11. print('sr={}'.format(sr))
  12.  
  13. a2 = pickle.loads(sr)
  14. print(a2.tttt)
  15. a2.show()
  1. # 执行结果
  2. PS D:\Doc> & D:/Python/Python38/python.exe d:/Doc/test.py
  3. sr=b'\x80\x04\x95\x16\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x02AA\x94\x93\x94)\x81\x94.'
  4. ABC
  5. 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. 在GO中调用C源代码#基础篇1

    开坑说明 最近在编写客户端程序或与其他部门做功能集成时多次碰到了跨语言的sdk集成,虽说方案很多诸如rpc啊,管道啊,文件io啊,unix socket啊之类的不要太多,但最完美的基础方式还是让程序与 ...

  2. html5 tts(文字朗读)

    在 chrome 下使用比较好的中文语音包. 注意 speechSynthesis.getVoices() 有时候可能会返回空数组,需要做验证 var zhCnLangs = speechSynthe ...

  3. 使用echo 无法正确清空文件存储大小

    在使用echo进行重定向文件的时候,会存在大小没有发生改变的现象 使用上面的方法遇到一个现象 ls -l 与 du -sh 得到的大小事是不同的 可以尝试下面的方面之后在进行对比 再看是否正确清除 使 ...

  4. 好客租房7-React脚手架的使用

    3.3在脚手架中使用React //第一步导入react import React from "React" import ReactDOM from "react-do ...

  5. babel使用

    Babel转码器 Babel定义 Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在老版本的浏览器执行 Babel安装 仅需要在项目文件下安装 npm ins ...

  6. Docker安装Mycat和Mysql进行水平分库分表实战【图文教学】

    一.前言 小编最近公司有个新的需求,数据量比较大,要涉及到分库分表.大概了解了一些主流的中间件,使用和网上资料比较多的是Mycat和sharding-jdbc,小编比较倾向于Mycat.原因很简单就是 ...

  7. 【原创】项目三Raven-2

    实战流程 1,C段扫描,并发现目标ip是192.168.186.141 nmap -sP 192.168.186.0/24 扫描目标主机全端口 nmap -p- 192.168.186.141 访问8 ...

  8. Linux文件拷贝脚本

    在工作中,我们经常遇到要从Linux服务器拷贝日志至本地或者定期清理日志的需求,在服务器上,大型系统的日志是按模块存储的,这就导致日志的文件目录较多且层级不统一.我们从众多的目录手工筛选要下载或者删除 ...

  9. ABP Framework 5.3.0 版本新增功能和变更说明

    ABP Framework 5.3.0 稳定版已在2022年6月14日正式发布. 以下是本版本的新增功能: "开始"页面提供创建单层项目选项 启动模板提供 PWA 支持 Volo. ...

  10. 如何正确理解古典概率中的条件概率 《考研概率论学习之我见》 -by zobol

    "B事件发生的条件下,A事件发生的概率"? "在A集合内有多少B的样本点"? "在B约束条件下,A发生的概率变化为?" "B事件中 ...