13个稳定版本
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日 |
在#intermediate中排名第22
每月下载量209次
在2个crate中使用(通过serde-intermediate)
40KB
749 行
serde-intermediate
serde-intermediate
Rust的Serde序列化的中间表示
目录
目标
此crate是为了解决这些特定问题而制作的
-
提供无类型(显然是“胖”)运行时值表示,用作交换数据,在需要时可以反序列化为有类型的数据,对于在目标平台上无法使用可序列化标记 trait 对象的数据。
示例:存储在解释语言运行时值中的数据。
-
支持比精确数据转换更多的解释性数据转换(如果它像鸭子,就像鸭子一样对待它),这是默认行为,可选地强制读取存储在值中的精确布局。
示例:不相关数据格式之间更宽容的转换。
-
支持版本控制(允许在两个数据版本之间生成差异,这些差异可以稍后按需修补)。
示例:游戏资产内容差异用于DLC或任何连续内容使用;编辑器UI仅发送更改到游戏运行时以修补实际发生变化的世界(而不是发送整个序列化对象状态)。
-
支持标记中间数据。
示例:游戏资产存储在运行时决定的数据类型(关联的标记给出布局表示类型的提示)。
安装
-
核心crate,包含最重要的
Intermediate
和ReflectIntermediate
类型[dependencies] serde-intermediate = "*"
如果您更喜欢不使用
ReflectIntermediate
衍生宏编译(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)
- 游戏与编辑器之间的数据变更通信 (测试编辑器通信)
许可证:MIT OR Apache-2.0
依赖项
~1.5MB
~34K SLoC