0Pricing
Learn Rust Coding · Урок

Сериализация и десериализация

Производные макросы

«Сериализация и десериализация» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

Что такое Serde?

Serde (SERialize/DEserialize) — это фреймворк Rust для преобразования структур данных в форматы вроде JSON и YAML и обратно.

  • Ядро, не зависящее от формата, и отдельные пакеты для форматов
  • Работа на основе производных макросов

Добавление serde

Добавьте serde с возможностью derive, а также пакет для нужного формата, например serde_json. Это изменит Cargo.toml.

[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"

Выведение характеристик

Пометьте структуру атрибутом #[derive(Serialize, Deserialize)], чтобы сделать её преобразуемой. Каждое поле также должно поддерживать сериализацию.

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct User {
    id: u32,
    name: String,
}

Serialize означает преобразование в формат

Serialize преобразует значение в байты или текст некоторого формата. Структура не знает, какой именно это формат; его определяет пакет формата.

Deserialize означает преобразование из формата

Deserialize разбирает текст или байты обратно в значение Rust, одновременно проверяя типы и обязательные поля.

Моделирование сериализации вручную

Чтобы лучше понять принцип, рассмотрим написанный вручную сериализатор для простой структуры. serde генерирует подобный код автоматически.

struct User { id: u32, name: String }

fn serialize(u: &User) -> String {
    format!("id={};name={}", u.id, u.name)
}

fn main() {
    let u = User { id: 7, name: "Alice".to_string() };
    println!("{}", serialize(&u));
}

Моделирование десериализации вручную

А вот обратная операция: разбор текста обратно в структуру. Код, сгенерированный serde, надёжно выполняет это для разных форматов.

struct User { id: u32, name: String }

fn deserialize(s: &str) -> User {
    let parts: Vec<&str> = s.split(',').collect();
    let id = parts[0].parse().unwrap();
    let name = parts[1].to_string();
    User { id, name }
}

fn main() {
    let u = deserialize("42,Bob");
    println!("{} {}", u.id, u.name);
}

Выведение характеристик для перечислений

Перечисления также поддерживаются. По умолчанию каждый вариант сериализуется по своему имени, а вложенные данные помещаются внутрь.

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
enum Shape {
    Circle { radius: f64 },
    Square { side: f64 },
}

Вложенные структуры

serde автоматически обходит вложенные структуры. Структура, содержащая другие структуры с выведенными характеристиками или Vec, просто работает.

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Address { city: String }

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    addresses: Vec<Address>,
}

Только Serialize или только Deserialize

Можно вывести только одну характеристику. Тип ответа API может поддерживать только Serialize, а тип входящего запроса — только Deserialize.

use serde::Serialize;

#[derive(Serialize)]
struct ApiResponse {
    status: u16,
    message: String,
}

Требования для выведения характеристик

Тип каждого поля должен реализовывать выводимую характеристику. Стандартные типы и коллекции уже её реализуют; для пользовательских типов потребуется собственное выведение.

use serde::Serialize;

#[derive(Serialize)]
struct Inner { x: i32 }

#[derive(Serialize)]
struct Outer { inner: Inner }

Быстрая проверка

Проверьте своё понимание сериализации и десериализации.

Итоги

Вы изучили основы serde:

  • serde — фреймворк сериализации и десериализации, не зависящий от формата
  • #[derive(Serialize, Deserialize)] генерирует код преобразования
  • Работает со структурами, перечислениями и вложенными типами
  • При необходимости можно вывести только одно направление преобразования

Далее: работа с JSON с помощью serde_json.

Часто задаваемые вопросы

Урок «Сериализация и десериализация» бесплатный?

Да — полный текст урока «Сериализация и десериализация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Сериализация и десериализация»?

Производные макросы Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Сериализация и десериализация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сериализация и десериализация
  2. Работа с JSON
  3. Пользовательская сериализация
  4. Другие форматы
← Назад к Learn Rust Coding