82次发布

0.0.117 2024年4月20日
0.0.108 2024年3月30日
0.0.94 2023年12月12日
0.0.91 2023年11月13日
0.0.37 2022年5月27日

#2243 in 编码

Download history 11/week @ 2024-04-24 5/week @ 2024-05-22 1/week @ 2024-06-26 98/week @ 2024-07-03 2/week @ 2024-07-17 72/week @ 2024-07-24

74 每月下载量
用于 musli-tests

MIT/Apache

1MB
26K SLoC

musli-descriptive

github crates.io docs.rs build status

Müsli的完整自描述格式。

自描述编码是完全升级稳定的

  • ✔ 可以容忍缺失的字段,如果这些字段带有 #[musli(default)] 注释。
  • ✔ 可以跳过未知字段。
  • ✔ 可以在动态容器(如 Value 类型)之间完全相互转换。
  • ✔ 可以处理不同原始类型之间的强制类型转换,例如有符号整数到无符号整数。因此,原始字段类型可以假设它们只包含兼容的值。

这意味着它非常适合作为线和通用交换格式。它也适合在没有访问数据模型的情况下动态地转换到和从不同的线格式(如JSON)。

use musli::{Encode, Decode};

#[derive(Debug, PartialEq, Encode, Decode)]
struct Version1 {
    name: String,
}

#[derive(Debug, PartialEq, Encode, Decode)]
struct Version2 {
    name: String,
    #[musli(default)]
    age: Option<u32>,
}

let version2 = musli_descriptive::to_vec(&Version2 {
    name: String::from("Aristotle"),
    age: Some(62),
})?;

let version1: Version1 = musli_descriptive::decode(version2.as_slice())?;

assert_eq!(version1, Version1 {
    name: String::from("Aristotle"),
});

配置

要配置线格式的行为,您可以使用 Encoding 类型

use musli_descriptive::Encoding;
use musli::{Encode, Decode};

const CONFIG: Encoding = Encoding::new();

#[derive(Debug, PartialEq, Encode, Decode)]
struct Struct<'a> {
    name: &'a str,
    age: u32,
}

let mut out = Vec::new();

let expected = Struct {
    name: "Aristotle",
    age: 61,
};

CONFIG.encode(&mut out, &expected)?;
let actual = CONFIG.decode(&out[..])?;

assert_eq!(expected, actual);

实现细节

每个字段都用一个单字节标签进行前缀 类型 编码,该标签精确地描述了字段中包含的类型。

依赖关系

~1–1.5MB
~30K SLoC