序列化和反序列化
序列化
把对象转换为字节或者字符串的过程称为对象的序列化
对象的序列化主要有两种用途:
-
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中
-
在网络上传送对象的字节序列
反序列化
把字节序列或字符恢复为对象的过程称为对象的反序列化
反序列化的作用主要方便内存读写,方便程序操作
java中serialVersionUID的作用
远程代理模式里的序列化和反序列化
不是所有对象都是可以序列化的;python里pickle的序列化范围比json的序列化范围大
真正的物理存储都是二机制0和1,高低电平
逻辑存储
-
字节流:直接存储,二机制文件;可读性性差,基本没有什么可读性,文本编辑器打开就是一堵乱码(本身没有编码,文本编辑器打开的时候还必须解码,所以选择哪一种解码方式都会是一堆乱码),可以使用二机制编辑器打开,比如hexdump等
-
字符流:先编码再存储;文本文件(也称ASCII文件/UTF-8文件,看具体使用的编码方式);可读性强,使用文本编辑器打开的时候,需要解码
序列化和反序列化
-
序列化是指把可读性强的对象从内存中变成可存储或可传输的过程称之为序列化
-
把变量内容从序列化的对象(字节流/字符流)重新读到内存里称之为反序列化
python的序列化和反序列化:json字符流/pickle字节流
import json
import pickle
-
字符的序列化和反序列化 json.load()/json.loads()/json.dump()/json.dumps()
在序列化时,中文汉字被转换为unicode编码,在dumps函数中添加参数ensure_ascii=False可解决;dumps的indent参考可以调整显示格式,即缩进,一般设置为2。键值数据不能用双引号,只能用单引号(如果是双引号,可以用eval())
-
字节的序列化和反序列化 pickle.load()/pickle.loads/pickle.dump()/pickle.dumps()
简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么
意思(这样一个过程,可以看作是自定义编码)
文本文件基本上是定长编码的,基于字符嘛,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的4个字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度......大家可以看出来了吧,其编码是基于值的(不定长的,2、4、8字节长的值都有),所以BMP是二进制文件
计算机内存中,统一使用Unicode编码(2个字节表示一个字符)。unicode包含了跟全球所有国家编码的映射关系。但是使用unicode表示一个字符,太浪费空间。
UTF-8使用1、2、3、4个字节表示所有字符;优先使用1个字节、无法满足则增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚语系占3个,其它及特殊字符占4个
UTF是为unicode编码设计的一种在存储和传输时节省空间的编码方案。
python3执行过程
- python解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,然后转成unicode
- 把代码字符串按照语法规则进行解释
- 所有的变量字符都会以unicode编码声明
参考
https://www.cnblogs.com/python2687806834/p/9722318.html
https://blog.csdn.net/abc6368765/article/details/51365838
https://www.cnblogs.com/schut/p/8406897.html