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);