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

no-std miniserde

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

40 个版本

0.1.39 2024年4月8日
0.1.38 2024年2月26日
0.1.36 2024年1月10日
0.1.34 2023年8月17日
0.1.9 2018年10月17日

#1269编码

Download history 2314/week @ 2024-04-24 1938/week @ 2024-05-01 2245/week @ 2024-05-08 2518/week @ 2024-05-15 2781/week @ 2024-05-22 1874/week @ 2024-05-29 1973/week @ 2024-06-05 2133/week @ 2024-06-12 8131/week @ 2024-06-19 5403/week @ 2024-06-26 4317/week @ 2024-07-03 5677/week @ 2024-07-10 3858/week @ 2024-07-17 3541/week @ 2024-07-24 2088/week @ 2024-07-31 1505/week @ 2024-08-07

11,306 每月下载量
62 crate 中使用(直接使用 36 个)

MIT/Apache

105KB
2.5K SLoC

Miniserde

github crates.io docs.rs build status

一个数据结构序列化库的原型,与 Serde 有多个对立的设计目标。

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

[dependencies]
miniserde = "0.1"

版本要求:rustc 1.56+

示例

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 一样,我们提供了一个 derive 宏来为 Serialize 和 Deserialize 特性。您可以在自己的数据结构上推导这些特性,并使用 json::to_string 将任何 Serialize 类型转换为 JSON,使用 json::from_str 将 JSON 解析为任何 Deserialize 类型。像 serde_json 一样,有一个 Value 枚举用于嵌入无类型组件。

不同:最小化设计

这个库没有像 Serde 那样解决那么广泛的使用场景。功能请求几乎肯定会遭到拒绝。如果您的情况尚未被涵盖,请使用 Serde。

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

不同:无单例化

没有非平凡的泛型方法。所有序列化和反序列化都是在特例对象的基础上进行的。因此,不会针对不同的泛型参数编译超过一次的代码。相比之下,serde_json 需要对每个序列化或反序列化的数据结构的选择打印出相当数量的泛型代码。

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

不同点:没有递归

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

在miniserde中,序列化和反序列化都不涉及递归。您可以在不暴露于栈溢出的风险下安全地处理任意嵌套的数据。即使是我们的json Value类型的Drop实现也不是递归的,因此您可以任意嵌套它们。

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

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

不同点:不可变的序列化

序列化总是成功的。这意味着我们无法序列化Serde可以序列化的某些数据类型,例如Mutex,它可能因中毒而无法序列化。我们还只序列化为String,而不是像I/O流这样的可能失败的东西。

不同点:仅限JSON

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

不同点:仅限结构和单元变体

miniserde的派生宏将拒绝除花括号结构(具有命名字段)或具有C样式变体的枚举之外的其他任何内容。不支持元组结构,也不支持变体内具有数据的枚举。

不同点:无自定义

Serde提供了大量的旋钮,可以通过属性来配置派生的序列化和反序列化逻辑。或者,对于终极的可配置性级别,您可以手动编写任意复杂的实现其特质的代码。

Miniserde提供了一个属性,即rename,并且严重限制了自定义实现中可能进行的即时操作的类型。如果您需要任何这些功能,请使用Serde——它是一个很棒的库。


许可证

根据您的选择,许可协议为Apache License, Version 2.0MIT许可证
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交给此软件包的任何贡献,都应按照上述方式双重许可,而无需任何额外的条款或条件。

依赖关系

~300–780KB
~18K SLoC