想要看更加舒服的排版、更加准时的推送
关注公众号“不太灵光的程序员”
每日八点有干货推送
公众号“不太灵光的程序员” 同时发布《机器学习中必须要会用的模块》
序列化:是对象从内存中的运行状态转化成可存储或传输状态的过程称之为序列化。
反序列化:是对象从存储或传输状态转化成可在内存中的运行状态的过程称之为反序列化。
序列化模块经常被使用,在许多场景中我们需要将当前程序运行的对象存储起来或者传输给别的程序,比如:
使用消息队列进行通信是需要将字典列表等容器对象序列化成字符串进行传输;
运行一个好事程序你需要中断它,下次从中断的地方继续执行,就需要对过程中的对象进行序列化,存储到磁盘中,这里听起来数据持久化。
python中常见的序列化模块有 json 、 pickle 和 marshal。
marshal模块主要用于支持读取和编写.pyc文件的Python模块的“伪编译”代码。
marshal模块可以序列化大部分数据对象、函数、类,但是对于存在递归调用的函数、字典、列表、集合是不能被序列化的,这些对象可能导致无限循环。
json是一种文本序列化格式,易于人阅读和编写。
json模块只可以序列化python内置数据类型对象,不能序列化其他的函数和类。
pickle模块是python中推荐的序列化模块,可以序列化数据对象、函数、类。
marshal模块不能序列化递归对象,pickle模块可以,这是在pickle模块的实现中对同一对象的引用只序列化一次,marshal是都序列化。
marshal模块不能序列化用户定义的类及其实例。 pickle模块可以序列化和反序列化类和实例,但是类定义必须是可导入的,并且与对象存储时位于同一模块中。
marshal模块没有python版本兼容,pickle模块序列化后的数据是向后兼容的。
序列化对象范围不同,pickle模块可以序列化任意的类或函数,json模块只能序列化内置的类型类。
序列化后的数据格式不同,json模块是序列化成字符串存储,pickle是二进制序列化格式。
pickle是不安全的,反序列化不安全的二进制数据可能会造成危险,而json只序列化数据类型不会造成执行漏洞。
所以 pickle 模块是python中推荐的序列化模块。
# coding=gbk
import pickle
import marshal
import json
def add(a, b):
return a+b
def fib_recur(n):
assert n >= 0, "n > 0"
if n <= 1:
return n
return fib_recur(n-1) + fib_recur(n-2)
data_dict = {"a": 1, "b": 2}
def run_pkl():
print("====== run_pkl ======")
pkl_data = pickle.dumps(data_dict)
pkl_add = pickle.dumps(add)
pkl_fib_recur = pickle.dumps(fib_recur)
print("pkl_data:", pkl_data)
print("pkl_add:", pkl_add)
print("pkl_fib_recur:", pkl_fib_recur)
b_data = pickle.loads(pkl_data)
b_add = pickle.loads(pkl_add)
b_fib_recur = pickle.loads(pkl_fib_recur)
print("b_data:", b_data)
print("b_add(1, 2):", b_add(1, 2))
print("b_fib_recur(10):", b_fib_recur(10))
def run_marshal():
print("====== run_marshal ======")
mar_data = marshal.dumps(data_dict)
print("mar_data:", mar_data)
try:
mar_add = marshal.dumps(add)
except Exception as e:
print("mar_add:", e)
try:
mar_fib_recur = marshal.dumps(fib_recur)
except Exception as e:
print("mar_fib_recur:", e)
b_data = marshal.loads(mar_data)
print("b_data:", b_data)
def run_json():
print("====== run_json ======")
json_data = json.dumps(data_dict)
print("json_data:", json_data)
try:
json_add = json.dumps(add)
except Exception as e:
print("json_add:", e)
try:
json_fib_recur = json.dumps(fib_recur)
except Exception as e:
print("json_fib_recur:", e)
b_data = json.loads(json_data)
print("b_data:", b_data)
if __name__ == "__main__":
print("data_dict", data_dict)
print("add(1, 3)", add(1, 3))
print("fib_recur(10)", fib_recur(10))
run_pkl()
run_marshal()
run_json()