1 个不稳定版本
0.1.23 | 2022年2月28日 |
---|
#6 在 #miniserde 中
用于 2 个crate(通过 miniserde-miku)
18KB
383 行
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倍,甚至比不提供派生宏且无法操作强类型数据的json
crate的代码量还要少。
不同:无单态化
没有非平凡的泛型方法。所有序列化和反序列化都是在特对象的基础上进行的。因此,针对不同的泛型参数,代码不会编译超过一次。相比之下,serde_json 需要为每种要序列化或反序列化的数据结构生成相当数量的泛型代码。
没有单态化,派生的 impl 编译速度快,在可执行文件中占用的空间非常小。
不同之处:没有递归
Serde 在序列化和反序列化时都依赖于递归。你数据的嵌套层级越高,栈的使用就越多,最终可能会溢出栈。一些格式设置了一个嵌套深度的上限,以防止栈溢出,并拒绝反序列化深层嵌套的数据。
在 miniserde 中,序列化和反序列化都不涉及递归。您可以安全地处理任意嵌套的数据,而不会面临栈溢出的风险。甚至我们的 json Value
类型的 Drop impl 也不是递归的,所以您可以任意地嵌套它们。
不同之处:没有反序列化错误信息
当反序列化失败时,错误类型是一个不包含任何信息的单元结构。这是一种合法的策略,而不仅仅是懒惰。如果你的用例不需要错误信息,那就好,你可以在编译和使你的指令缓存被错误处理代码污染方面节省空间。如果你确实需要错误信息,那么在出错时,你可以将相同的输入传递给 serde_json,以接收行、列和失败的描述性信息。这保持了错误处理逻辑不在性能关键代码路径上的缓存中。
不同之处:不可变的序列化
序列化总是成功。这意味着我们无法序列化 Serde 可以序列化的某些数据类型,例如可能由于中毒而无法序列化的 Mutex
。此外,我们只序列化到 String
,而不是到像 i/o 流这样的可能失败的东西。
不同之处:仅 JSON
这个库中的相同方法可以用于其他数据格式,但这并不是通过这个库公开来启用它的目标。
不同之处:仅结构体和单元变体
miniserde derive 宏将拒绝除花括号结构体(具有命名字段)或具有 C 风格变体的枚举之外的所有内容。不支持元组结构体,也不支持具有其变体中的数据的枚举。
不同之处:没有自定义
Serde 通过属性提供了大量的旋钮来配置派生的序列化和反序列化逻辑。或者,为了达到终极的可配置性,您可以手动编写任意复杂的 trait 实现的复杂实现。
Miniserde 只提供了一个属性,即 rename
,并且严格限制了在自定义 impl 中可能的即时操作类型。如果你需要任何这些,请使用 Serde —— 它是一个非常好的库。
许可证
根据您的选择,在以下许可证下获得许可:Apache License, Version 2.0 或 MIT 许可证。除非您明确表示,否则,您提交给此 crate 的任何有意贡献,根据 Apache-2.0 许可证定义,将根据上述许可证进行双许可,而不附加任何其他条款或条件。
依赖关系
~1.5MB
~35K SLoC