如何让消耗std::io::Write的函数写入内存并获取写入字节数?
解决方法
最简洁的方案是直接传递**&mut Vec<u8>**作为写入目标,完全不需要管道或复杂包装:
代码示例
use ciborium::ser::into_writer; use std::io::Write; fn main() -> Result<(), Box<dyn std::error::Error>> { // 待序列化的数据 let sample_data = "Hello, ciborium!"; // 初始化空Vec作为内存缓冲区 let mut buf = Vec::new(); // 传入&mut Vec<u8>作为写入器,所有权不会被取走 into_writer(&sample_data, &mut buf)?; // 直接获取写入的字节数和数据 println!("实际写入 {} 字节", buf.len()); println!("序列化后的数据: {:?}", buf); Ok(()) }
为什么这能解决问题
&mut Vec<u8>是std::io::Writetrait的合法实现者,完全满足ciborium序列化函数的参数要求。- 传递可变引用不会转移
Vec的所有权,调用序列化函数后,你依然拥有对buf的完全控制权,可以随时读取长度、访问数据或继续写入。 Vec<u8>会自动扩容适配序列化数据的大小,buf.len()直接就是实际写入的字节数,完全规避了固定切片无法跟踪写入量的问题。
备选方案:自定义写入包装器(如需额外统计)
如果需要对写入操作做额外跟踪(比如记录写入次数),可以写一个极简的包装器类型,实现Write并提供取出内部数据的方法:
use std::io::{self, Write}; struct TrackedWriter { buf: Vec<u8>, write_count: usize, } impl TrackedWriter { fn new() -> Self { TrackedWriter { buf: Vec::new(), write_count: 0 } } fn into_inner(self) -> (Vec<u8>, usize) { (self.buf, self.write_count) } } impl Write for TrackedWriter { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { self.write_count += 1; self.buf.write(buf) } fn flush(&mut self) -> io::Result<()> { self.buf.flush() } }
总结:传递&mut Vec<u8>是最直接、高效的解决方案,完全覆盖你的需求,不需要用到管道这类复杂手段。
内容的提问来源于stack exchange,提问作者womble
相关产品推荐
相关产品推荐

