什么是序列化?
我们把对象(变量)包括整型字符串列表字典等等都叫对象,从内存中变成可存储或传输的过程称之为序列化,在python中叫pickling,在其他语言中serialization、marshalling、flattening等等,都是一个意思,序列化之后的内容可以写入磁盘或者通过网络传输到别的机器上。
相反,把变量内容从序列化对象重新读到内存里称之为反序列化,python叫unpickling
- json 与其他语言通用
>>> dict={'name':'simon','age':1}
>>> import json
>>> dict = json.dumps(dict)
'{"name": "simon", "age": 1}' #序列化之后的数据
>>> dict = json.loads(dict)
>>> print(dict)
{'name': 'simon', 'age': 1} #反序列化之后恢复回字典
>>> type(dict)
<class 'dict'>
- pickle 因为json无法序列化函数和类,可以用此方法仅在python语言使用
pickle.dumps() 将python数据序列化为bytes类型
pickle.loads() 将bytes类型数据反序列化为python的数据类型
>>> import pickle
>>> def test():
... print('ok')
...
>>> data = pickle.dumps(test)
>>> print(data)
b'\x80\x03c__main__\ntest\nq\x00.' #序列化之后的函数
>>> type(data)
<class 'bytes'> #因为是byte类型 写入文件时候要'wb'
>>> ret = pickle.loads(data)
>>> print(ret)
<function test at 0x104220950> #反序列化后的函数方法,需要调用的话本身也要有这个函数
>>> ret()
ok #执行函数后的结果
- base64与pickle联合使用
>> str = 'Hello World' # 加密前,原始数据
>> a = base64.b64encode(pickle.dumps(str)).decode() # 加密
>> print(a)
>> gANYCwAAAEhlbGxvIFdvcmxkcQAu
>> b = pickle.loads(base64.b64decode(a.encode())) # 解密
>> print(b)