#intermediate #intermediate-representation #macro-derive #proc #proc-macro

serde-intermediate-derive

为Serde序列化的中间表示提供衍生进程宏

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

Download history 96/week @ 2024-04-01 38/week @ 2024-04-08 48/week @ 2024-04-15 50/week @ 2024-04-22 52/week @ 2024-04-29 50/week @ 2024-05-06 42/week @ 2024-05-13 40/week @ 2024-05-20 44/week @ 2024-05-27 33/week @ 2024-06-03 43/week @ 2024-06-10 31/week @ 2024-06-17 45/week @ 2024-06-24 37/week @ 2024-07-01 46/week @ 2024-07-08 80/week @ 2024-07-15

每月下载量209
2个crate中使用(通过serde-intermediate

MIT/Apache

40KB
749

serde-intermediate

serde-intermediate

Rust的Serde序列化的中间表示


目录

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

目标

此crate是为了解决这些特定问题而制作的

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

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

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

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

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

    示例:游戏资产内容差异用于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. 游戏与编辑器之间的数据变更通信 (测试编辑器通信)

许可证:MIT OR Apache-2.0

依赖项

~1.5MB
~34K SLoC