#yaml #serde #serialization

已废弃 serde_yaml

为Serde的YAML数据格式

86个版本

0.9.34+已废弃2024年3月25日
0.9.32 2024年2月19日
0.9.29 2023年12月21日
0.9.27 2023年10月26日
0.2.3 2016年3月10日

#2386 in 编码

Download history 745213/week @ 2024-04-30 759196/week @ 2024-05-07 824662/week @ 2024-05-14 813260/week @ 2024-05-21 826900/week @ 2024-05-28 865832/week @ 2024-06-04 872485/week @ 2024-06-11 808999/week @ 2024-06-18 825461/week @ 2024-06-25 767233/week @ 2024-07-02 883768/week @ 2024-07-09 910151/week @ 2024-07-16 886349/week @ 2024-07-23 916782/week @ 2024-07-30 920522/week @ 2024-08-06 777729/week @ 2024-08-13

3,671,658 每月下载量
用于 4,653 个crate(直接使用2,806个)

MIT/Apache

345KB
9K SLoC

Serde YAML

github crates.io docs.rs build status

Serde序列化框架在YAML文件格式中使用的Rust库。(此项目不再维护。)

依赖

[dependencies]
serde = "1.0"
serde_yaml = "0.9"

发布说明可在GitHub发布中找到。

使用Serde YAML

API文档以rustdoc形式提供,但总体思路是

use std::collections::BTreeMap;

fn main() -> Result<(), serde_yaml::Error> {
    // You have some type.
    let mut map = BTreeMap::new();
    map.insert("x".to_string(), 1.0);
    map.insert("y".to_string(), 2.0);

    // Serialize it to a YAML string.
    let yaml = serde_yaml::to_string(&map)?;
    assert_eq!(yaml, "x: 1.0\ny: 2.0\n");

    // Deserialize it back to a Rust type.
    let deserialized_map: BTreeMap<String, f64> = serde_yaml::from_str(&yaml)?;
    assert_eq!(map, deserialized_map);
    Ok(())
}

它还可以与Serde的derive宏一起使用来处理程序中定义的结构体和枚举。

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

结构体按直观方式进行序列化

use serde::{Serialize, Deserialize};

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Point {
    x: f64,
    y: f64,
}

fn main() -> Result<(), serde_yaml::Error> {
    let point = Point { x: 1.0, y: 2.0 };

    let yaml = serde_yaml::to_string(&point)?;
    assert_eq!(yaml, "x: 1.0\ny: 2.0\n");

    let deserialized_point: Point = serde_yaml::from_str(&yaml)?;
    assert_eq!(point, deserialized_point);
    Ok(())
}

枚举使用YAML的!tag语法来识别变体名称进行序列化。

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum Enum {
    Unit,
    Newtype(usize),
    Tuple(usize, usize, usize),
    Struct { x: f64, y: f64 },
}

fn main() -> Result<(), serde_yaml::Error> {
    let yaml = "
        - !Newtype 1
        - !Tuple [0, 0, 0]
        - !Struct {x: 1.0, y: 2.0}
    ";
    let values: Vec<Enum> = serde_yaml::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Newtype(1));
    assert_eq!(values[1], Enum::Tuple(0, 0, 0));
    assert_eq!(values[2], Enum::Struct { x: 1.0, y: 2.0 });

    // The last two in YAML's block style instead:
    let yaml = "
        - !Tuple
          - 0
          - 0
          - 0
        - !Struct
          x: 1.0
          y: 2.0
    ";
    let values: Vec<Enum> = serde_yaml::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Tuple(0, 0, 0));
    assert_eq!(values[1], Enum::Struct { x: 1.0, y: 2.0 });

    // Variants with no data can be written using !Tag or just the string name.
    let yaml = "
        - Unit  # serialization produces this one
        - !Unit
    ";
    let values: Vec<Enum> = serde_yaml::from_str(yaml).unwrap();
    assert_eq!(values[0], Enum::Unit);
    assert_eq!(values[1], Enum::Unit);

    Ok(())
}

许可证

根据您的选择,许可协议为Apache许可证第2.0版MIT许可证
除非您明确声明,否则您有意提交给此crate的任何贡献,根据Apache-2.0许可证定义,将按上述方式双重许可,不附加任何额外条款或条件。

依赖

~1.3–1.8MB
~34K SLoC