1 个稳定版本
1.0.0 | 2023年9月25日 |
---|
#93 在 #derive-debug
30KB
584 行
ESDE(序列化和反序列化库)
这个库的目的是将非递归数据结构轻松存储到文件中,并从中读取。这里的“简单”意味着格式是可由人类理解的,因此理论上也可以由其他语言/框架生成。
该包专注于以二进制形式存储数据,但也可以修改以存储其他格式。它还提供了 derive 宏(Deserialize
和 Serialize
),以推导出结构体和枚举的相应特征。
跨平台说明:没有特定的保证。最重要的是,切片/向量的长度以 usize
存储为 usize
,其长度可能因平台而异。
Item
项目是数据序列化的单位。这可以是任何东西。我猜在大多数情况下,数据结构会序列化为二进制数据以存储在文件中,然后使用 [u8
]。
反序列化
您有一个提供 Item
的对象,实现了 Sender
特征。这个特征为任何 std::io::Read
自动实现,"发送" [u8
]。
可以从给定 Item
的流中反序列化的对象实现了 Deserialize<Item>
特征。提供了一些原始类型的实现,大多数其他类型应该可以通过相应的直观命名的 derive 宏推导出来。
如果反序列化对象,则必须知道其类型。换句话说:必须在解析类型之前知道类型。库不提供存储的类型信息。
序列化
您有一个接受 Item
的对象,实现了 Receiver
特性。这个特性对于任何 std::io::Write
都会自动实现,接收 [u8
]s;
任何实现了 Serialize<Item>
特性的类型都可以使用任何 [Receiver<Type = Item>
] 进行序列化。提供了一些原始类型的实现。
示例
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct Struct {
another: AnotherStruct,
an_enum: Enum,
vector: Vec<u32>,
option: Option<i64>,
array: [String; 4],
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct AnotherStruct(u32, u32);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
enum Enum {
A,
B(f64),
C { x: AnotherStruct, y: u16 },
}
fn main() -> std::io::Result<()> {
const FILE: &str = "test.bin";
let example = Struct {
another: AnotherStruct(69, 420),
an_enum: Enum::B(69.420),
vector: vec![69, 420, 1337],
option: Some(-87),
array: [
String::from("one"),
String::from("two"),
String::from("three"),
String::from("four"),
],
};
{
let mut file = File::create(FILE)?;
file.auto_ser(example.clone())?;
// NOTE Receiver::auto could be used here if File didn't implement Read + Write
}
{
let mut file = File::open(FILE)?;
let person2: Struct = file.auto_de().map_err(Error::unwrap_sender)?;
// NOTE Sender::auto could be used here if File didn't implement Read + Write
println!("person1: {:#?}", example);
println!("person2: {:#?}", person2);
assert_eq!(example, person2);
println!("indeed, they're equal")
}
Ok(())
}
计划中的未来功能
- 在序列化(反序列化)时忽略字段的属性,它们必须实现
Default
- 处理泛型类型
依赖项
~255–700KB
~17K SLoC