Learn Rust Coding · Урок

Другие форматы

TOML, YAML, bincode

Урок 4 из 413 шагов

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

Не только JSON

Ядро serde не зависит от формата, поэтому одна и та же структура с выведенными характеристиками работает со множеством форматов — достаточно заменить пакет формата.

  • TOML для конфигурации
  • YAML для удобных для чтения человеком данных
  • bincode для компактных двоичных данных

Одна структура, множество форматов

Вы определяете структуру один раз. Каждый пакет формата предоставляет собственные эквиваленты to_string / from_str для тех же реализаций Serialize / Deserialize.

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct Config {
    name: String,
    port: u16,
}

TOML

TOML популярен для конфигурации (сам Cargo.toml использует этот формат). Пакет toml сериализует и разбирает его.

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_toml(c: &Config) -> String {
    toml::to_string(c).unwrap()
}

Разбор TOML

Прочитайте конфигурацию TOML обратно в структуру с помощью toml::from_str.

use serde::Deserialize;

#[derive(Deserialize)]
struct Config { name: String, port: u16 }

fn parse(s: &str) -> Config {
    toml::from_str(s).unwrap()
}

YAML

YAML подходит для данных, редактируемых человеком, и поддерживает вложенность. Используйте пакет, например serde_yaml, с тем же набором API.

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_yaml(c: &Config) -> String {
    serde_yaml::to_string(c).unwrap()
}

bincode

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

use serde::Serialize;

#[derive(Serialize)]
struct Config { name: String, port: u16 }

fn to_bytes(c: &Config) -> Vec<u8> {
    bincode::serialize(c).unwrap()
}

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

Выбирайте формат с учётом аудитории:

  • Человеческая конфигурация с вложенностью: TOML или YAML
  • Веб-API: JSON
  • Внутреннее двоичное хранение или передача: bincode

Моделирование выбора формата

Решение сводится к сопоставлению сценария использования и формата. Этот исполняемый пример отражает логику такого выбора.

fn pick_format(use_case: &str) -> &str {
    match use_case {
        "config" => "TOML",
        "api" => "JSON",
        "cache" => "bincode",
        _ => "JSON",
    }
}

fn main() {
    println!("{}", pick_format("config"));
    println!("{}", pick_format("cache"));
    println!("{}", pick_format("api"));
}

Циклическое преобразование байтов

Двоичные форматы поддерживают обратное преобразование: сериализуйте структуру в байты, а затем десериализуйте их обратно в ту же структуру. Этот исполняемый пример концептуально моделирует такое преобразование через длину байтов.

fn encode(name: &str) -> Vec<u8> {
    name.as_bytes().to_vec()
}

fn decode(bytes: &[u8]) -> String {
    String::from_utf8(bytes.to_vec()).unwrap()
}

fn main() {
    let bytes = encode("Alice");
    println!("len={}", bytes.len());
    println!("back={}", decode(&bytes));
}

Особенности отдельных форматов

Возможности форматов различаются. TOML не допускает null и требует таблицы для вложенности; YAML поддерживает якоря; bincode не содержит описания типа, поэтому обе стороны должны совместно использовать один и тот же тип.

Атрибуты по-прежнему действуют

Изученные атрибуты #[serde(...)] (rename, default, skip) работают во всех форматах, поскольку применяются на уровне serde, а не формата.

use serde::Serialize;

#[derive(Serialize)]
#[serde(rename_all = "kebab-case")]
struct Config { max_connections: u32 }

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

Проверьте своё понимание других форматов.

Итоги

Вы узнали о других форматах serde:

  • Одна структура с выведенными характеристиками работает с TOML, YAML, JSON и bincode
  • Каждый пакет формата предоставляет знакомые API в стиле to_string / from_str
  • Выбирайте формат с учётом назначения: конфигурация, API или двоичное хранилище
  • Атрибуты serde применяются к каждому формату

На этом курс по Serde и серия курсов по Rust завершены.

Можно начать бесплатно

Изучай Rust с ИИ-репетитором — бесплатно

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

Курсы
39
Уроки
144

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

Урок «Другие форматы» бесплатный?

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

Чему я научусь в уроке «Другие форматы»?

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

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

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

Сколько времени занимает урок «Другие форматы»?

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

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

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

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

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