sparse_hash_map/
serialize.rs1pub const SERIALIZATION_PROTOCOL_VERSION: u64 = 1;
15
16pub trait Serializer {
21 fn write_u64(&mut self, value: u64);
23 fn write_f32(&mut self, value: f32);
25 fn write_bytes(&mut self, bytes: &[u8]);
27}
28
29pub trait Deserializer {
33 fn read_u64(&mut self) -> u64;
35 fn read_f32(&mut self) -> f32;
37 fn read_bytes(&mut self, len: usize) -> Vec<u8>;
39
40 fn remaining(&self) -> Option<usize> {
47 None
48 }
49}
50
51pub trait Serialize {
53 fn serialize<S: Serializer>(&self, serializer: &mut S);
55}
56
57pub trait Deserialize: Sized {
59 fn deserialize<D: Deserializer>(deserializer: &mut D) -> Self;
66}
67
68macro_rules! impl_int_serialize {
69 ($($t:ty),*) => {$(
70 impl Serialize for $t {
71 fn serialize<S: Serializer>(&self, serializer: &mut S) {
72 serializer.write_u64(*self as u64);
73 }
74 }
75 impl Deserialize for $t {
76 fn deserialize<D: Deserializer>(deserializer: &mut D) -> Self {
77 deserializer.read_u64() as $t
78 }
79 }
80 )*};
81}
82
83impl_int_serialize!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize);
84
85impl Serialize for String {
86 fn serialize<S: Serializer>(&self, serializer: &mut S) {
87 serializer.write_u64(self.len() as u64);
88 serializer.write_bytes(self.as_bytes());
89 }
90}
91
92impl Deserialize for String {
93 fn deserialize<D: Deserializer>(deserializer: &mut D) -> Self {
94 let len = deserializer.read_u64() as usize;
95 if let Some(remaining) = deserializer.remaining() {
96 assert!(
97 len <= remaining,
98 "deserialized string length {len} exceeds the {remaining} bytes left in the input"
99 );
100 }
101 let bytes = deserializer.read_bytes(len);
102 String::from_utf8(bytes).expect("deserialized string is not valid utf-8")
103 }
104}
105
106impl<A: Serialize, B: Serialize> Serialize for (A, B) {
107 fn serialize<S: Serializer>(&self, serializer: &mut S) {
108 self.0.serialize(serializer);
109 self.1.serialize(serializer);
110 }
111}
112
113impl<A: Deserialize, B: Deserialize> Deserialize for (A, B) {
114 fn deserialize<D: Deserializer>(deserializer: &mut D) -> Self {
115 let a = A::deserialize(deserializer);
116 let b = B::deserialize(deserializer);
117 (a, b)
118 }
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq)]
123pub struct DeserializeError(pub &'static str);
124
125impl core::fmt::Display for DeserializeError {
126 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
127 f.write_str(self.0)
128 }
129}
130
131impl std::error::Error for DeserializeError {}