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

2ic8powd  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(128)

我现在正在学习rust serde库,想了解这两种包含序列化/反序列化特性的方法之间有什么区别
什么是正确的方法(在生产代码中使用)?
实施例1

# Cargo.toml

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

字符串
在这种情况下,我必须使用use serde::{Deserialize, Serialize};
实施例2

# Cargo.toml
[dependencies]
serde = {version="1.0.117"}
serde_derive = {version="1.0.117"}


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

5rgfhyps

5rgfhyps1#

常见的方法是包含serde并启用derive特性。这样,您只有一个直接依赖项,您不需要担心serdeserde-derive版本中的不匹配,并且您可以直接从serde使用派生宏。

vqlkdk9b

vqlkdk9b2#

您应该使用第一种语法:

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

字符串
这是Serde文档中所示的方式。
由于技术原因,导出程序宏(如#[derive] s)的板条箱必须是单独的板条箱。如果不是这样的话,可能根本就不会有一个serde派生的板条箱。
派生宏是由"derive"进行特性门控的,因为在某些不需要它的情况下,可以省略它和其他有助于创建过程宏(syn、quote等)的板条箱,从而保存编译时间。
作为独立的依赖项,您还面临着接口(serde)和生成器(serde-derive)不同步以及生成错误或次优实现的风险。我不认为这种情况会发生在serde上,因为它非常稳定,但它是可能的(就像使用strum = "0.25",而不是strum_macros = "0.24")。允许其中一个重新导出另一个可确保它们保持兼容。

相关问题