Другие форматы
TOML, YAML, bincode
«Другие форматы» — бесплатный урок 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 — локальная установка не требуется.