128 lines
3.3 KiB
Rust
128 lines
3.3 KiB
Rust
#![cfg(all(feature = "serde", feature = "alloc", feature = "derive"))]
|
|
|
|
extern crate alloc;
|
|
|
|
use alloc::string::String;
|
|
use bincode::config::Configuration;
|
|
use serde_derive::{Deserialize, Serialize};
|
|
|
|
#[derive(Serialize, Deserialize, bincode::Encode, bincode::Decode)]
|
|
#[serde(crate = "serde_incl")]
|
|
pub struct SerdeRoundtrip {
|
|
pub a: u32,
|
|
#[serde(skip)]
|
|
pub b: u32,
|
|
}
|
|
|
|
#[test]
|
|
fn test_serde_round_trip() {
|
|
// validate serde attribute working
|
|
let json = serde_json::to_string(&SerdeRoundtrip { a: 5, b: 5 }).unwrap();
|
|
assert_eq!("{\"a\":5}", json);
|
|
|
|
let result: SerdeRoundtrip = serde_json::from_str(&json).unwrap();
|
|
assert_eq!(result.a, 5);
|
|
assert_eq!(result.b, 0);
|
|
|
|
// validate bincode working
|
|
let bytes =
|
|
bincode::encode_to_vec(SerdeRoundtrip { a: 15, b: 15 }, Configuration::standard()).unwrap();
|
|
assert_eq!(bytes, &[15, 15]);
|
|
let result: SerdeRoundtrip =
|
|
bincode::decode_from_slice(&bytes, Configuration::standard()).unwrap();
|
|
assert_eq!(result.a, 15);
|
|
assert_eq!(result.b, 15);
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
|
#[serde(crate = "serde_incl")]
|
|
pub struct SerdeWithBorrowedData<'a> {
|
|
pub a: u32,
|
|
#[serde(skip)]
|
|
pub b: u32,
|
|
pub str: &'a str,
|
|
}
|
|
|
|
#[test]
|
|
fn test_serialize_deserialize_borrowed_data() {
|
|
let input = SerdeWithBorrowedData {
|
|
a: 5,
|
|
b: 5,
|
|
str: "Hello world",
|
|
};
|
|
|
|
#[rustfmt::skip]
|
|
let expected = &[
|
|
5, // a
|
|
// b is skipped
|
|
11, // str length
|
|
b'H', b'e', b'l', b'l', b'o', b' ', b'w', b'o', b'r', b'l', b'd' // str
|
|
];
|
|
|
|
let mut result = [0u8; 20];
|
|
let len =
|
|
bincode::serde_encode_to_slice(&input, &mut result, Configuration::standard()).unwrap();
|
|
let result = &result[..len];
|
|
assert_eq!(result, expected);
|
|
|
|
let result = bincode::serde_encode_to_vec(&input, Configuration::standard()).unwrap();
|
|
|
|
assert_eq!(result, expected);
|
|
|
|
let output: SerdeWithBorrowedData =
|
|
bincode::serde_decode_borrowed_from_slice(&result, Configuration::standard()).unwrap();
|
|
assert_eq!(
|
|
SerdeWithBorrowedData {
|
|
b: 0, // remember: b is skipped
|
|
..input
|
|
},
|
|
output
|
|
);
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
|
#[serde(crate = "serde_incl")]
|
|
pub struct SerdeWithOwnedData {
|
|
pub a: u32,
|
|
#[serde(skip)]
|
|
pub b: u32,
|
|
pub str: String,
|
|
}
|
|
|
|
#[test]
|
|
fn test_serialize_deserialize_owned_data() {
|
|
let input = SerdeWithOwnedData {
|
|
a: 5,
|
|
b: 5,
|
|
str: String::from("Hello world"),
|
|
};
|
|
|
|
#[rustfmt::skip]
|
|
let expected = &[
|
|
5, // a
|
|
// b is skipped
|
|
11, // str length
|
|
b'H', b'e', b'l', b'l', b'o', b' ', b'w', b'o', b'r', b'l', b'd' // str
|
|
];
|
|
|
|
let mut result = [0u8; 20];
|
|
let len =
|
|
bincode::serde_encode_to_slice(&input, &mut result, Configuration::standard()).unwrap();
|
|
let result = &result[..len];
|
|
assert_eq!(result, expected);
|
|
|
|
let result = bincode::serde_encode_to_vec(&input, Configuration::standard()).unwrap();
|
|
|
|
assert_eq!(result, expected);
|
|
|
|
let output: SerdeWithOwnedData =
|
|
bincode::serde_decode_from_slice(&result, Configuration::standard()).unwrap();
|
|
assert_eq!(
|
|
SerdeWithOwnedData {
|
|
b: 0, // remember: b is skipped
|
|
..input
|
|
},
|
|
output
|
|
);
|
|
}
|