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编码

Download history 140/week @ 2024-03-11 43/week @ 2024-03-18 56/week @ 2024-03-25 92/week @ 2024-04-01 32/week @ 2024-04-08 44/week @ 2024-04-15 47/week @ 2024-04-22 49/week @ 2024-04-29 54/week @ 2024-05-06 42/week @ 2024-05-13 38/week @ 2024-05-20 41/week @ 2024-05-27 29/week @ 2024-06-03 41/week @ 2024-06-10 32/week @ 2024-06-17 44/week @ 2024-06-24

每月146次下载
用于 15 个crate(3个直接使用)

MIT/Apache

260KB
7K SLoC

serde-intermediate

serde-intermediate

Rust的Serde序列化的中间表示


目录

  1. 目标
  2. 安装
  3. 示例

目标

这个crate是为了解决以下特定问题而制作的

  • 提供无类型的(显然是“胖”)运行时值表示,用于交换数据,可按需反序列化为有类型的数据,对于在目标平台上有序列化标记特征对象不工作的情况。

    示例:存储在解释语言运行时值中的数据。

  • 支持比精确数据转换更多的解释数据转换(如果它像鸭子,就把它当作鸭子对待),这是默认行为,可选地强制读取存储在值中的精确布局。

    示例:不同数据格式之间更宽容的转换。

  • 支持版本控制(允许产生两个版本的数据之间的差异,稍后可以按需修补)。

    示例:游戏资产内容差异用于DLC或任何剧集内容使用;编辑UI只发送更改到游戏运行时以修补实际改变的世界(而不是发送整个序列化对象状态)。

  • 支持标记中间数据。

    示例:游戏资产存储在运行时决定的数据类型(相关标记给出其布局表示的提示)。


安装

  1. 核心crate,包含最重要的IntermediateReflectIntermediate类型

    [dependencies]
    serde-intermediate = "*"
    

    如果您喜欢不带ReflectIntermediate derive宏进行编译

    [dependencies]
    serde-intermediate = { version = "*", default-features = false }
    
  2. 添加对标记中间值的支持的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);

更复杂的问题和解决方案

  1. 版本控制(差异/修补) (test_versioning)
  2. 数据布局之间的转换 (test_transform)
  3. 数据加载控制(DLC)/ 剧集内容 (test_dlcs)
  4. 游戏与编辑器之间的数据变更通信 (test_editor_communication)

许可证:MIT OR Apache-2.0

依赖项

~5MB
~93K SLoC