19个稳定版本
1.6.0 | 2023年6月12日 |
---|---|
1.5.5 | 2023年6月4日 |
1.5.3 | 2022年10月28日 |
1.5.2 | 2022年7月2日 |
1.4.2 | 2022年5月16日 |
#620 in 编码
80 个月下载量
15KB
260 行
serde-intermediate
serde-intermediate
Rust的Serde序列化的中间表示形式
目录
目标
此crate旨在解决这些特定问题
-
提供无类型的(显然是“胖”)运行时值表示,用作交换数据,可以在需要时解序列化为类型化数据,对于在目标平台上无法使用可序列化标记trait对象的数据。
示例:存储在解释语言运行时值中的数据。
-
支持比精确数据转换更多的解释数据转换(如果它听起来像鸭子,就把它当作鸭子来对待),这是默认行为,可选地强制读取值中存储的精确布局。
示例:不同数据格式之间更宽容的转换。
-
支持版本控制(允许在两个版本的数据之间产生差异,可以在以后按需修补)。
示例:游戏资源内容差异用于DLC或任何连续内容使用;编辑器UI仅发送对游戏运行时进行修补的实际更改(而不是发送整个序列化对象状态)。
-
支持标记中间数据。
示例:游戏资源存储在运行时决定的类型中的数据(关联的标记提供布局表示类型的提示)。
安装
-
核心crate,包含最重要的
Intermediate
和ReflectIntermediate
类型[dependencies] serde-intermediate = "*"
如果您希望在不使用
ReflectIntermediate
derive宏的情况下编译(derive
功能添加derive宏,默认启用)[dependencies] serde-intermediate = { version = "*", default-features = false }
-
crate添加了对标记中间值的支持(通过
TaggedIntermediate
类型将标记的Intermediate
嵌入到其他可序列化数据中)[dependencies] serde-tagged-intermediate = "*"
与核心crate相同,您可以排除
ReflectIntermediate
的编译[dependencies] serde-tagged-intermediate = { version = "*", default-features = false }
示例
序列化和反序列化
use std::time::SystemTime;
use serde::{Serialize, Deserialize};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
enum Login {
Email(String),
SocialMedia{
service: String,
token: String,
last_login: Option<SystemTime>,
}
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Person {
// (first name, last name)
name: (String, String),
age: usize,
login: Login,
}
let data = Person {
name: ("John".to_owned(), "Smith".to_owned()),
age: 40,
login: Login::Email("[email protected]".to_owned()),
};
let serialized = serde_intermediate::to_intermediate(&data).unwrap();
let deserialized = serde_intermediate::from_intermediate(&serialized).unwrap();
assert_eq!(data, deserialized);
更复杂的问题和解决方案
- 版本控制(差异/修补) (test_versioning)
- 数据布局之间的转换 (test_transform)
- DLC / 连续内容 (test_dlcs)
- 游戏和编辑器之间的数据更改通信 (test_editor_communication)
许可证:MIT OR Apache-2.0
依赖关系
~5.5MB
~100K SLoC