序列化与反序列化

变量从内存中变成可存储或传输的过程,称之为序列化

序列化之后,就可以把序列化后的内容(序列化后的内容是一个Bytes)写入磁盘,或者通过网络传输到别的机器上。

把变量内容从序列化的对象重新读到内存里,称之为反序列化,即unpickling。

  1. str1='hello python'
  2. file1=open(r"text.txt",mode='w',encoding='utf-8')
  3. text=file1.write(str1)
  4. file1.close()
  5. # 读取文件
  6. file2=open(r'text.txt',mode='r',encoding='utf-8')
  7. text=file2.read()
  8. file2.close()
  9. print(text)

当我们在创建一个变量时,将变量的值存储到内存中,之后再存储到文件中,这个过程就是序列化,
而从文件到内存,再读取成变量,这个过程就叫做反序列化

json模块

json模块是将序列化数据从文件里读取出来或者存入文件。

json有以下四个函数:

  • dumps():将 Python 中的对象序列化成二进制对象,并返回;
  • loads():读取给定的二进制对象数据,并将其转换为 Python 对象;
  • dump():将 Python 中的对象序列化成二进制对象,并写入文件;
  • load():读取指定的序列化数据文件,并返回对象。

dumps序列化

  1. import json
  2. dict1={'name':"aa",'age':18,'sex':'男'}
  3. #序列化
  4. data=json.dumps(dict1)
  5. f1=open(r'text.txt',mode='w',encoding='utf-8')
  6. x1=f1.write(data)
  7. f1.close()

调用json模块,将创建的字典,用dumps序列化,再将文件写入到text.txt文件中

loads反序列化

  1. import json
  2. f2=open(r'text.txt',mode='r',encoding='utf-8')
  3. data=f2.read()
  4. f2.close()
  5. x2=json.loads(data)
  6. print(x2)
  7. print(type(x2))
  1. C:\Users\
  2. {'name': 'aa', 'age': 18, 'sex': '男'}
  3. <class 'dict'>
  4. 进程已结束,退出代码0

dump()与dumps()的区别

json.dumps()是把python对象转换成json对象的一个过程,生成的是字符串。
json.dump()是把python对象转换成json对象生成一个fp的文件流,和文件相关。

json.loads()与json.load()

json.loads()是针对内存对象,将string转换为dict。
json.load()针对文件句柄,将json格式的字符转换为dict,从文件中读取 (将string转换为dict)

pickle模块

pickle与json用法类似,同样也有这四个参数,但是与json的区别是:

  1. pickle只是在python中专属,而json可以用于其他许多语言
  2. json只能支持int\str\list\tuple\dict的类型进行序列化,而pickle对类和函数也是可以的

函数的序列化

  1. import pickle
  2. #序列化
  3. def aa():
  4. print('good')
  5. data=pickle.dumps(aa)
  6. f1=open(r'text.txt',mode='wb')
  7. x1=f1.write(data)
  8. f1.close()
  9. #反序列化
  10. f2=open(r'text.txt',mode='rb')
  11. data=f2.read()
  12. f2.close()
  13. x2=pickle.loads(data)
  14. x2()
  15. import pickle
  16. #序列化
  17. def aa():
  18. print('good')
  19. data=pickle.dumps(aa)
  20. f1=open(r'text.txt',mode='wb')
  21. x1=f1.write(data)
  22. f1.close()
  23. #反序列化
  24. f2=open(r'text.txt',mode='rb')
  25. data=f2.read()
  26. f2.close()
  27. x2=pickle.loads(data)
  28. print(x2)

类的序列化

  1. import pickle
  2. #序列化
  3. class aa():
  4. def __init__(self):
  5. print('good')
  6. data=pickle.dumps(aa)
  7. f1=open(r'text.txt',mode='wb')
  8. x1=f1.write(data)
  9. f1.close()
  10. #反序列化
  11. f2=open(r'text.txt',mode='rb')
  12. data=f2.read()
  13. f2.close()
  14. x2=pickle.loads(data)
  15. x2()