Serialization là quá trình chuyển đổi dữ liệu hoặc object trong Python thành định dạng có thể lưu trữ hoặc truyền tải, sau đó phục hồi lại khi cần. Đây là kỹ thuật quan trọng trong lập trình, giúp lưu trạng thái chương trình, chia sẻ dữ liệu giữa các hệ thống hoặc tối ưu hiệu suất xử lý. Trong bài viết này, mình sẽ cùng bạn tìm hiểu cách thực hiện serialization trong Python bằng các thư viện phổ biến như Pickle, JSON và YAML. Đồng thời, bạn sẽ biết cách sử dụng các phương thức serialize và deserialize dữ liệu, lựa chọn protocol phù hợp và tùy chỉnh serialization cho object tự định nghĩa.
Điểm chính cần nắm
- Serialization trong Python là gì?: Quá trình chuyển đổi object trong Python thành định dạng có thể lưu trữ hoặc truyền tải, sau đó có thể khôi phục lại.
- Tại sao cần sử dụng serialization?: Giúp lưu trữ dữ liệu lâu dài, truyền dữ liệu giữa các chương trình hoặc hệ thống, hỗ trợ giao tiếp client-server.
- Các thư viện hỗ trợ serialization trong Python: Pickle, JSON, YAML là những thư viện phổ biến giúp thực hiện serialization.
- Serialization bằng module Pickle: Pickle hỗ trợ serialize và deserialize object Python một cách dễ dàng, phù hợp cho dữ liệu phức tạp.
- Pickler và Unpickler class: Hai class trong Pickle giúp tùy chỉnh quá trình serialize và deserialize dữ liệu.
- Serialization object của class tự định nghĩa: Có thể serialize object của class tùy chỉnh bằng cách định nghĩa phương thức đặc biệt.
- Serialization bằng JSON: JSON giúp chuyển đổi dữ liệu Python thành chuỗi JSON để lưu trữ hoặc gửi đi, phổ biến trong web API.
- Serialization bằng YAML: YAML là một định dạng dễ đọc, hỗ trợ lưu trữ cấu hình và trao đổi dữ liệu với Python.
- Vietnix – dịch vụ lưu trữ tốc độ cao, bảo mật vượt trội: Giới thiệu dịch vụ server, hosting, VPS chất lượng cao của Vietnix.
- FAQ: Cung cấp câu trả lời cho các thắc mắc thường gặp về serialization trong Python.
Serialization trong Python là gì?
Serialization trong Python là quá trình chuyển đổi một object thành định dạng có thể lưu trữ hoặc truyền đi (như byte stream hoặc chuỗi JSON). Quá trình ngược lại, chuyển đổi dữ liệu đã được serialize về object ban đầu, được gọi là deserialization. Python hỗ trợ nhiều thư viện để thực hiện serialization, phổ biến nhất là Pickle, JSON và YAML.

Serialization giúp:
- Lưu trữ dữ liệu vào file để sử dụng sau này.
- Truyền dữ liệu qua mạng giữa các hệ thống.
- Lưu trạng thái chương trình để khôi phục khi cần.
Trong Python, serialization thường được áp dụng với các cấu trúc dữ liệu phức tạp như dictionary, list, object để dễ dàng lưu trữ và trao đổi dữ liệu.
Tại sao cần sử dụng serialization?
Serialization cho phép lưu trữ và truyền dữ liệu một cách dễ dàng, giúp tái tạo lại dữ liệu khi cần. Điều này đặc biệt hữu ích trong nhiều tình huống như lưu trạng thái chương trình, truyền dữ liệu giữa các hệ thống hoặc tối ưu hóa hiệu suất.
Dưới đây là một số lý do chính:
- Lưu trữ dữ liệu: Cho phép ghi object vào file để sử dụng sau này, hữu ích khi cần lưu trạng thái chương trình, dữ liệu huấn luyện AI hoặc cấu hình ứng dụng.
- Truyền dữ liệu qua mạng: Hỗ trợ gửi dữ liệu giữa các hệ thống khác nhau, thường được dùng trong API web để trao đổi dữ liệu giữa client và server.
- Tích hợp với các hệ thống khác: JSON và YAML giúp trao đổi dữ liệu giữa Python với các ngôn ngữ khác như JavaScript, Java hoặc Go, giúp dễ dàng chia sẻ dữ liệu.
- Lưu trạng thái chương trình: Giúp khôi phục trạng thái ứng dụng mà không cần xử lý lại từ đầu, ví dụ như lưu tiến trình của một game hoặc quá trình huấn luyện mô hình machine learning.
- Tối ưu hóa hiệu suất: Chuyển đổi object thành byte stream giúp giảm kích thước dữ liệu, tối ưu tốc độ đọc/ghi. Một số giao thức như Pickle hỗ trợ serialization nhanh hơn so với lưu trữ dữ liệu thủ công.
Nếu bạn đang tìm kiếm một giải pháp lưu trữ dữ liệu hiệu quả, hãy thử sử dụng pickle
hoặc các thư viện khác như JSON, YAML. Và nếu bạn cần một server mạnh mẽ để triển khai ứng dụng, hãy tham khảo dịch vụ server của Vietnix.
Các thư viện hỗ trợ serialization trong Python
Python cung cấp nhiều thư viện để thực hiện tuần tự hóa, mỗi thư viện có những ưu điểm riêng. Dưới đây là cái nhìn tổng quan chi tiết về một số thư viện tuần tự hóa thường dùng trong Python:
- Pickle
- Hỗ trợ serialization và deserialization của hầu hết các object Python.
- Dễ sử dụng, nhưng chỉ hoạt động trong môi trường Python (không tương thích với các ngôn ngữ khác).
- Không an toàn nếu xử lý dữ liệu từ nguồn không đáng tin cậy (có thể bị khai thác để thực thi mã độc).
- JSON
- Hỗ trợ chuyển đổi giữa object Python và chuỗi JSON.
- Được sử dụng phổ biến trong web API vì JSON là định dạng tiêu chuẩn để trao đổi dữ liệu giữa các hệ thống.
- Chỉ hỗ trợ kiểu dữ liệu cơ bản như dict, list, str, int, float, bool và None.
- YAML
- Được sử dụng cho các file cấu hình hoặc lưu trữ dữ liệu có cấu trúc.
- Dễ đọc hơn JSON nhưng cần cài đặt thư viện
PyYAML
. - Hỗ trợ các kiểu dữ liệu phức tạp hơn JSON.
- MessagePack
- Phiên bản nhị phân của JSON, giúp tăng tốc độ xử lý và giảm kích thước dữ liệu.
- Hữu ích trong các ứng dụng cần hiệu suất cao.
- Protocol Buffers (protobuf)
- Được phát triển bởi Google, tối ưu hóa cho việc truyền dữ liệu giữa các hệ thống.
- Hiệu suất cao hơn JSON và XML, nhưng cần định nghĩa schema trước khi sử dụng.
- Marshal
- Tương tự Pickle nhưng chủ yếu được dùng để lưu trữ dữ liệu nội bộ của Python (ví dụ: bytecode).
- Không đảm bảo tương thích giữa các phiên bản Python.
- Shelve
- Sử dụng Pickle để lưu trữ object Python vào file dưới dạng key-value giống như một database đơn giản.
- Hữu ích khi cần lưu trữ dữ liệu lâu dài mà không cần thiết lập cơ sở dữ liệu phức tạp.
Tùy vào mục đích sử dụng, em có thể chọn thư viện phù hợp. Ví dụ, nếu cần trao đổi dữ liệu giữa các hệ thống, JSON hoặc Protobuf sẽ là lựa chọn tốt. Nếu chỉ cần lưu object trong Python, Pickle hoặc Shelve sẽ tiện lợi hơn.
Serialization bằng module Pickle
Pickle là một module trong Python giúp serialization (tuần tự hóa) và deserialization (giải tuần tự hóa) object Python. Pickle hỗ trợ hầu hết các kiểu dữ liệu trong Python, giúp lưu trữ và khôi phục object một cách dễ dàng.
Module pickle
trong Python được sử dụng để tuần tự hóa và giải tuần tự hóa các đối tượng. Tuần tự hóa, còn được gọi là pickling, liên quan đến việc chuyển đổi một đối tượng Python thành một luồng byte, sau đó có thể được lưu trữ trong một file hoặc truyền qua mạng. Giải tuần tự hóa, hay còn gọi là unpickling, là quá trình ngược lại, chuyển đổi luồng byte trở lại thành một đối tượng Python.
Cách serialize dữ liệu bằng pickle.dump()
Trong Python, pickle.dump()
được sử dụng để serialize (tuần tự hóa) một object và ghi vào file dưới dạng nhị phân. File phải được mở ở chế độ ghi nhị phân ("wb"
).
Cú pháp:
import pickle
pickle.dump(obj, file, protocol=None)
obj
: Object cần serialize.file
: File mở ở chế độ ghi nhị phân (wb
).protocol
: Phiên bản của giao thức Pickle (tùy chọn, mặc định làNone
– sử dụng phiên bản mới nhất).
Ví dụ: Serialize dictionary và ghi vào file
Trong ví dụ dưới đây, một từ điển được tuần tự hóa và ghi vào file có tên “data.pkl”:
import pickle
data = {"name": "Vietnix", "service": "VPS", "price": 150}
with open("data.pkl", "wb") as file:
pickle.dump(data, file) # Ghi object vào file
print("Dữ liệu đã được ghi vào data.pkl")
Kết quả:
Dữ liệu đã được ghi vào data.pkl
Nội dung file data.pkl
(ở dạng nhị phân, không đọc được trực tiếp):
b’\x80\x04\x95&\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x07Vietnix\x94\x8c\x07service\x94\x8c\x03VPS\x94\x8c\x05price\x94K\x96u.’
Khi mở file data.pkl
, dữ liệu sẽ trông như thế này do được serialize thành dạng byte.
Ví dụ: Serialize list và ghi vào file
numbers = [1, 2, 3, 4, 5]
with open("numbers.pkl", "wb") as file:
pickle.dump(numbers, file)
print("Danh sách đã được ghi vào numbers.pkl")
Kết quả:
Danh sách đã được ghi vào numbers.pkl
Nội dung file numbers.pkl
(ở dạng nhị phân):
b’\x80\x04\x95\x11\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04K\x05e.’
Tương tự, numbers.pkl
cũng chứa dữ liệu ở dạng byte, cần pickle.load()
để đọc lại.
Ví dụ: Serialize object với giao thức cụ thể
with open("data.pkl", "wb") as file:
pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)
Kết quả:
Dữ liệu đã được ghi vào data.pkl với HIGHEST_PROTOCOL
Nội dung file data.pkl
khi sử dụng HIGHEST_PROTOCOL
(ở dạng nhị phân, có thể khác nhau tùy phiên bản Python):
b’\x80\x05\x95&\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x07Vietnix\x94\x8c\x07service\x94\x8c\x03VPS\x94\x8c\x05price\x94K\x96u.’
File này được lưu với giao thức Pickle mới nhất, có thể tối ưu hóa hiệu suất.
Đọc lại dữ liệu từ file để kiểm tra
import pickle
# Đọc lại dictionary từ file
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print("Dữ liệu sau khi deserialize:", loaded_data)
# Đọc lại list từ file
with open('numbers.pkl', 'rb') as file:
loaded_numbers = pickle.load(file)
print("Danh sách sau khi deserialize:", loaded_numbers)
Kết quả:
Dữ liệu sau khi deserialize: {‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘price’: 150}
Danh sách sau khi deserialize: [1, 2, 3, 4, 5]
Cách deserialize dữ liệu bằng pickle.load()
Quá trình deserialize là đọc dữ liệu đã được serialize bằng pickle.dump()
và chuyển về object ban đầu. Điều này giúp khôi phục dữ liệu từ file hoặc nhận dữ liệu từ hệ thống khác.
Cú pháp:
import pickle
obj = pickle.load(file)
file
: File chứa dữ liệu đã được serialize (mở ở chế độ đọc nhị phân'rb'
).- p
ickle.load()
: Đọc dữ liệu từ file và chuyển nó về object ban đầu.
Ví dụ: Deserialize dictionary từ file
Giả sử dictionary đã được lưu vào data.pkl
bằng pickle.dump()
, ta có thể đọc lại như sau:
import pickle
# Serialize dictionary
data = {"name": "Vietnix", "service": "VPS", "price": 150}
with open("data.pkl", "wb") as file:
pickle.dump(data, file)
# Deserialize dictionary
with open("data.pkl", "rb") as file:
loaded_data = pickle.load(file)
print("Dữ liệu sau khi deserialize:", loaded_data)
Kết quả:
Dữ liệu sau khi deserialize: {‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘price’: 150}
Ví dụ: Deserialize list từ file
# Serialize list
numbers = [1, 2, 3, 4, 5]
with open("numbers.pkl", "wb") as file:
pickle.dump(numbers, file)
# Deserialize list
with open("numbers.pkl", "rb") as file:
loaded_numbers = pickle.load(file)
print("Danh sách sau khi deserialize:", loaded_numbers)
Kết quả:
Danh sách sau khi deserialize: [1, 2, 3, 4, 5]
Ví dụ: Deserialize object với giao thức cụ thể
Nếu trước đó dữ liệu đã được serialize bằng pickle.HIGHEST_PROTOCOL
, vẫn có thể đọc lại bình thường.
# Serialize data với HIGHEST_PROTOCOL
with open("data.pkl", "wb") as file:
pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)
# Deserialize data
with open("data.pkl", "rb") as file:
loaded_data = pickle.load(file)
print("Dữ liệu đã deserialize:", loaded_data)
Kết quả:
Dữ liệu đã deserialize: {‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘price’: 150}
Lưu ý
- File phải được mở ở chế độ đọc nhị phân (
rb
), nếu không sẽ gặp lỗi. - Nếu file bị hỏng hoặc không đúng định dạng,
pickle.load()
sẽ gây lỗi EOFError hoặc UnpicklingError.
Các protocol trong Pickle
Protocols là các quy ước để serialize (tuần tự hóa) và deserialize (giải tuần tự hóa) dữ liệu trong Python. Mỗi phiên bản protocol có các cải tiến về hiệu suất và khả năng tương thích. Hiện tại, pickle hỗ trợ 6 protocol, với mỗi phiên bản có đặc điểm riêng như sau:
Phiên bản | Mô tả |
---|---|
Protocol version 0 | Định dạng văn bản (ASCII), dễ đọc, tương thích với Python 2.x. |
Protocol version 1 | Định dạng nhị phân cũ, hỗ trợ tốt hơn cho dữ liệu phức tạp, vẫn tương thích với Python 2.x. |
Protocol version 2 | Giới thiệu trong Python 2.3, tối ưu cho các new-style class. |
Protocol version 3 | Được thêm vào Python 3.0, là lựa chọn tốt nhất khi cần tương thích giữa các phiên bản Python 3. |
Protocol version 4 | Giới thiệu trong Python 3.4, hỗ trợ các object có kích thước lớn hơn 4GB. |
Protocol version 5 | Xuất hiện từ Python 3.8, bổ sung hỗ trợ dữ liệu ngoài băng tần (out-of-band data), giúp tối ưu hiệu suất. |
Cách kiểm tra phiên bản protocol trong Python
Có thể kiểm tra phiên bản protocol cao nhất và mặc định bằng cách sử dụng các hằng số trong module pickle
:
import pickle
print("Protocol cao nhất hỗ trợ:", pickle.HIGHEST_PROTOCOL)
print("Protocol mặc định:", pickle.DEFAULT_PROTOCOL)
Kết quả:
Protocol cao nhất hỗ trợ: 5
Protocol mặc định: 4
Chọn protocol khi serialize dữ liệu
Có thể chỉ định phiên bản protocol khi dùng pickle.dump()
bằng cách truyền tham số protocol
:
import pickle
data = {"name": "Vietnix", "service": "VPS", "price": 150}
# Ghi dữ liệu với protocol cao nhất
with open("data.pkl", "wb") as file:
pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)
print("Dữ liệu đã được serialize với protocol cao nhất.")
Pickler và Unpickler class
Module pickle
trong Python cũng định nghĩa các lớp Pickler
và Unpickler
để kiểm soát chi tiết hơn quá trình tuần tự hóa và giải tuần tự hóa. Lớp “Pickler
” ghi dữ liệu pickle vào một file, trong khi lớp “Unpickler
” đọc dữ liệu nhị phân từ một file và tái tạo lại đối tượng Python ban đầu.
Module pickle
trong Python cung cấp hai class quan trọng:
- Pickler: Dùng để serialize (tuần tự hóa) dữ liệu và ghi vào file.
- Unpickler: Dùng để deserialize (giải tuần tự hóa) dữ liệu từ file.
1. Sử dụng Pickler Class
Lớp Pickler
giúp kiểm soát quá trình ghi dữ liệu vào file thay vì sử dụng pickle.dump()
. Để tuần tự hóa một đối tượng Python bằng cách sử dụng lớp Pickler
, bạn có thể thực hiện các bước sau:
Ví dụ: Lưu dictionary vào file
from pickle import Pickler
# Mở file ở chế độ ghi nhị phân
with open("data.pkl", "wb") as file:
# Dữ liệu cần serialize
data = {"name": "Vietnix", "service": "VPS", "price": 150}
# Sử dụng Pickler để ghi dữ liệu vào file
Pickler(file).dump(data)
print("Dữ liệu đã được serialize thành công!")
Kết quả: Sau khi thực thi mã trên, biểu diễn bằng byte của đối tượng từ điển sẽ được lưu trữ trong file “data.txt”.
Dữ liệu đã được serialize thành công!
2. Sử dụng unpickler để deserialize dữ liệu
Lớp Unpickler
giúp đọc dữ liệu từ file và khôi phục object gốc. Để giải tuần tự hóa dữ liệu từ file nhị phân bằng cách sử dụng lớp Unpickler
, bạn có thể thực hiện như sau:
Ví dụ: Đọc lại dictionary từ file
from pickle import Unpickler
# Mở file ở chế độ đọc nhị phân
with open("data.pkl", "rb") as file:
# Sử dụng Unpickler để đọc dữ liệu
loaded_data = Unpickler(file).load()
print("Dữ liệu sau khi deserialize:", loaded_data)
Kết quả:
Dữ liệu sau khi deserialize: {‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘price’: 150}
Serialization object của class tự định nghĩa
Module pickle
hỗ trợ serialize và deserialize object của class tự định nghĩa. Tuy nhiên, để quá trình này hoạt động, class phải tồn tại ở cả hai thời điểm: khi serialize và khi deserialize. Module pickle
cũng có thể tuần tự hóa và giải tuần tự hóa các lớp tùy chỉnh. Định nghĩa lớp phải có sẵn cả lúc pickling và unpickling.
Ví dụ cơ bản
Trong ví dụ này, một đối tượng của lớp “Person” được tuần tự hóa và sau đó được giải tuần tự hóa, giữ nguyên trạng thái của đối tượng:
import pickle
class Service:
def __init__(self, name, type, price):
self.name = name
self.type = type
self.price = price
# Tạo object từ class Service
service = Service('Vietnix', 'VPS', 150)
# Serialize object và lưu vào file
with open('service.pkl', 'wb') as file:
pickle.dump(service, file)
# Deserialize object từ file
with open('service.pkl', 'rb') as file:
service = pickle.load(file)
print(service.name, service.type, service.price)
Kết quả:
Vietnix VPS 150
Thư viện chuẩn Python cũng bao gồm module marshal
, được sử dụng cho tuần tự hóa nội bộ của các đối tượng Python. Không giống như pickle
, vốn được thiết kế cho mục đích sử dụng chung, marshal
chủ yếu được sử dụng bởi chính Python (ví dụ, để ghi file .pyc
).
Nó thường không được khuyến nghị cho việc tuần tự hóa mục đích chung do có thể xảy ra các vấn đề tương thích giữa các phiên bản Python.
Tùy chỉnh quá trình serialization
Khi cần kiểm soát dữ liệu nào được lưu trữ trong quá trình serialize, có thể sử dụng các method đặc biệt sau:
__getstate__()
: Xác định dữ liệu nào được lưu khi serialize.__setstate__()
: Xác định cách dữ liệu được khôi phục khi deserialize.__reduce__()
: Cung cấp cách serialize tùy chỉnh cho object.
Ví dụ với __getstate__
và __setstate__
:
class Service:
def __init__(self, name, type, price):
self.name = name
self.type = type
self.price = price
self.hidden_data = "Thông tin nội bộ Vietnix"
def __getstate__(self):
state = self.__dict__.copy()
del state['hidden_data'] # Không serialize thuộc tính này
return state
def __setstate__(self, state):
self.__dict__.update(state)
self.hidden_data = "Dữ liệu mặc định sau khi phục hồi" # Thêm lại thuộc tính
# Serialize và deserialize
service = Service('Vietnix', 'Dedicated Server', 250)
with open('service.pkl', 'wb') as file:
pickle.dump(service, file)
with open('service.pkl', 'rb') as file:
loaded_service = pickle.load(file)
print(loaded_service.__dict__)
Kết quả:
{‘name’: ‘Vietnix’, ‘type’: ‘Dedicated Server’, ‘price’: 250, ‘hidden_data’: ‘Dữ liệu mặc định sau khi phục hồi’}
Serialization bằng JSON
JSON (JavaScript Object Notation) là một định dạng phổ biến để trao đổi dữ liệu. JSON có ưu điểm là dễ đọc, dễ ghi và không phụ thuộc vào ngôn ngữ lập trình, nên rất phù hợp cho quá trình serialization (tuần tự hóa) và deserialization (giải tuần tự hóa) dữ liệu trong Python. Python cung cấp sẵn module json
, giúp chuyển đổi dữ liệu từ object Python sang JSON và ngược lại.
Cách serialize dữ liệu bằng json.dumps()
và json.dump()
.
Serialization là quá trình chuyển đổi một object Python thành chuỗi JSON hoặc ghi vào file.
Chuyển đổi object Python thành chuỗi JSON
Sử dụng phương thức json.dumps()
để chuyển đổi object Python thành chuỗi JSON. Trong ví dụ dưới đây, chúng ta sử dụng hàm json.dumps()
để chuyển đổi một từ điển Python thành một chuỗi JSON:
import json
# Tạo dictionary
data = {"name": "Vietnix", "service": "VPS", "location": "Vietnam"}
# Chuyển dictionary thành chuỗi JSON
json_string = json.dumps(data)
print(json_string)
Kết quả:
{“name”: “Vietnix”, “service”: “VPS”, “location”: “Vietnam”}
Ghi object Python vào file dưới dạng JSON
Ở đây, chúng ta sử dụng hàm json.dump()
để ghi dữ liệu JSON đã tuần tự hóa trực tiếp vào một file:
import json
# Tạo dictionary
data = {"name": "Vietnix", "service": "VPS", "location": "Vietnam"}
# Ghi dữ liệu JSON vào file
with open("vietnix.json", "w") as f:
json.dump(data, f)
print("Dữ liệu đã được ghi vào file thành công!")
Cách deserialize dữ liệu bằng json.loads()
và json.load()
.
Giải tuần tự hóa là quá trình chuyển đổi một chuỗi JSON trở lại thành một đối tượng Python hoặc đọc nó từ một file.
Chuyển JSON string thành object Python
Sử dụng json.loads()
để chuyển chuỗi JSON thành dictionary:
import json
# Chuỗi JSON
json_string = '{"name": "Vietnix", "service": "VPS", "location": "Vietnam"}'
# Chuyển chuỗi JSON thành dictionary
loaded_data = json.loads(json_string)
print(loaded_data)
Kết quả:
{‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘location’: ‘Vietnam’}
Đọc dữ liệu từ file JSON và chuyển thành object Python
Sử dụng json.load()
để đọc dữ liệu từ file JSON:
import json
# Đọc dữ liệu từ file JSON
with open("vietnix.json", "r") as f:
loaded_data = json.load(f)
print(loaded_data)
Kết quả:
{‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘location’: ‘Vietnam’}
Serialization bằng YAML
YAML (YAML Ain’t Markup Language) là một định dạng phổ biến để lưu trữ và trao đổi dữ liệu, tương tự như JSON nhưng dễ đọc hơn đối với con người. Python hỗ trợ xử lý YAML thông qua thư viện PyYAML
.
Cài đặt thư viện PyYAML
Python hỗ trợ tuần tự hóa và giải tuần tự hóa YAML thông qua gói pyyaml
, cần phải được cài đặt trước như dưới đây:
pip install pyyaml
Cách serialize dữ liệu bằng yaml.dump()
Hàm yaml.dump()
giúp chuyển đổi một dictionary Python thành chuỗi YAML và có thể ghi vào file. Ví dụ dưới đây sử dụng yaml.dump()
để serialize dữ liệu và lưu vào file vietnix.yaml
. Tham số default_flow_style=False
giúp YAML dễ đọc hơn với định dạng mở rộng.
import yaml
# Tạo dictionary
data = {"name": "Vietnix", "service": "VPS", "location": "Vietnam"}
# Serialize dictionary và ghi vào file YAML
with open("vietnix.yaml", "w", encoding="utf-8") as f:
yaml.dump(data, f, default_flow_style=False, allow_unicode=True)
print("Dữ liệu đã được ghi vào file thành công!")
Cách deserialize dữ liệu bằng yaml.safe_load()
Hàm yaml.safe_load()
giúp đọc dữ liệu từ file YAML và chuyển đổi thành dictionary Python. Nên sử dụng safe_load()
để tránh các rủi ro bảo mật, vì nó chỉ cho phép các kiểu dữ liệu Python cơ bản. Ví dụ dưới đây thực hiện quá trình deserialize từ file vietnix.yaml
:
Sử dụng safe_load()
được khuyến nghị vì lý do bảo mật vì nó chỉ cho phép các kiểu dữ liệu Python cơ bản và tránh việc thực thi mã tùy ý từ các file YAML.
import yaml
# Đọc dữ liệu từ file YAML
with open("vietnix.yaml", "r", encoding="utf-8") as f:
loaded_data = yaml.safe_load(f)
print(loaded_data)
Kết quả:
{‘name’: ‘Vietnix’, ‘service’: ‘VPS’, ‘location’: ‘Vietnam’}
Tổng kết
- Serialization: Dùng
yaml.dump()
để chuyển object Python thành YAML và ghi vào file. - Deserialization: Dùng
yaml.safe_load()
để đọc file YAML và chuyển thành object Python. - YAML có cú pháp dễ đọc hơn JSON, rất hữu ích khi làm việc với file cấu hình hoặc lưu trữ dữ liệu có cấu trúc.
Vietnix – dịch vụ lưu trữ tốc độ cao, bảo mật vượt trội
Vietnix là một trong những nhà cung cấp dịch vụ thuê chỗ đặt máy chủ (server), hosting, VPS và domain hàng đầu Việt Nam. Với cam kết mang đến giải pháp lưu trữ ổn định, hiệu suất cao và bảo mật tối ưu, Vietnix không ngừng nâng cấp chất lượng dịch vụ, đồng hành cùng doanh nghiệp trong quá trình phát triển. Hơn 80.000 khách hàng đã tin tưởng lựa chọn Vietnix nhờ vào hệ thống máy chủ mạnh mẽ cùng đội ngũ hỗ trợ kỹ thuật 24/7 chuyên nghiệp.
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 18001093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, TP. Hồ Chí Minh.
Câu hỏi thường gặp
Có nên dùng Pickle trong các ứng dụng web không?
Không. Pickle không an toàn nếu dữ liệu được deserialize từ nguồn không tin cậy. JSON hoặc MessagePack sẽ là lựa chọn tốt hơn.
Pickle có thể serialize object chứa reference vòng lặp không?
Có. Pickle tự động phát hiện vòng lặp tham chiếu và xử lý chúng mà không gây lỗi.
import pickle data = {} data["self"] = data # Tạo vòng lặp tham chiếu serialized = pickle.dumps(data) deserialized = pickle.loads(serialized) print(deserialized is deserialized["self"]) # True
Có thể dùng Pickle để chia sẻ dữ liệu giữa các phiên bản Python khác nhau không?
Không đảm bảo 100%. Pickle không duy trì khả năng tương thích giữa các phiên bản Python, đặc biệt khi dữ liệu dùng protocol cũ.
Có cách nào để serialize object mà không làm mất thứ tự của OrderedDict
không?
Có. Pickle giữ nguyên thứ tự của OrderedDict
. Còn với JSON, cần dùng object_pairs_hook=OrderedDict
khi deserialize.
Làm sao để serialize object class tự định nghĩa mà không bị mất dữ liệu?
Cần cài đặt phương thức __getstate__()
và __setstate__()
trong class để kiểm soát cách serialize dữ liệu.
import pickle class MyClass: def __init__(self, name): self.name = name def __getstate__(self): return self.__dict__ # Chỉ lưu trữ dictionary nội bộ def __setstate__(self, state): self.__dict__.update(state) # Khôi phục dữ liệu obj = MyClass("Vietnix") data = pickle.dumps(obj) obj_loaded = pickle.loads(data) print(obj_loaded.name) # Vietnix
Lời kết
Serialization giúp bạn làm việc với dữ liệu linh hoạt hơn, từ lưu trữ lâu dài đến truyền tải giữa các hệ thống. Python cung cấp nhiều công cụ mạnh mẽ để thực hiện serialization, mỗi công cụ có ưu điểm riêng phù hợp với từng trường hợp sử dụng. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới, mình sẽ phản hồi nhanh nhất. Cảm ơn bạn đã đọc!
Mọi người cũng xem: