我现在正在学习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};
)
2条答案
按热度按时间5rgfhyps1#
常见的方法是包含
serde
并启用derive
特性。这样,您只有一个直接依赖项,您不需要担心serde
和serde-derive
版本中的不匹配,并且您可以直接从serde
使用派生宏。vqlkdk9b2#
您应该使用第一种语法:
字符串
这是Serde文档中所示的方式。
由于技术原因,导出程序宏(如
#[derive]
s)的板条箱必须是单独的板条箱。如果不是这样的话,可能根本就不会有一个serde派生的板条箱。派生宏是由
"derive"
进行特性门控的,因为在某些不需要它的情况下,可以省略它和其他有助于创建过程宏(syn、quote等)的板条箱,从而保存编译时间。作为独立的依赖项,您还面临着接口(serde)和生成器(serde-derive)不同步以及生成错误或次优实现的风险。我不认为这种情况会发生在serde上,因为它非常稳定,但它是可能的(就像使用
strum = "0.25"
,而不是strum_macros = "0.24"
)。允许其中一个重新导出另一个可确保它们保持兼容。