Rust中结构体列表的BSON二进制序列化写入与反序列化问题
解决BSON结构体列表的序列化与文件存储问题
针对你使用bson crate 2.6.0将结构体列表转为BSON二进制写入文件并反序列化的需求,直接使用bson::to_vec和bson::from_slice即可完成,无需先转成Bson类型。以下是完整的修改代码及说明:
完整实现代码
use std::{fs::File, io::{Write, Read}}; use serde::{Serialize, Deserialize}; #[derive(Debug, Serialize, Deserialize)] struct Bison { name: String, age: u16, place: String, phone: u16, } pub fn check_bson() { // 生成测试数据 let mut bisons: Vec<Bison> = Vec::with_capacity(1000); for i in 1..1001 { bisons.push(Bison { name: format!("Name {}", i), age: i as u16, place: format!("Place {}", i), phone: i as u16, }); } // 序列化并写入文件 let mut file = File::create("data.bson").expect("Failed to create file"); let bson_bytes = bson::to_vec(&bisons).unwrap(); file.write_all(&bson_bytes).expect("Failed to write BSON data"); // 读取文件并反序列化回结构体列表 let mut read_file = File::open("data.bson").expect("Failed to open file"); let mut read_bytes = Vec::new(); read_file.read_to_end(&mut read_bytes).expect("Failed to read file"); let deserialized_bisons: Vec<Bison> = bson::from_slice(&read_bytes).unwrap(); // 验证结果(可选) println!("First bison: {:?}", deserialized_bisons.first()); }
关键说明
- 序列化到二进制:使用
bson::to_vec直接将Vec<Bison>转换为BSON格式的Vec<u8>,这是最直接的二进制序列化方式,跳过了中间的Bson枚举转换步骤。 - 写入文件:通过
Writetrait的write_all方法将字节数组完整写入文件,确保BSON数据的完整性。 - 反序列化回结构体:读取文件内容到字节数组后,使用
bson::from_slice直接将BSON字节转换回Vec<Bison>,完成反序列化流程。
注意事项
- 示例中使用
unwrap是为了简化代码,实际生产环境中建议使用Result类型处理序列化、文件操作等可能出现的错误,避免程序panic。 - 确保你的结构体实现了
Serialize和Deserializetrait(已通过#[derive]完成),这是serde和bson crate序列化的前提。
内容的提问来源于stack exchange,提问作者Ritik
相关产品推荐
相关产品推荐

