Thuật ngữ tuần tự hóa đối tượng (object serialization) đề cập đến quá trình chuyển đổi trạng thái của một đối tượng thành luồng byte. Một khi được tạo, luồng byte này có thể được lưu trữ trong file hoặc truyền qua socket, v.v. Ngược lại, việc tái tạo đối tượng từ luồng byte gọi là giải tuần tự hóa (deserialization).
Thuật ngữ của Python cho tuần tự hóa và giải tuần tự hóa là pickling và unpickling tương ứng. Mô-đun pickle có sẵn trong thư viện chuẩn Python cung cấp hàm cho tuần tự hóa (dump() và dumps()) và giải tuần tự hóa (load() và loads()).
Mô-đun pickle sử dụng định dạng dữ liệu rất đặc thù của Python. Do đó, chương trình không viết bằng Python có thể không thể giải tuần tự hóa đúng dữ liệu đã mã hóa (pickled). Cũng không được coi là an toàn để unpickle dữ liệu từ nguồn không được xác thực.
Các giao thức pickle
Giao thức là các quy ước được dùng trong việc xây dựng và phân rã đối tượng Python thành/ từ dữ liệu nhị phân. Hiện tại mô-đun pickle định nghĩa 5 giao thức khác nhau như liệt kê dưới:
| Giao thức phiên bản 0 | Giao thức "đọc được bởi con người" gốc, tương thích ngược với các phiên bản trước. |
| Giao thức phiên bản 1 | Định dạng nhị phân cũ cũng tương thích với các phiên bản Python trước. |
| Giao thức phiên bản 2 | Được giới thiệu trong Python 2.3 cung cấp pickling hiệu quả cho các lớp new-style. |
| Giao thức phiên bản 3 | Được thêm trong Python 3.0. Khuyên dùng khi cần tương thích với các phiên bản Python 3 khác. |
| Giao thức phiên bản 4 | Được thêm trong Python 3.4. Nó thêm hỗ trợ cho các đối tượng rất lớn. |
Để biết phiên bản giao thức cao nhất và mặc định của cài đặt Python của bạn, hãy dùng các hằng số sau được định nghĩa trong mô-đun pickle:
>>> import pickle >>> pickle.HIGHEST_PROTOCOL 4 >>> pickle.DEFAULT_PROTOCOL 3
Như đã nhắc trước, hàm dump() và load() của mô-đun pickle thực hiện pickling và unpickling dữ liệu Python. Hàm dump() ghi đối tượng pickled vào file và hàm load() unpickle dữ liệu từ file thành đối tượng Python.
Chương trình sau pickle một đối tượng từ điển vào file nhị phân.
import pickle
f = open("data.txt", "wb")
dct = {"name": "Ravi", "age": 23, "Gender": "M", "marks": 75}
pickle.dump(dct, f)
f.close()Khi mã trên được thực thi, biểu diễn byte của đối tượng từ điển sẽ được lưu trong file data.txt.
Để unpickle hoặc giải tuần tự hóa dữ liệu từ file nhị phân ngược lại thành từ điển, chạy chương trình sau:
import pickle
f = open("data.txt", "rb")
d = pickle.load(f)
print(d)
f.close()Console Python hiển thị đối tượng từ điển đọc từ file:
{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75}Mô-đun pickle cũng bao gồm hàm dumps() trả về biểu diễn chuỗi của dữ liệu pickled.
>>> from pickle import dumps
>>> dct = {"name": "Ravi", "age": 23, "Gender": "M", "marks": 75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'Dùng hàm loads() để unpickle chuỗi và lấy lại đối tượng từ điển gốc.
>>> from pickle import loads
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}Mô-đun pickle cũng định nghĩa lớp Pickler và Unpickler. Lớp Pickler ghi dữ liệu pickle vào file. Lớp Unpickler đọc dữ liệu nhị phân từ file và xây dựng đối tượng Python.
Để ghi dữ liệu pickled của đối tượng Python:
from pickle import Pickler
f = open("data.txt", "wb")
dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Pickler(f).dump(dct)
f.close()Để đọc lại dữ liệu bằng unpickling file nhị phân:
from pickle import Unpickler
f = open("data.txt", "rb")
dct = Unpickler(f).load()
print(dct)
f.close()Đối tượng của tất cả các kiểu dữ liệu chuẩn Python đều có thể pickle. Hơn nữa, đối tượng của lớp tùy chỉnh cũng có thể được pickle và unpickle.
from pickle import *
class person:
def __init__(self):
self.name = "XYZ"
self.age = 22
def show(self):
print("name:", self.name, "age:", self.age)
p1 = person()
f = open("data.txt", "wb")
dump(p1, f)
f.close()
print("unpickled")
f = open("data.txt", "rb")
p1 = load(f)
p1.show()Thư viện Python cũng có mô-đun marshal được dùng cho tuần tự hóa nội bộ của các đối tượng Python.