我正在尝试使用一个拥有任何实现std::io::Write写入的所有权的板条箱,但我想获取它写入内存中的数据以进行进一步处理,而不是直接将其写入磁盘。如果相关的话,我尝试使用的板条箱是ciborium 。
我最接近成功的方法是传入 a&mut [u8]作为作者,就像这个一般问题的玩具演示一样:
use std::io::Write;
fn write_stuff<W: Write>(mut w: W) {
w.write_all(b"Hello\0Rust!").unwrap();
}
fn main() {
let mut v = [0u8; 20];
write_stuff(&mut v[..]);
dbg!(v);
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,因为我可以看到已读取的字节,但有一个相当痛苦的缺陷,即我无法判断实际写入切片的数据量。对于我的情况来说,这是一个严重的问题,因为被序列化的数据很可能包含0字节(以及任何其他值)。
我尝试过的任何跟踪写入字节数的方法(如Vec<u8>、Cursor等)都无法告诉我,调用者,写入了多少字节,因为我调用的函数拥有该值的所有权,所以任何事情之后,调用者违反了所有权规则。
目前,我能想到的最糟糕的选择,除了修改ciborium(或更激烈的选择,比如大量的指针破坏不安全代码)是创建一个管道,将写入器的一半传递给ciborium,然后从读者一半。这是……可怕的。
我是否错过了一些非常明显的东西,或者我在这里完全不走运?