PHP
Python

Trang chủ

Serialization trong Python – Cách lưu trữ và truyền tải dữ liệu hiệu quả

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
21/03/2025
26 phút đọc
Theo dõi Vietnix trên

Serialization trong Python – Cách lưu trữ và truyền tải dữ liệu hiệu quả

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 trong Python
Serialization trong Python

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:

    1. 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).
    2. 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.
    3. 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.
    4. 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.
    5. 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.
    6. 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.
    7. 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').
    • pickle.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}

    iconLư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.

    Kết luận

    • pickle.dump() dùng để serialize (lưu object vào file).
    • pickle.load() dùng để deserialize (đọc lại object từ file).
    • Có thể serialize và deserialize hầu hết object trong Python, ngoại trừ những object không hỗ trợ như file handler, socket, thread,…

    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ảnMô 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 2Giớ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 4Giới thiệu trong Python 3.4, hỗ trợ các object có kích thước lớn hơn 4GB.
    Protocol version 5Xuấ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.
    Danh sách các protocol

    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 PicklerUnpickler để 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____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()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()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, VPSdomain 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?

    . 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?

    . 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__()__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:

    Cao Lê Viết Tiến

    PHP Leader
    tại
    Vietnix

    Kết nối với mình qua

    Icon Quote
    Icon Quote

    Học lập trình online cùng vietnix

    Học lập trình online cùng Vietnix

    PHPXem thêmThu gọn