Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)

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; 
  1. serde库:序列化(Serialize)和反序列化(Deserialize)特性
  2. bincode库:配置项和编解码特性
  3. DeserializeOwned:用于泛型反序列化

3、序列化函数

  • 将任意实现了SerializeEncode的类型转换为字节向量
rust 复制代码
pub fn my_serialize<T: Serialize + Encode>(data: &T) -> Vec<u8> {
    bincode::encode_to_vec(data, config::standard()).unwrap()
}
  1. config::standard() - 获取bincode标准配置
  2. encode_to_vec - 使用标准配置将数据编码为Vec<u8>
  3. unwrap() - 解包Result,若失败则panic

4、反序列化函数

  • 从字节切片还原数据(要求类型同时满足DeserializeOwnedDecode
rust 复制代码
pub fn my_deserialize<T: DeserializeOwned + Decode<()>>(bytes: &[u8]) -> T {
    bincode::decode_from_slice(bytes, config::standard()).map(|(res, _)| res).unwrap()
}
  1. decode_from_slice - 使用标准配置解码字节切片
  2. map(|(res, _)| res) - 提取元组中的第一个元素(解码结果)
  3. unwrap() - 解包Result

5、定义Person结构体并自动派生多个trait实现

rust 复制代码
#[derive(Deserialize, Serialize, Encode, Decode, Debug)]
struct Person {
    name: String,  // 可序列化的字符串字段
    age: u8,       // 可序列化的无符号8位整数字段
}

关键点说明:

  1. Serialize + Encode 组合确保类型可被bincodeserde同时序列化
  2. DeserializeOwned + Decode<()> 中的Decode<()>表示使用默认解码参数
  3. decode_from_slice返回(T, usize)元组,其中usize是消耗的字节数
  4. 结构体派生宏自动生成对应trait的实现代码

5、使用

rust 复制代码
let person = Person { name: "Alice".into(), age: 30 };
let bytes = my_serialize(&person);
let decoded: Person = my_deserialize(&bytes);
相关推荐
chinesegf8 分钟前
浏览器内存 (JavaScript运行时内存)存储的优劣分析
开发语言·javascript·ecmascript
yangchanghua11113 分钟前
Caused by: java.net.SocketTimeoutException: Read timed out;
java·开发语言·spring
无边风月-风之羽翼17 分钟前
【自记录】Ubuntu20.04下Python自编译
开发语言·python
菜鸟康44 分钟前
手写Muduo网络库核心代码2--Poller、EPollPoller详细讲解
开发语言·网络·php
秋风&萧瑟1 小时前
【QT】Qt QSS 中 background-image、image 和 border-image 的区别
开发语言·qt
学生董格1 小时前
[嵌入式embed][Qt]Qt5.12+Opencv4.x+Cmake4.x_测试Qt编译的opencv4.x的库
开发语言·qt
辗转反侧着疑惑1 小时前
MyBatis Plus 【详解】| 学习日志 | 第 17 天
java·开发语言·学习·mybatis·mybatis-plus
David爱编程1 小时前
对象锁 vs 类锁:Java 并发中的隐形对决
java·后端
Joy-鬼魅1 小时前
在 Qt 的 .pro 文件中设置警告级别和 C++11 标准
开发语言·c++·qt
脑子慢且灵1 小时前
【Web前端】JS+DOM来实现乌龟追兔子小游戏
java·开发语言·前端·js·dom