#intermediate-representation #tagged #deserialize

serde-tagged-intermediate

为Serde序列化提供的标记中间表示形式

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

Download history 99/week @ 2024-03-10 3/week @ 2024-03-17 5/week @ 2024-03-31

80 个月下载量

MIT/Apache

15KB
260

serde-intermediate

serde-intermediate

Rust的Serde序列化的中间表示形式


目录

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

目标

此crate旨在解决这些特定问题

  • 提供无类型的(显然是“胖”)运行时值表示,用作交换数据,可以在需要时解序列化为类型化数据,对于在目标平台上无法使用可序列化标记trait对象的数据。

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

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

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

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

    示例:游戏资源内容差异用于DLC或任何连续内容使用;编辑器UI仅发送对游戏运行时进行修补的实际更改(而不是发送整个序列化对象状态)。

  • 支持标记中间数据。

    示例:游戏资源存储在运行时决定的类型中的数据(关联的标记提供布局表示类型的提示)。


安装

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

    [dependencies]
    serde-intermediate = "*"
    

    如果您希望在不使用ReflectIntermediate derive宏的情况下编译(derive功能添加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

依赖关系

~5.5MB
~100K SLoC