Сериализация и десериализация
Производные макросы
«Сериализация и десериализация» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Сериализация и десериализация
- Работа с JSON
- Пользовательская сериализация
- Другие форматы