4个版本 (2个破坏性更新)
0.4.0 | 2024年5月11日 |
---|---|
0.3.0 | 2024年4月22日 |
0.2.2 | 2024年4月16日 |
0.2.1 | 2024年4月16日 |
在 解析器实现 中排名 1431
13KB
88 行
plod
plod,导出普通旧数据
Plod是一个易于使用的普通旧数据读取器和写入器。它将它们转换成和自然Rust类型。
普通旧数据通常是为C语言设计的,但在Rust中我们可以为相同的表示有更有意义的数据结构。例如,在C语言中,具有单独标签的联合是唯一表示我们称为枚举的东西的方法,这与Rust中的情况类似。
由于它使用标准的Read
和Write
特质,Plod可以用于读取和写入二进制文件以及网络协议,只要你有读取器或写入器。
以下是一个使用结构和枚举的示例
use plod::Plod;
#[derive(Plod)]
struct Value {
kind: u16,
value: u32,
}
#[derive(Plod)]
#[plod(tag_type(u8))]
enum ValueStore{
#[plod(tag=1)]
Series {
kind: u16,
#[plod(size_type(u16))]
values: Vec<u32> },
#[plod(tag=2,size_type(u16))]
Keys(Vec<Value>),
}
关于#[plod]
属性的更多文档,请参阅Plod
为什么使用plod?
Plod将序列化的普通旧数据转换成可立即使用的Rust数据结构。它使用属性来实现这一点。这意味着枚举或vec可以很容易地从二进制文件中读取。
其他原因
- Plod基于泛型
Read
和Write
特质。 - Plod了解序列化过程中的字节序,它会为您重新排序字节。
- Plod在读取和写入时不会使用unsafe或transmute
- Plod不需要您与
#[repr()]
属性进行交互
Plod适用于普通旧数据,这意味着它非常适合已知、现有的二进制格式。但是
-
如果您想找到一种方法来序列化自己的数据并在以后能够读取它,您应该选择serde,它可以将任何数据序列化为更多可自描述的格式。
-
如果您的文件格式不是二进制,并且不易于serde支持,您可以看看nom来解析它。
-
如果您的数据只包含基本类型,并且您想要的只是速度,您可以考虑plain、pod和nue。
特殊情况
Plod使用与C相同的明显表示法来表示结构体。然而,某些数据结构并不那么明显。
- enum使用特定的标签在开头表示,每个变体都可以有自己的大小
- Vec使用它们的大小在开头表示(可以是字节或项目计数)
- Option不存储,它们被读取为
None
,其想法是您可以读取一个结构体,然后通过用任何东西替换Options来向其添加更多高级信息。
记录端序及其继承
如何调用Plod特质的函数
示例,教程,首次使用
许可:MIT
依赖关系
~255-700KB
~17K SLoC