首页 > 解决方案 > 什么是序列化函数的好签名?

问题描述

我正在尝试设计一个简单的序列化函数:

    pub fn serialize(buffer: &[u8]) -> std::result::Result<(), ()> {
        Ok(())
    }

上面不行,因为传递给它的缓冲区无法处理序列化的大小。

什么是序列化函数的好签名?我应该使用vec吗?

我正在尝试序列化 RTSP 消息。这就像 HTTP。文字不多,应该很简单。

标签: rust

解决方案


使用由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(())
}

这使得它在许多类型上都是通用的,可以用作“面向字节的接收器” ,如Files、TcpStreams 和 normal Vec<u8>s。

fn main() {
    let mut buffer = vec![];
    serialize(&mut buffer).unwrap();
    println!("{:?}", buffer);
}
[1, 2, 3, 4]

看它在操场上奔跑。


推荐阅读