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日 |
#260 在 编码
每月146次下载
用于 15 个crate(3个直接使用)
260KB
7K SLoC
serde-intermediate
serde-intermediate
Rust的Serde序列化的中间表示
目录
目标
这个crate是为了解决以下特定问题而制作的
-
提供无类型的(显然是“胖”)运行时值表示,用于交换数据,可按需反序列化为有类型的数据,对于在目标平台上有序列化标记特征对象不工作的情况。
示例:存储在解释语言运行时值中的数据。
-
支持比精确数据转换更多的解释数据转换(如果它像鸭子,就把它当作鸭子对待),这是默认行为,可选地强制读取存储在值中的精确布局。
示例:不同数据格式之间更宽容的转换。
-
支持版本控制(允许产生两个版本的数据之间的差异,稍后可以按需修补)。
示例:游戏资产内容差异用于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)
- 游戏与编辑器之间的数据变更通信 (test_editor_communication)
许可证:MIT OR Apache-2.0
依赖项
~5MB
~93K SLoC