シリアライズとデシリアライズ
Deriveマクロ
「シリアライズとデシリアライズ」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
Serdeとは
Serde(SERialize/DEserialize)は、Rustのデータ構造をJSON、YAMLなどの形式へ変換したり、そこから変換したりするためのフレームワークです。
- 形式に依存しないコアと、形式ごとのクレートで構成されています
- deriveマクロによって利用します
serdeの追加
derive機能を有効にしてserdeを追加し、さらにserde_jsonのような形式用クレートも追加します。これによりCargo.tomlが編集されます。
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"トレイトのderive
構造体に #[derive(Serialize, Deserialize)] を付けると、変換可能になります。各フィールド自体もシリアライズ可能でなければなりません。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct User {
id: u32,
name: String,
}シリアライズとは形式への変換です
Serialize は値を、何らかの形式のバイト列またはテキストに変換します。構造体は形式を知る必要がなく、どの形式を使うかはフォーマットクレートが決定します。
デシリアライズとは形式からの変換です
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);
}列挙型で derive を使う
列挙型でも機能します。デフォルトでは、各バリアントは名前でシリアライズされ、データがある場合はその内側にネストされます。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
enum Shape {
Circle { radius: f64 },
Square { side: f64 },
}ネストした構造
serde は自動的に再帰処理を行います。ほかの derive 済み構造体や Vec を含む構造体でも、そのまま機能します。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Address { city: String }
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
addresses: Vec<Address>,
}Serialize のみ、または Deserialize のみ
1 つのトレイトだけを derive することもできます。API のレスポンス型は Serialize のみ、受信するリクエスト型は Deserialize のみという形にできます。
use serde::Serialize;
#[derive(Serialize)]
struct ApiResponse {
status: u16,
message: String,
}derive の要件
すべてのフィールド型は、derive するトレイトを実装していなければなりません。標準型やコレクションはすでに対応していますが、独自型には独自の derive が必要です。
use serde::Serialize;
#[derive(Serialize)]
struct Inner { x: i32 }
#[derive(Serialize)]
struct Outer { inner: Inner }理解度チェック
シリアライズとデシリアライズについての理解度を確認しましょう。
まとめ
serde の基本を学びました。
- serde は形式に依存しないシリアライズ/デシリアライズフレームワークです
#[derive(Serialize, Deserialize)]が変換コードを生成します- 構造体、列挙型、ネストした型で使用できます
- 必要に応じて一方向だけを derive できます
次は、serde_json を使った JSON の操作です。
よくある質問
「シリアライズとデシリアライズ」レッスンは無料ですか?
はい。「シリアライズとデシリアライズ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「シリアライズとデシリアライズ」で何を学びますか?
Deriveマクロ ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「シリアライズとデシリアライズ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- シリアライズとデシリアライズ
- JSONの操作
- カスタムシリアライゼーション
- その他の形式