やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rust自習(シリアライズ serde 1)

 構造体と文字列を相互変換する。

成果物

シリアライズとは

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も含めて。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで