use alloc::vec::Vec;
use bincode_next::error::{DecodeError, EncodeError};
use serde::{de::DeserializeOwned, Serialize};
#[inline]
pub fn serialize<T: Serialize + ?Sized>(value: &T) -> Result<Vec<u8>, EncodeError> {
bincode_next::serde::encode_to_vec(value, bincode_next::config::legacy())
}
#[inline]
pub fn deserialize<T: DeserializeOwned>(bytes: &[u8]) -> Result<T, DecodeError> {
bincode_next::serde::decode_from_slice(bytes, bincode_next::config::legacy()).map(|(v, _)| v)
}
#[cfg(feature = "stream")]
#[inline]
pub fn serialize_into_vec<T: Serialize + ?Sized>(
out: &mut Vec<u8>,
value: &T,
) -> Result<(), EncodeError> {
let bytes = bincode_next::serde::encode_to_vec(value, bincode_next::config::legacy())?;
out.extend_from_slice(&bytes);
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use serde::Deserialize;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Sample {
a: u32,
b: alloc::string::String,
c: alloc::vec::Vec<u8>,
}
#[test]
fn legacy_config_matches_v1_default_bytes() {
let s = Sample {
a: 0x0102_0304,
b: alloc::string::String::from("hi"),
c: alloc::vec![0xAA, 0xBB],
};
let bytes = serialize(&s).unwrap();
let expected: &[u8] = &[
0x04, 0x03, 0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, b'h', b'i',
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0xBB,
];
assert_eq!(bytes.as_slice(), expected);
let round: Sample = deserialize(&bytes).unwrap();
assert_eq!(round, s);
}
}