一、什么是序列化和反序列化
The process of converting a structured object into a sequence of bytes which can be stored in a file system or database or sent through the network is called serialization. The reversed process is called deserialization, which means reconverting a sequence of bytes into a structured object. Creating an object via deserialization is usually faster than initializing from a class.
將結構化對象轉換為可以存儲在文件系統或數據庫中或通過網絡發送的字節序列的過程稱為序列化。反之,把字節序列轉化成結構對象的過程稱為反序列化。
理解:
比如你有一個Python程序收集了網上很多的數據,然后經過轉換成字節序列存儲到了數據庫,我的另一個Java程序去這個數據庫讀取那些數據做分析。Python把數據轉換成字節序列存儲在數據庫的過程叫序列化,Java讀取數據庫的字節序列再格式化成Java可讀的形式叫反序列化。
二、Python實現序列化的方式
基於文本的序列化格式:CSV, JSON, XML, YAML, TOML
基於二進制的序列化格式:protobuf, Avro, pickle
三、pickle模塊實現序列化和反序列化
1)序列化
import pickle data = { 'a': [1, 2.0, 3, 4+6j], 'b': ("character string", b"byte string"), 'c': {None, True, False} } with open("./data.picke","wb") as f: pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
2)反序列化
import pickle with open('data.pickle', 'rb') as f: # The protocol version used is detected automatically, so we do not # have to specify it. data = pickle.load(f) print(data)
四、json模塊的序列化和反序列化
1)序列化
import json data = { "name": "Satyam kumar", "place": "patna", "skills": [ "Raspberry pi", "Machine Learning", "Web Development" ], "email": "xyz@gmail.com", "projects": [ "Python Data Mining", "Python Data Science" ] } with open("data_file.json", "w") as write: json.dump(data, write)
2)反序列化
import json with open("data_file.json", "r") as read_content: print(json.load(read_content))
五、pickle模塊與json模塊的對比
1)JSON是一個文本序列化格式,而pickle是一個二進制序列化格式;
2)JSON是可以直接閱讀的,而pickle不是;
3)JSON是可互操作的,在Python系統之外廣泛使用,而pickle則是Python專用的;
4)默認情況下,JSON 只能表示 Python 內置類型的子集,不能表示自定義的類;但 pickle 可以表示大量的 Python 數據類型。
寫在最后
李先生(Lemon),高級運維工程師(自稱),SRE專家(目標),夢想在35歲買一輛保時捷。喜歡鑽研底層技術,認為底層基礎才是王道。一切新技術都離不開操作系統(CPU、內存、磁盤)、網絡等。堅持輸入輸出,記錄自己學習的點滴,在平凡中堅持前行,總有一天會遇見不一樣的自己。公眾號:運維汪(ID:Leeeee_Li)。