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 在 过程宏 中
每月10,042 次下载
在 62 个包中使用(通过 miniserde)
17KB
361 行
Miniserde
一个数据结构序列化库的原型,具有与 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 宏且不能操作强类型数据的json
crate的代码量还要少。
不同之处:没有单态化
没有非平凡的泛型方法。所有序列化和反序列化都通过特例对象来实现。因此,不同泛型参数之间不会有代码被编译多次。相比之下,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