Python变量的序列化与反序列化
将Python变量转换为可以存储或传输的形式的过程称之为序列化。
通过模块pickle
进行序列化与反序列化
- 序列化:模块
pickle
可以将任意类型的变量转换成bytes
形式的变量,然后可以直接存储该bytes
形式变量到文件中或者通过套接字传输该bytes
形式变量。 - 反序列化:直接从文件中读取该
bytes
形式变量或者通过套接字接受该bytes
形式变量,然后模块pickle
可以将bytes
形式的变量转换成实际对应类型的变量。
- 通过模块
pickle
将任意类型的变量转换成bytes
形式的变量时,会记录原变量所对应类的位置信息;通过模块pickle
将bytes
形式的变量转换成实际对应类型的变量时,需要确保目标变量所对应的类的位置信息不变。- 使用模块
pickle
对Python变量进行序列化,也只能通过模块pickle
进行反序列化。
import pickle
class Test():
def __init__(self, info:str) -> NoneL
self.info = info
def print():
print(self.info)
test = Test('test')
test_bytes = pickle.dumps(test)
# type of test_bytes is bytes
print(type(test_bytes))
test_object = pickle.loads(test_bytes )
test_object.print()
将bytes
类型变量转换成str
类型变量
- 直接通过
str
构造函数将bytes
类型变量转换成str
类型变量。对于
bytes
中的某些byte
,str
构造函数会将其转换为对应的字符而不是对应的ASCII码字符。 - 再将转换后的
str
类型变量中的字符转换为对应的ASCII码字符。
import pickle
test = '"'
test_bytes = pickle.dumps(test)
test_bytes_str_ord = ''
for i in range(len(test_bytes )):
byte_str = hex(test_bytes [i]).replace('0x', r'\x')
if len(byte_str) == 3:
byte_str = byte_str[0:2] + '0' + byte_str[2]
test_bytes_str_ord = test_bytes_str_ord + byte_str
test_bytes_str_ord = 'b\'' + test_bytes_str_ord + '\''
test_bytes = bytearray()
test_bytes_str_ord = test_bytes_str_ord[2:-1]
length = len(test_bytes_str_ord)
index = 0
while index < length:
byte_str = test_bytes_str_ord[index+2:index+4]
test_bytes= test_bytes + bytearray.fromhex(byte_str)
index = index + 4
test_bytes = bytes(test_bytes)
test = pickle.loads(test_bytes)
print(test)
通过模块json
进行序列化与反序列化
- 序列化:模块
json
可以将有限类型的变量转换成str
形式的变量,然后可以直接存储该str
形式变量到文件中或者通过套接字传输该str
形式变量。 - 反序列化:直接从文件中读取该
str
形式变量或者通过套接字接受该str
形式变量,然后模块json
可以将str
形式的变量转换成实际对应类型的变量。
- 如果要在不同的编程语言之间传递对象,可以使用模块
json
对Python变量进行序列化。- 使用模块
json
序列化Python对象会稍显复杂,dump
方法不知道如何将一个类转换成字符串,需要自行指定一个转换函数。
import json
dict_ = dict(one=1,two=2,three=3)
float_ = 3.14
dict_str = json.dumps(dict_)
float_str = json.dumps(float_)
# type of dict_str is str
print(type(dict_str ))
# type of float_str is str
print(type(float_str ))
dict_object = json.loads(dict_str)
float_object = json.loads(float_str)
# type of dict_object is dict
print(type(dict_object))
# type of float_object is float
print(type(float_object))