为什么我们有两种方法来包含 serde_derive?

mas*_*cai 2 rust serde

我现在正在学习 rust serde 库,想了解这两种包含序列化/反序列化功能的方法有什么区别

正确的方法是什么(在生产代码中使用)?

实施例1

# Cargo.toml

serde = { version = "1.0", features = ["derive"] }
Run Code Online (Sandbox Code Playgroud)

我这种情况我必须使用use serde::{Deserialize, Serialize};

实施例2

# Cargo.toml
[dependencies]
serde = {version="1.0.117"}
serde_derive = {version="1.0.117"}
Run Code Online (Sandbox Code Playgroud)

我这种情况我必须使用use serde_derive::{Deserialize, Serialize};

Cha*_*man 6

常见的方法是包含serde并启用该derive功能。这样,您只有一个直接依赖项,无需担心 和serde版本不匹配serde-derive,并且可以直接使用serde.


kmd*_*eko 5

您应该使用第一种语法:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
Run Code Online (Sandbox Code Playgroud)

这是Serde 文档中所示的方式。


由于技术原因,导出程序宏(如#[derive]s)的 crate 必须是单独的 crate。如果不是这样,很可能根本就不会有 Serde 派生包。

派生宏是由功能控制的"derive",因为在某些情况下您不需要它,您可以通过省略它和其他有助于创建过程宏(syn、quote 等)的包来节省编译时间。

作为单独的依赖项,您还面临接口 (serde) 和生成器 (serde-derive) 不同步并生成错误或次优实现的风险。我没有看到这种情况发生在 serde 上,特别是因为它非常稳定,但它是可能的(就像使用strum = "0.25"but strum_macros = "0.24")。允许其中一个重新导出另一个可确保它们保持兼容。