rust - 什么是序列化函数的好签名?
问题描述
我正在尝试设计一个简单的序列化函数:
pub fn serialize(buffer: &[u8]) -> std::result::Result<(), ()> {
Ok(())
}
上面不行,因为传递给它的缓冲区无法处理序列化的大小。
什么是序列化函数的好签名?我应该使用vec吗?
我正在尝试序列化 RTSP 消息。这就像 HTTP。文字不多,应该很简单。
解决方案
使用由trait指定的writer 。std::io::Write
pub fn serialize<W: Write>(writer: &mut W) -> Result<()> {
writer.write_all(&[1, 2, 3, 4])?;
Ok(())
}
// or
pub fn serialize(writer: &mut dyn Write) -> Result<()> {
writer.write_all(&[1, 2, 3, 4])?;
Ok(())
}
这使得它在许多类型上都是通用的,可以用作“面向字节的接收器” ,如File
s、TcpStream
s 和 normal Vec<u8>
s。
fn main() {
let mut buffer = vec![];
serialize(&mut buffer).unwrap();
println!("{:?}", buffer);
}
[1, 2, 3, 4]
看它在操场上奔跑。