#serialization #data-structures #json #goal #design #deserialize #prototype

no-std miniserde-miku

与Serde有多个相反设计目标的数据结构序列化库

2个版本

0.1.23 2022年2月28日
0.1.22 2022年2月28日

#707编码


miku-rpc 中使用

MIT/Apache

100KB
2K SLoC

Miniserde

github crates.io docs.rs build status

与Serde有多个相反设计目标的数据结构序列化库的原型。

小型分支/补丁版本,用于使用arrayvec/arraystring进行序列化

作为一个原型,这个库不是像Serde那样的生产质量工程成果。同时,它不仅仅是一个概念验证,而且应该能够完全适用于它所针对的使用范围,如下所述。

[dependencies]
miniserde = "0.1"

版本要求:rustc 1.36+

示例

use miniserde::{json, Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct Example {
    code: u32,
    message: String,
}

fn main() -> miniserde::Result<()> {
    let example = Example {
        code: 200,
        message: "reminiscent of Serde".to_owned(),
    };

    let j = json::to_string(&example);
    println!("{}", j);

    let out: Example = json::from_str(&j)?;
    println!("{:?}", out);

    Ok(())
}

以下是与Serde的一些相似之处和不同之处。

相似:性能出色

实际上,这个库的速度比它应得的要快得多。到目前为止,经过很少的配置文件和优化,这个库在某些用例上与serde_json相当,大多数用例慢1.5倍,某些用例慢2倍。考虑到下面的其他优点,这是非常了不起的。

相似:强类型数据

就像Serde一样,我们提供了一个用于Serialize和Deserialize特质的derive宏。您可以在自己的数据结构上使用这些特质,并使用json::to_string将任何Serialize类型转换为JSON,并使用json::from_str将JSON解析为任何Deserialize类型。与serde_json一样,有一个Value枚举用于嵌入无类型组件。

不同:最小设计

这个库没有像Serde那样处理那么广泛的使用案例。功能请求基本上都会被拒绝。如果您的用例尚未涵盖,请使用Serde。

与serde + serde_derive + serde_json相比,实现代码减少了12倍,甚至比不提供derive宏且不能操作强类型数据的jsoncrate的代码还要少。

不同:无泛型化

没有非平凡的泛型方法。所有序列化和反序列化都在特例对象上进行。因此,针对不同的泛型参数,不会编译出更多的代码。相比之下,serde_json需要为每个要序列化或反序列化的数据结构生成相当数量的泛型代码。

没有泛型化,派生的实现编译速度极快,在可执行文件中占用的空间非常小。

不同:无递归

Serde 依赖于递归进行序列化和反序列化。您数据中的每一层嵌套都意味着更多的栈使用,最终可能导致栈溢出。一些格式设置嵌套深度的上限,以防止栈溢出,并拒绝反序列化深度嵌套的数据。

在 miniserde 中,序列化和反序列化都不涉及递归。您可以安全地处理任意嵌套的数据,而不用担心栈溢出。甚至我们 json Value 类型的 Drop 实现也不是递归的,因此您可以安全地任意嵌套它们。

不同之处:没有反序列化错误消息

当反序列化失败时,错误类型是一个不包含任何信息的单元结构。这是一个合法的策略,而不仅仅是懒惰。如果您的用例不需要错误消息,那么您将节省编译时间和避免指令缓存被错误处理代码污染。如果您需要错误消息,那么在出错时,您可以向 serde_json 提供相同的输入,以接收失败的行、列和有用的描述。这可以将错误处理逻辑从性能关键代码路径中的缓存中排除。

不同之处:不可靠的序列化

序列化始终成功。这意味着我们无法序列化 Serde 可以序列化的某些数据类型,例如 Mutex,它可能因中毒而无法序列化。此外,我们只序列化为 String,而不是像 i/o 流这样的可能不可靠的东西。

不同之处:仅 JSON

这个库中的相同方法可以应用于其他数据格式,但这不是通过该库公开的目标。

不同之处:仅结构体

miniserde 的 derive 宏将拒绝除带名称字段的括号结构体之外的所有内容。枚举和元组结构体不受支持。

不同之处:没有自定义

Serde 有很多旋钮,可以通过属性配置派生的序列化和反序列化逻辑。或者,您可以为完全可配置性手动编写任意复杂的 trait 实现。

Miniserde 只提供了一个属性,即 rename,并严重限制了在自定义 impl 中可能进行的即时操作。如果您需要这些中的任何一项,请使用 Serde -- 它是一个很好的库。


许可证

根据您的选择,许可在 Apache 许可证,版本 2.0MIT 许可证 下。
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,只要包含在本软件包中,都将根据上述方式双许可,而无需任何附加条款或条件。

依赖项

~1.5MB
~37K SLoC