#version #serialization #struct #serde #attributes #byte #derive

serde-versions-derive

为通过Serde序列化结构体时添加版本字节而设计的属性宏。同时允许在去除版本字节的情况下进行反序列化。

5个版本

0.0.5 2021年6月21日
0.0.4 2021年6月9日
0.0.3 2021年6月9日
0.0.2 2021年5月31日
0.0.1 2021年5月31日

#1967 in 过程宏

Apache-2.0

11KB
115

Serde Versions Derive

serde_versions_derive导出一个属性宏,为结构体添加版本支持。

在序列化命名字段结构体时,它会自动添加一个包含版本的新的字段。它还允许将带有版本的类型直接反序列化回不带版本的一个。

在内部,它通过创建一个新的结构体来实现,这个结构体包装了原始结构体并添加了一个版本字节字段。

这个新结构体使用#[serde(flatten)]来按预期进行序列化。原始结构体使用#[serde(to, from)]在序列化时添加版本字段,在反序列化时移除它。

用法

#[version(3)]
#[derive(Clone, Serialize, Deserialize)]
struct S {
    i: i32,
}

这将生成以下内容

#[derive(Clone, Serialize, Deserialize)]
#[serde(into = "_Sv3", from = "_Sv3")]
struct S {
    i: i32,
}

#[derive(Clone, Serialize, Deserialize)]
struct _Sv3 {
    version: u8,
    #[serde(flatten)]
    inner: S
}

// plus implementations of To, From and to_versioned() for S

并且序列化为

{
	"version": 3,
	"i": 0
}

这支持带有类型参数的类型,但这些类型必须实现Clone trait约束。

例如:

# use serde::{Deserialize, Serialize};
# use serde_versions_derive::version;
#[version(3)]
#[derive(Clone, Serialize, Deserialize)]
struct S<T: Clone> {
    t: T,
} 

依赖项

~1.5MB
~36K SLoC