その他の形式
TOML、YAML、bincode
「その他の形式」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
JSON の先へ
serde のコア部分は形式に依存しないため、形式クレートを置き換えるだけで、同じ derive 済み構造体を多くの形式で使えます。
- 設定には TOML
- 人間が扱いやすいデータには YAML
- コンパクトなバイナリには bincode
1 つの構造体、多数の形式
構造体は一度定義するだけです。各形式のクレートは、同じ Serialize / Deserialize 実装に対して、独自の to_string / from_str 相当の機能を提供します。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Config {
name: String,
port: u16,
}TOML
TOML は設定ファイルでよく使われます(Cargo.toml 自体も 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::from_str を使うと、TOML の設定を構造体に読み戻せます。
use serde::Deserialize;
#[derive(Deserialize)]
struct Config { name: String, port: u16 }
fn parse(s: &str) -> Config {
toml::from_str(s).unwrap()
}YAML
YAML はネストした、人間が編集するデータに適しています。同じ API 形式を持つ serde_yaml などのクレートを使います。
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
- Web 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 のその他の形式について学びました。
- 1 つの derive 済み構造体を TOML、YAML、JSON、bincode で使えます
- 各形式のクレートは、使い慣れた
to_string/from_str形式の API を提供します - 設定、API、バイナリストレージなど、用途に応じて選びます
- serde の属性はすべての形式に適用されます
これで Serde コースと Rust シリーズは完了です。
よくある質問
「その他の形式」レッスンは無料ですか?
はい。「その他の形式」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「その他の形式」で何を学びますか?
TOML、YAML、bincode ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「その他の形式」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。