定义
序列化与反序列化
序列化就是根据相应的协议,按照某种规则,将内存中的数据保存到文件中。而文件是一个字节序列,因此:把内存数据字节化然后输出到文件,这个过程就叫
序列化
反序列化就是将文件中的字节序列恢复到内存,并且还原原有的数据格式,这个过程就是反序列化
serialization:序列化
将内存中的对象存储下来,转换成一个个字节。(转换成二进制流)
deserialization:反序列化
将文件中的一个个字节转换成内存中的对象。(由二进制流转换成数据)
持久化:
将序列化后的数据保存到文件中的过程就叫持久化
序列化与反序列化应用
1.将数据序列化后持久化到文件
2.将数据序列化后通过网络传输到其他主机
3.将文件中的字节序列反序列化成内存数据,供内存使用
4.通过网络接收其他主机的字节序列然后反序列化成对象数据供本机使用
序列化与反序列化方法
python中的序列化与反序列化模块为pickle
,有以下四种方法:
方法 | 用途 |
---|---|
dumps | 将对象序列化为bytes对象,序列化后的字节存在于内存中 |
dump | 对象序列化到文件对象,即序列化后存入文件 |
load | 将bytes对象反序列化 |
loads | 将文件中的字节序列反序列化到内存 |
import pickle
filename = './test.txt'
x = 'abc'
y = 100
z = [(1,2,3), ['1','mv',123],{1,3,4}]
m = list(range(10))
n = {'a':10, 'b':11, 'c':12}
with open(filename, 'wb+') as f:
pickle.dump(x, f) #pickle.dump(obj, file, protocol)
pickle.dump(y, f) #将对象的内容序列化保存至文件
pickle.dump(z, f)
pickle.dump(m, f)
pickle.dump(n, f)
pickle.dumps()和pickle.loads()方法
#dumps方法和loads方法直接对对象进行操作
pickle.dumps(object, protocol, fix_import)
pickle.loads(bytes_object, fix_import, encoding)
import pickle
x = 'abc'
y = 100
z = [(1,2,3), ['1','mv',123],{1,3,4}]
print(pickle.dumps(x)) #将对象序列化成字节
print(pickle.dumps(y))
print(pickle.dumps(z))
print(pickle.loads(pickle.dumps(x))) # ==>x
print(pickle.loads(pickle.dumps(y))) # ==>y
print(pickle.loads(pickle.dumps(z))) # ==>z
pickle序列化与反序列化的方法基本上就是这四种,另外还有很多第三方序列化模块。比如google的protocol buffer
还有msgpack
注意点
1.序列化与反序列化主要应用于网络传输:将数据序列化后通过网络传输到其他网络节点,远程节点再反序列化转换成数据进行处理
2.远程节点在反序列化时,必须要有对应的数据类型,否则报错
3.在一个系统中,各个服务程序之间的的通讯也需要大量的序列化和反序列化
4.在Python环境中,使用pickle没问题,但是跨语言,跨平台的话会存在很多问题,因此需要使用XML,Json以及protocol buffer和msgpack等公共协议
json
json:JavaScript Object Notation,JS对象标记
- 是一种轻量级的数据交换格式。
- 采用完全独立于编程语言的文本格式来存储和表示数据
- 相关资料:https://www.json.org/json-zh.html
json支持的数据类型
字符串:
由双引号包围的任意字符的组合,可以有转义字符
数值int,float:
有符号,整型和浮点数
true和false:
对应于python中的True和False
null:
对应于python中的None
对象object:
无序的键值对的集合,{key1:value1,key2:value2,...,keyn:valuen}
,可以必须是双引号包围的字符串,value可以是任何合法值,类似于python中的字典
数组array:
有序的值的集合,类似于python中的列表
对象object示例
{
"person":[
{
"name":"tom"
"age":16
},
{
"name":"jerry"
"age":15
}
],
"total":2
}
python的json模块
python数据类型与json数据类型对比
python类型 | json类型 |
---|---|
True, False | true,false |
None | null |
str | string |
int | integer |
float | float |
list | array |
dict | object |
json方法
方法 | 功能 |
---|---|
dumps | json编码 |
dump | json编码并存入文件 |
loads | json解码 |
load | json解码,从文件中读取数据 |
dump和load的简单语法
json.dump(obj, fp) #将对象使用json编码,然后写入文件fp
json.load(fp) #从文件读取
import json
filename = './config.json' #json编码后存入的文件名
x = 'abc'
y = 100
z = [['1','mv',123],'123']
m = list(range(10))
n = {'a':10, 'b':11, 'c':12}
h = ('a', 'b', 'c') #json不支持元组格式,因此h不能被json编码
with open(filename, 'w+') as f: #json.dump(obj, fp),fp为文件描述符
json.dump(x, f) #将对象使用json编码并且存入文件
json.dump(y, f)
json.dump(z, f)
json.dump(m, f)
json.dump(n, f)
with open(filename, 'r+') as f: #从文件读取,json解码
print(json.load(f))
dumps和loads用法
语法:
json.dumps(obj)
json.loads(obj_json)
import json
x = ['abc', '123', [2,3,4]]
a = json.dumps(x) #使用json编码
print(a)
b = json.loads(a) #使用json解码
print(b)
json应用
json编码很少用于本地,主要通过网络传输到远程节点。json可以看成一个纯文本或一个字符串,所以在传输的时候可以进行压缩。由于json协议很简单,所以适用性很广,几乎所有的编程语言都支持json。