8.1 Serialization là gì
Sau khi bạn đã học cách xử lý các tập tin, lưu và đọc dữ liệu, đã đến lúc học cách xử lý tập tin một cách nghiêm túc. Hôm nay chúng ta sẽ bắt đầu tìm hiểu về serialization.
Serialization — là quá trình chuyển đổi một đối tượng thành một chuỗi byte hoặc định dạng nào đó, có thể lưu được trong tập tin, truyền qua mạng hoặc lưu vào cơ sở dữ liệu. Deserialization — là quá trình ngược lại, khi mà từ chuỗi byte này khôi phục lại đối tượng ban đầu.
Để lưu một đối tượng vào tập tin (hoặc truyền nó qua mạng), cần chuyển đổi nó thành một chuỗi (hoặc tập hợp byte) nào đó, mà có thể dễ dàng ghi vào tập tin (và đọc từ tập tin) hoặc truyền qua mạng.
Đây là 4 hướng chính mà serialization được sử dụng:
- Lưu trữ trạng thái đối tượng: Để lưu trữ trạng thái của đối tượng giữa các lần chạy chương trình.
- Truyền dữ liệu: Để truyền đối tượng qua mạng giữa các thành phần của hệ thống hoặc giữa các hệ thống khác nhau.
- Caching: Để lưu trữ đối tượng trong cache cho truy cập nhanh chóng.
- Cơ sở dữ liệu: Để lưu trữ các cấu trúc dữ liệu phức tạp trong cơ sở dữ liệu.
Có rất nhiều thư viện xử lý serialization, mỗi cái được tạo ra cho nhu cầu riêng. Chúng ta sẽ làm quen với năm trong số đó, và với hai cái chúng ta sẽ tìm hiểu rất chi tiết.
Xem xét những cái phổ biến nhất:
- Module
pickle
- Module
json
- Module
yaml
- Module
marshal
- Module
shelve
Dưới đây sẽ là một cái nhìn tổng quan ngắn về mỗi cái:
8.2 Module pickle
pickle
— là module tích hợp cho
serialization và deserialization
đối tượng Python. Nó cho phép lưu và khôi phục
hầu hết các đối tượng Python, bao gồm cả các lớp tùy chỉnh.
Ví dụ sử dụng pickle
:
import pickle
# Ví dụ đối tượng để serialization
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# Serialization đối tượng vào tập tin
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# Deserialization đối tượng từ tập tin
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
8.3 Module json
json
— là module tích hợp để làm việc với JSON
(JavaScript Object Notation). JSON — là định dạng văn bản, được
sử dụng để trao đổi dữ liệu giữa client và server.
Ví dụ sử dụng json
:
import json
# Ví dụ đối tượng để serialization
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Serialization đối tượng thành chuỗi JSON
json_string = json.dumps(data)
print(json_string)
# Serialization đối tượng vào tập tin JSON
with open('data.json', 'w') as file:
json.dump(data, file)
# Deserialization đối tượng từ chuỗi JSON
loaded_data = json.loads(json_string)
print(loaded_data)
# Deserialization đối tượng từ tập tin JSON
with open('data.json', 'r') as file:
loaded_data = json.load(file)
print(loaded_data)
8.4 Module yaml
yaml
(YAML Ain't Markup Language) — là
định dạng serialization dữ liệu dễ đọc cho con người. Để làm việc với YAML trong
Python cần sử dụng thư viện bên thứ ba PyYAML.
Ví dụ sử dụng yaml
:
import yaml
# Ví dụ đối tượng để serialization
data = {'name': 'Carol', 'age': 27, 'is_student': False}
# Serialization đối tượng thành chuỗi YAML
yaml_string = yaml.dump(data)
print(yaml_string)
# Serialization đối tượng vào tập tin YAML
with open('data.yaml', 'w') as file:
yaml.dump(data, file)
# Deserialization đối tượng từ chuỗi YAML
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
# Deserialization đối tượng từ tập tin YAML
with open('data.yaml', 'r') as file:
loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)
8.5 Module marshal
marshal
— là module tích hợp cho serialization
đối tượng Python, được sử dụng để serialization mã Python.
Nó nhanh hơn pickle
, nhưng hỗ trợ ít loại đối tượng hơn và không linh hoạt.
Ví dụ sử dụng marshal
:
import marshal
# Ví dụ đối tượng để serialization
data = {'name': 'Dave', 'age': 35, 'is_student': True}
# Serialization đối tượng vào tập tin
with open('data.marshal', 'wb') as file:
marshal.dump(data, file)
# Deserialization đối tượng từ tập tin
with open('data.marshal', 'rb') as file:
loaded_data = marshal.load(file)
print(loaded_data)
8.6 Module shelve
shelve
— là module tích hợp,
cung cấp khả năng đơn giản để lưu trữ đối tượng Python vào tập tin với
việc sử dụng kho lưu trữ dựa trên khóa, tương tự như dictionary.
Ví dụ sử dụng shelve
:
import shelve
# Ví dụ đối tượng để serialization
data = {'name': 'Eve', 'age': 28, 'is_student': False}
# Serialization đối tượng vào tập tin
with shelve.open('data.shelve') as db:
db['person'] = data
# Deserialization đối tượng từ tập tin
with shelve.open('data.shelve') as db:
loaded_data = db['person']
print(loaded_data)
Và mặc dù bản thân các module và định dạng lưu dữ liệu khác nhau, công việc với
chúng từ góc độ lập trình viên rất giống nhau. Dưới đây chúng ta sẽ
tìm hiểu chi tiết hơn về cách làm việc với module pickle
và
module json
.
GO TO FULL VERSION