← Назад к вопросам

Зачем нужна сериализация?

1.8 Middle🔥 171 комментариев
#Python Core#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сериализация: преобразование объектов в передаваемый формат

Сериализация — это процесс преобразования объектов, структур данных или состояния программы в формат, который можно сохранить, передать по сети или восстановить позже. Это решает проблему того, что в памяти объекты существуют в виде бинарного представления, не пригодного для передачи или сохранения.

Зачем нужна сериализация

1. Передача данных по сети

user = User(id=1, name="Alice", email="alice@example.com")
import json
user_json = json.dumps({"id": 1, "name": "Alice", "email": "alice@example.com"})
response = requests.post("http://api.example.com/users", data=user_json)

2. Сохранение на диск

data = {"users": [user1, user2, user3]}
import json
with open("data.json", "w") as f:
    json.dump(data, f)
with open("data.json", "r") as f:
    loaded_data = json.load(f)

3. Кэширование

import redis, json
rc = redis.Redis()
user = {"id": 1, "name": "Alice"}
rc.set("user:1", json.dumps(user))
stored = rc.get("user:1")
user_back = json.loads(stored)

Основные форматы сериализации

1. JSON — текстовый, читаемый

import json
data = {"id": 1, "name": "Alice", "active": True}
json_string = json.dumps(data)
loaded = json.loads(json_string)

2. Pickle — бинарный, специфичный для Python

import pickle
data = {"id": 1, "name": "Alice", "tags": ["python", "backend"]}
pickled = pickle.dumps(data)
restored = pickle.loads(pickled)

3. Protocol Buffers (protobuf) — бинарный, эффективный

from google.protobuf.json_format import MessageToJson
user = User(id=1, name="Alice", email="alice@example.com")
serialized = user.SerializeToString()

4. MessagePack — бинарный, компактный

import msgpack
data = {"id": 1, "name": "Alice"}
packed = msgpack.packb(data)
restored = msgpack.unpackb(packed)

Практические примеры

1. REST API ответ

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    email: str

@app.get("/api/v1/users/{user_id}")
async def get_user(user_id: int) -> User:
    user = User(id=user_id, name="Alice", email="alice@example.com")
    return user

2. Очереди сообщений

import json, pika
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()
message = {"order_id": 123, "user_id": 1, "total": 99.99}
channel.basic_publish(
    exchange="",
    routing_key="orders",
    body=json.dumps(message)
)

def callback(ch, method, properties, body):
    message = json.loads(body)
    process_order(message["order_id"])

Проблемы при сериализации

1. Циклические ссылки

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

a = Node(1)
b = Node(2)
a.next = b
b.next = a
json.dumps(a.__dict__)  # ValueError

2. Типы данных, которые JSON не поддерживает

from datetime import datetime
data = {"timestamp": datetime.now(), "bytes": b"hello"}

def custom_encoder(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError

json.dumps(data, default=custom_encoder)

3. Версионирование

data_v1 = {"id": 1, "name": "Alice"}
data_v2 = {"id": 1, "name": "Alice", "email": "alice@example.com"}

def load_user(data):
    email = data.get("email", "unknown@example.com")
    return User(id=data["id"], name=data["name"], email=email)

Выбор формата

ФорматКогдаПлюсыМинусы
JSONREST APIЧитаемый, универсальныйБольше размер
PicklePython internoБыстроНебезопасно
ProtobufgRPCКомпактныйСложнее
MessagePackВысоконагруженныеОчень компактныйНе читаемый

Заключение

Сериализация — это критическая часть любого приложения. Она решает проблему преобразования объектов в памяти в формат, который можно передавать, сохранять и восстанавливать. Выбор правильного формата сериализации зависит от требований: JSON для веб-приложений (простой и универсальный), Protobuf для высокопроизводительных систем (компактный и быстрый), Pickle для внутреннего использования в Python (но осторожно с безопасностью).