Python学习笔记:序列化(Serialize)和反序列化(Deserialize)


1、使用场景一:保存内存中的数据到文件中,然后在下次要使用的时候再反序列化恢复数据,这样使临时中断的工作得已恢复。比如虚拟机的快照等。
2、使用场景二:可以将数据序列化以后在两种不同的语言中传输,比如Python数据类型转成json格式再传给Java


例1:这是一个最简单的序列化和反序列化的例子,使用eval()还原这个字典dict1
dict1 = {"name":"tangwei","age":"18","profession":"professional"}
file1 = open("test.txt","w",encoding="utf-8")
file1.write(str(dict1))  # 文件中只能存字节型或者字符型
file1.close()

file1 = open("test.txt","r")
lines = file1.readlines()
file1.close()
for line in lines:
    dict2 = eval(line)  # 这仅仅是读取文本,但是要放在内存中执行,还需要用到eval(),让python把字符串当成代码来执行
print("姓名",dict2["name"])

例2:以上代码并非通用方法,因为eval()只在python使用,如果要再多语言中传送和转化数据可以用到json
import json
dict1 = {"name":"tangwei","age":"18","profession":"professional"}
file1 = open("test.txt","w",encoding="utf-8")
file1.write(json.dumps(dict1))  # 文件中只能存字节型或者字符型,用dumps序列化,与json.dump(dict1,file1)功能一样
file1.close()

file1 = open("test.txt","r")
# json_obj = json.load(file1) # 可以用load更简便,也可以用下面的for循环
# print("姓名", json_obj["name"])
# 将读出的字符串转换成json格式
for line in file1:
    json_obj = json.loads(line)  # 用loads反序列化
    print("姓名", json_obj["name"])
file1.close()

例3:那么能不能将一个函数也序列化呢?如果能将函数和类都序列化,那么我再次取出的时候就可以直接恢复到中断时的状体,岂不是美滋滋?
# 注意:python的json包不能将函数和类对象之类的序列化,只能序列化字符和字节型数据。

import json
def test1(name):
    print("111",name)
dict1 = {"name":"tangwei","age":"18","method":test1}
file1 = open("test.txt","w",encoding="utf-8")
file1.write(json.dumps(dict1))  # 用dumps序列化只能是字节型或者字符型,test1是函数的内存地址,不能序列化,所以这里会报错!
file1.close()

例4:如果一定要将函数序列化,那么只能用pickle包。
import pickle

def test1(name):
    print("111",name)

dict1 = {"name":"tangwei","age":"18","method":test1}
file1 = open("test.txt","wb")  # 这里要用wb,写字节类型
file1.write(pickle.dumps(dict1))
file1.close()

file1 = open("test.txt","rb")
# 将读出的字符串转换成json格式
for line in file1:
    # 用loads反序列化
    json_obj = pickle.loads(line)
    print("姓名", json_obj["name"])
    # 可以直接执行同名函数,注意,这里的test1已经不是原来的test1了,因为序列化以后test1就释放了
    json_obj["method"]("tangwei")
file1.close()

 

你可能感兴趣的:(Python学习笔记:序列化(Serialize)和反序列化(Deserialize))