`,rust,serde"/>

首页 > 解决方案 > edition = "2018" 使用或不使用`extern crate`

问题描述

我想序列化一个结构,将其打印到标准输出,从另一个程序中读取并反序列化。我发现我可以使用serde crate 和Bincode作为数据格式。

我想出了这个例子:

#[macro_use]
extern crate serde;

use bincode::{deserialize, serialize};

#[derive(Serialize, Deserialize)]
struct Entity {
    x: f32,
    y: f32,
}

#[derive(Serialize, Deserialize)]
struct World(Vec<Entity>);

fn main() {
    let world = World(vec![Entity { x: 0.0, y: 4.0 }, Entity { x: 10.0, y: 20.5 }]);

    let encoded: Vec<u8> = serialize(&world).unwrap();
    println!("{:?}", encoded);

    let decoded: World = deserialize(&encoded[..]).unwrap();
}

Cargo.toml我有:

[package]
name = "test"
version = "0.1.0"
edition = "2018"

[dependencies]
bincode = "1.1.4"
serde = { version = "1.0", features = ["derive"] }

但是让我感到困惑的是,即使我已经声明使用edition = "2018"并且根据我的理解,这意味着extern crate serde;可以省略,如果我删除这些行:

#[macro_use]
extern crate serde;

我收到多个错误,例如:

error: cannot find derive macro `Deserialize` in this scope
 --> src/main.rs:3:21
  |
3 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^

error: cannot find derive macro `Serialize` in this scope
 --> src/main.rs:3:10
  |
3 | #[derive(Serialize, Deserialize)]
  |          ^^^^^^^^^

error: cannot find derive macro `Deserialize` in this scope
 --> src/main.rs:9:21
  |
9 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^

error: cannot find derive macro `Serialize` in this scope
 --> src/main.rs:9:10
  |
9 | #[derive(Serialize, Deserialize)]
  |          ^^^^^^^^^

因此想知道何时或如何使用edition = "2018"

的使用#[macro_use]让我想起了 Python 中的装饰器,可能是相同的逻辑适用于 Rust,还是正在进行标准化更多语言的工作,以便可能edition = "20XX不需要#[macro_use]

#[macro_use]
extern crate serde;

我正在使用 Rust 1.35.0。

标签: rustserde

解决方案


在 2018 版中,过程宏与其他任何项目一样,因此您必须将它们纳入范围:

use serde::{Serialize, Deserialize};

推荐阅读