You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让消耗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::Write trait的合法实现者,完全满足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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:32:57