構造体と文字列を相互変換する。
成果物
シリアライズとは
serde
rustのシリアライザ。
名前
serialize
, deserialize
の先頭をとったものと思われる。なんて読むの? シリデ?
新規プロジェクト作成
$ cargo new serde_hello --bin
成功
Cargo.toml
[dependencies] serde = { version = "1.0.97", features = ["derive"] } serde_json = "1.0.40"
実行してダウンロード&コンパイル。4分くらいかかった。
$ cargo run ...
main.rs
use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Debug)] struct Point { x: i32, y: i32, } fn main() { let point = Point { x: 1, y: 2 }; let serialized = serde_json::to_string(&point).unwrap(); println!("serialized = {}", serialized); let deserialized: Point = serde_json::from_str(&serialized).unwrap(); println!("deserialized = {:?}", deserialized); }
失敗
じつはちょっとハマった。
Cargo.toml
[dependencies] serde = "1.0.97"
crates.ioにはCargo.toml serde = "1.0.97"
と書いてあったのでそのまま設定した。これでは不足だったため、後でエラーになる。
main.rs
crates.io版
crates.ioにあったコードをパクる。
use serde::{Serialize, Deserialize}; #[derive(Serialize, Deserialize, Debug)] struct Point { x: i32, y: i32, } fn main() { let point = Point { x: 1, y: 2 }; let serialized = serde_json::to_string(&point).unwrap(); println!("serialized = {}", serialized); let deserialized: Point = serde_json::from_str(&serialized).unwrap(); println!("deserialized = {:?}", deserialized); }
実行するとエラー……。
$ cargo run ... error: cannot find derive macro `Deserialize` in this scope --> src/main.rs:6:21 | 6 | #[derive(Serialize, Deserialize, Debug)] | ^^^^^^^^^^^ error: cannot find derive macro `Serialize` in this scope --> src/main.rs:6:10 | 6 | #[derive(Serialize, Deserialize, Debug)] | ^^^^^^^^^
Qiita版
わからんのでググるとQiita記事を発見。ためしてみるもエラー……。
#[macro_use] extern crate serde_derive; extern crate serde; extern crate serde_json;
error[E0463]: can't find crate for `serde_derive` --> src/main.rs:3:1 | 3 | extern crate serde_derive; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate
これはバージョンアップでインタフェースが変わったということか? 資料にはバージョンも残してくれると助かる。というか、Cargo.tomlのコードが欲しい。
参考
所感
githubのコード例をみてようやく成功した。crates.io serdeのページではCargo.tomlの[dependencies]
設定コードが書いていないためコード例が動かなかった。
RustはCargo.toml
の設定がむずかしすぎる。ルールとかどこにあるの? あと、クレートを使い始める最初のコードくらいコピペで動くよう完全なコードを提供して欲しい。Cargo.toml
も含めて。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.36.0 (a53f9df32 2019-07-03)
- cargo 1.36.0 (c4fcfb725 2019-05-15)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust学習まとめ(ドキュメント)
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)
- Rust自習(じゃんけんゲーム8)
- Rustのアップデート(rustup update)
- Rust自習(SQLite3 1)
- Rust自習(SQLite3 2)
- Rust自習(SQLite3 3)
- Rust自習(日時 1 chrono)
- Rust自習(日時 2 chrono)
- Rust自習(日時 3 chrono)
- Rust自習(日時 4 chrono)
- Rust自習(日時 5 chrono)
- Rust自習(日時 6 chrono)
- Rust自習(日時 7 chrono)
- Rust自習(std::time::SystemTime)
- Rust自習(std::time::Instant)
- Rust自習(std::time::Duration)