#serde #serialization #no-alloc #no-std

no-std serde_many

Multiple serialization/deserialization implementations for the same type

1 unstable release

0.1.0 Jan 3, 2025

#1236 in Encoding

Download history 124/week @ 2025-01-01 9/week @ 2025-01-08

133 downloads per month

MIT/Apache

11KB
83 lines

Serde Many

Serde Many enables multiple serialization/deserialization implementations for the same type. The design ensures seamless integration with the serde crate.

Example

use serde_many::{DeserializeMany, SerializeMany};

/// Marker for the default serde implementation.
struct Default;

/// Marker for a special serde implementation.
struct Special;

#[derive(SerializeMany, DeserializeMany)]
#[serde_many(default = "Default", special = "Special")] // Declaring the implementation markers.
struct Point {
    #[serde(special(rename = "x_value"))]
    x: i32,
    #[serde(special(rename = "y_value"))]
    y: i32,
}

#[test]
fn it_works() {
    let mut serialized = Vec::new();
    let mut serializer = serde_json::Serializer::pretty(&mut serialized);
    let val = Point { x: 0, y: 0 };

    SerializeMany::<Default>::serialize(&val, &mut serializer).unwrap();
    assert_eq!(
        String::from_utf8_lossy(&serialized),
        "{
  \"x\": 0,
  \"y\": 0
}"
    );

    serialized.clear();
    let mut serializer = serde_json::Serializer::pretty(&mut serialized);
    SerializeMany::<Special>::serialize(&val, &mut serializer).unwrap();
    assert_eq!(
        String::from_utf8_lossy(&serialized),
        "{
  \"x_value\": 0,
  \"y_value\": 0
}"
    )
}

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~100–345KB