8.1 Що таке серіалізація

Після того як ти навчився працювати з файлами, зберігати та читати дані, настав час навчитися працювати з файлами серйозно. Сьогодні ми з тобою почнемо вивчати серіалізацію.

Серіалізація — це процес перетворення об'єкта в послідовність байтів або формат, який можна зберегти у файл, передати по мережі або зберегти у базі даних. Десеріалізація — це зворотний процес, при якому з цієї послідовності байтів відновлюється вихідний об'єкт.

Щоб зберегти об'єкт у файл (або передати його по мережі), потрібно перетворити його в певну строку (або набір байтів), яку буде легко записати у файл (і зчитати з файлу) або передати по мережі.

Ось 4 основних напрямки, де використовується серіалізація:

  • Збереження стану об'єктів: Щоб зберегти стан об'єкта між запусками програми.
  • Передача даних: Щоб передавати об'єкти по мережі між різними компонентами системи або між різними системами.
  • Кешування: Щоб зберігати об'єкти в кеші для швидкого доступу.
  • Бази даних: Щоб зберігати складні структури даних у базах даних.

Бібліотек, які займаються серіалізацією, дуже багато, і кожна створена під свої потреби. Ми ознайомимося з п'ятьма з них, а з двома це знайомство буде дуже детальним.

Розглянемо найбільш популярні з них:

  • Модуль pickle
  • Модуль json
  • Модуль yaml
  • Модуль marshal
  • Модуль shelve

Нижче буде короткий огляд кожного з них:

8.2 Модуль pickle

pickle — це вбудований модуль для серіалізації і десеріалізації об'єктів Python. Він дозволяє зберігати і відновлювати практично будь-які об'єкти Python, включаючи користувацькі класи.

Приклад використання pickle:


import pickle

# Приклад об'єкта для серіалізації
data = {'name': 'Alice', 'age': 30, 'is_student': False}
            
# Серіалізація об'єкта у файл
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)
            
# Десеріалізація об'єкта з файлу
with open('data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
            
print(loaded_data)

8.3 Модуль json

json — це вбудований модуль для роботи з JSON (JavaScript Object Notation). JSON — це текстовий формат, який використовується для обміну даними між клієнтом і сервером.

Приклад використання json:


import json

# Приклад об'єкта для серіалізації
data = {'name': 'Bob', 'age': 25, 'is_student': True}
            
# Серіалізація об'єкта в строку JSON
json_string = json.dumps(data)
print(json_string)
            
# Серіалізація об'єкта у файл JSON
with open('data.json', 'w') as file:
    json.dump(data, file)
            
# Десеріалізація об'єкта зі строки JSON
loaded_data = json.loads(json_string)
print(loaded_data)
            
# Десеріалізація об'єкта з файлу JSON
with open('data.json', 'r') as file:
    loaded_data = json.load(file)
print(loaded_data)

8.4. Модуль yaml

yaml (YAML Ain't Markup Language) — це читабельний для людини формат серіалізації даних. Для роботи з YAML в Python використовується стороння бібліотека PyYAML.

Приклад використання yaml:


import yaml

# Приклад об'єкта для серіалізації
data = {'name': 'Carol', 'age': 27, 'is_student': False}
            
# Серіалізація об'єкта в строку YAML
yaml_string = yaml.dump(data)
print(yaml_string)
            
# Серіалізація об'єкта у файл YAML
with open('data.yaml', 'w') as file:
    yaml.dump(data, file)
            
# Десеріалізація об'єкта зі строки YAML
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
            
# Десеріалізація об'єкта з файлу YAML
with open('data.yaml', 'r') as file:
    loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)

8.5 Модуль marshal

marshal — це вбудований модуль для серіалізації об'єктів Python, який використовується для серіалізації коду Python. Він швидший за pickle, але підтримує менше типів об'єктів і не так гнучкий.

Приклад використання marshal:


import marshal

# Приклад об'єкта для серіалізації
data = {'name': 'Dave', 'age': 35, 'is_student': True}

# Серіалізація об'єкта у файл
with open('data.marshal', 'wb') as file:
    marshal.dump(data, file)
            
# Десеріалізація об'єкта з файлу
with open('data.marshal', 'rb') as file:
    loaded_data = marshal.load(file)
            
print(loaded_data)

8.6 Модуль shelve

shelve — це вбудований модуль, який надає просту можливість зберігати об'єкти Python у файли з використанням сховища на основі ключів, схожого на словник.

Приклад використання shelve:


import shelve

# Приклад об'єкта для серіалізації
data = {'name': 'Eve', 'age': 28, 'is_student': False}
            
# Серіалізація об'єкта у файл
with shelve.open('data.shelve') as db:
    db['person'] = data
            
# Десеріалізація об'єкта з файлу
with shelve.open('data.shelve') as db:
    loaded_data = db['person']
            
print(loaded_data)

І хоча самі модулі і формат зберігання даних відрізняються, робота з ними з точки зору програміста дуже схожа. Нижче ми більш детально розберемо роботу з модулем pickle і модулем json.