本文最后更新于 2024-10-21,本文发布时间距今超过 90 天, 文章内容可能已经过时。最新内容请以官方内容为准

Rust libs day0

这是一个用于学习和使用 rust crates lib 包,然后总结一些特点和使用方法以及资料的一个系列。

serde

简介: A serialization framework for Rust. 也就是一个用于序列化与反序列化的框架,序列化是指将数据结构或对象状态转换为一个可以存储或传输的格式(通常是一个字节流或字符串),而反序列化则是将这种格式恢复成原始的数据结构或对象状态。更通俗的讲吗,则是将代码数据变成字符串,以及把传入的字符串反序列化成代码实体。

链接:https://docs.rs/serde/latest/serde/

注意事项:

  1. serde 只是一个框架,需要配合其它库使用,比如 serde_json、serde_yaml、serde_xml 等等。从而实现对对应的格式的文件的序列化与反序列化。
  • 因而在 cargo.toml 里需要添加完整的依赖。

例如我需要将我的一个 .toml 配置文件转换成 struct,那么就需要用到 serde_toml。

  # ...
  # < snip > # 忽略前面的一些设置
  [dependencies]
  serde = { version = "1.0", features = ["derive"] } # 使用了 derive 性 ---> #[derive(Serialize, Deserialize)] 可以像这样使用
  serde_toml = "1.0"

derive feature 的使用

我的 config.toml 文件

[log_config]
stdout = { enable = true, level = "info" }
stderr = { enable = false, level = "error" }
log_file = { enable = true, level = "debug", file_path = "log.log" }
database = { enable = false, level = "info", file_path = "./log.db", env="./env" }
metrics_target = { enable = true, level = "info", file_path = "metrics.log" }

rust 代码数据结构

#[derive(Debug, Deserialize)]
struct Config {
    log_config: LogConfig,
}

#[derive(Debug, Deserialize)]
struct LogConfig {
    stdout: EnableConfig,
    stderr: EnableConfig,
    log_file: EnableConfig,
    database: EnableConfig,
    metrics_target: EnableConfig,
}

#[derive(Debug, Deserialize)]
struct EnableConfig {
    pub enable: bool,
    pub level: Option<TLevel>, 
    // Option type 意味着 config.toml 里可以不写,则默认是 None
    pub file_path: Option<String>,
    pub env: Option<String>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "lowercase")] 
 // 枚举类型重命名,使其全部小写,从而能够匹配上 config.toml 里的字符串
enum TLevel {
    Trace = 0,
    Debug = 1,
    Info = 2,
    Warn = 3,
    Error = 4,
}

将 config.toml 转换成 Config 结构

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let file = "config.toml";
  let config_file = std::fs::read_to_string(file)?;
  let config: Config = toml::from_str(&config_file)?;
   // 这里明确了 config 为 Config 结构,
   // toml 则可以尝试将传入的字符串转换成 Config 结构,
   // 如果转换失败,则返回错误
}

derive attrs

serde 支持的 derive attr 有很多,大致分为这三类:

  1. Container attributes — 应用于结构或枚举声明
    • apply to a struct or enum declaration.
  2. Variant attributes — 应用于枚举的变体。
    • apply to a variant of an enum.
  3. Field attributes — 应用于结构体或枚举变量中的一个字段。
    • apply to one field in a struct or in an enum variant.

可以参考 https://serde.rs/attributes.html

serde 支持的数据类型

内容来自:https://docs.rs/serde/latest/serde/#data-formats

序列化库 描述
JSON 通用 JavaScript 对象表示法,许多 HTTP API 使用。
Postcard 适用于no_std和嵌入式系统的紧凑型二进制格式。
CBOR 设计用于小消息大小的精确二进制对象表示,无需版本协商。
YAML 自称是人类友好的配置语言,不是标记语言。
MessagePack 类似于紧凑 JSON 的高效二进制格式。
TOML Cargo 使用的最小配置格式。
Pickle Python 世界中常见的格式。
RON Rust 风格的对象表示法。
BSON MongoDB 用于数据存储和网络传输的格式。
Avro Apache Hadoop 内部使用的二进制格式,支持模式定义。
JSON5 JSON 的超集,包括 ES5 的一些产生式。
URL x-www-form-urlencoded 格式的 URL 查询字符串。
Starlark Bazel 和 Buck 构建系统描述构建目标的格式(仅序列化)。
Envy 将环境变量反序列化为 Rust 结构体的方式(仅反序列化)。
Envy Store 将 AWS 参数存储参数反序列化为 Rust 结构体的方式(仅反序列化)。
S-expressions Lisp 语言家族用于代码和数据文本表示的格式。
D-Bus D-Bus 的二进制线格式。
FlexBuffers Google 的 FlatBuffers 零拷贝序列化格式的无模式表亲。
Bencode BitTorrent 协议中使用的简单二进制格式。
Token streams 用于处理 Rust 过程宏输入的令牌流(仅反序列化)。
DynamoDB Items rusoto_dynamodb 用来与 DynamoDB 传输数据的格式。
Hjson 设计用于人类阅读和编辑的 JSON 的语法扩展(仅反序列化)。
CSV 逗号分隔值,是一种表格文本文件格式。