Crates.io | serde-versions-derive |
lib.rs | serde-versions-derive |
version | 0.0.5 |
source | src |
created_at | 2021-05-31 06:00:23.983699 |
updated_at | 2021-06-21 06:13:38.598912 |
description | An attribute macro for adding a version byte when serializing a struct via Serde. Also allows deseraializing while removing version byte. |
homepage | |
repository | |
max_upload_size | |
id | 404069 |
size | 11,815 |
serde_versions_derive
exports an attribute macro that adds versioning support for structs.
When serializing a named field struct it will automatically add a new field containing the version. It also allows deserializing the versioned type directly back to the unversioned one.
Under the hood this works by creating a new struct that wraps the original struct plus adds a version byte field.
Internally this new struct uses #[serde(flatten)]
to serialize as expected.
The original struct uses #[serde(to, from)]
to add the version field when serializing and remove it when deserializing.
#[version(3)]
#[derive(Clone, Serialize, Deserialize)]
struct S {
i: i32,
}
This produces the following
#[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
and will Serialize to:
{
"version": 3,
"i": 0
}
This supports types with type parameters however these must have a trait bound to implement Clone
e.g.:
# use serde::{Deserialize, Serialize};
# use serde_versions_derive::version;
#[version(3)]
#[derive(Clone, Serialize, Deserialize)]
struct S<T: Clone> {
t: T,
}