1、Cargo.toml
配置
bash
[dependencies]
serde = { version = "1.0.219", features = ["derive"] }
bincode = "2.0.1"
2、引入库
rust
use serde::{Serialize, Deserialize};
use bincode::{config, Encode, Decode};
use serde::de::DeserializeOwned;
serde
库:序列化(Serialize
)和反序列化(Deserialize
)特性bincode
库:配置项和编解码特性DeserializeOwned
:用于泛型反序列化
3、序列化函数
- 将任意实现了
Serialize
和Encode
的类型转换为字节向量
rust
pub fn my_serialize<T: Serialize + Encode>(data: &T) -> Vec<u8> {
bincode::encode_to_vec(data, config::standard()).unwrap()
}
config::standard()
- 获取bincode
标准配置encode_to_vec
- 使用标准配置将数据编码为Vec<u8>
unwrap()
- 解包Result
,若失败则panic
4、反序列化函数
- 从字节切片还原数据(要求类型同时满足
DeserializeOwned
和Decode
)
rust
pub fn my_deserialize<T: DeserializeOwned + Decode<()>>(bytes: &[u8]) -> T {
bincode::decode_from_slice(bytes, config::standard()).map(|(res, _)| res).unwrap()
}
decode_from_slice
- 使用标准配置解码字节切片map(|(res, _)| res)
- 提取元组中的第一个元素(解码结果)unwrap()
- 解包Result
5、定义Person
结构体并自动派生多个trait
实现
rust
#[derive(Deserialize, Serialize, Encode, Decode, Debug)]
struct Person {
name: String, // 可序列化的字符串字段
age: u8, // 可序列化的无符号8位整数字段
}
关键点说明:
Serialize + Encode
组合确保类型可被bincode
和serde
同时序列化DeserializeOwned + Decode<()>
中的Decode<()>
表示使用默认解码参数decode_from_slice
返回(T, usize)
元组,其中usize
是消耗的字节数- 结构体派生宏自动生成对应
trait
的实现代码
5、使用
rust
let person = Person { name: "Alice".into(), age: 30 };
let bytes = my_serialize(&person);
let decoded: Person = my_deserialize(&bytes);