我现在正在学习 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};)
您应该使用第一种语法:
[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")。允许其中一个重新导出另一个可确保它们保持兼容。