#serialization #miniserde #macro-derive #serde #deserialize #goal #variant

mini-internal

为 miniserde 提供派生宏。请使用 miniserde 包中的重新导出。

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日

#1878过程宏

Download history 1904/week @ 2024-04-30 2139/week @ 2024-05-07 2560/week @ 2024-05-14 2856/week @ 2024-05-21 1963/week @ 2024-05-28 1941/week @ 2024-06-04 2031/week @ 2024-06-11 6931/week @ 2024-06-18 6105/week @ 2024-06-25 4683/week @ 2024-07-02 5986/week @ 2024-07-09 3363/week @ 2024-07-16 4024/week @ 2024-07-23 2129/week @ 2024-07-30 1513/week @ 2024-08-06 1623/week @ 2024-08-13

每月10,042 次下载
62 个包中使用(通过 miniserde

MIT/Apache

17KB
361

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 一样,我们提供了用于 Serialize 和 Deserialize 特性的派生宏。您可以在自己的数据结构上派生这些特性,并使用 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需要为每个要序列化或反序列化的数据结构生成大量的泛型代码。

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

不同之处:没有递归

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

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

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

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

不同之处:不可失败的序列化

序列化总是成功的。这意味着我们无法序列化Serde可以序列化的某些数据类型,例如可能由于中毒而无法序列化的Mutex。我们还只序列化到String,而不是到可能失败的i/o流。

不同之处:仅JSON

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

不同之处:仅结构体和单元变体

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

不同之处:没有自定义

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

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


许可

根据您的选择,在Apache License, Version 2.0或MIT许可下许可。
除非您明确声明,否则根据Apache-2.0许可定义的您有意提交以包含在此crate中的任何贡献,都应按照上述方式双许可,没有任何额外的条款或条件。

依赖关系

~275–730KB
~17K SLoC