如何在没有给定长度的情况下反序列化Bincode字段

时间:2019-05-17 14:16:48

标签: rust deserialization serde

因此,我正在尝试反序列化包含二进制数据(bincode)的消息,该二进制文件未通过serde进行序列化,但是我正在尝试使用serde对其进行反序列化。但是,发送的数据可选地具有原始数据部分,该部分的末尾没有前缀,但可以保证是消息的其余部分。塞尔德总是期望长度。由于不兼容我自己设计/设计的系统,因此出于向后兼容性的考虑,我无法添加长度,因此此兼容性很重要。用Serde可以做到吗?我将如何去做?

我已经查看了serde和bincode的文档,但找不到任何帮助。

1 个答案:

答案 0 :(得分:2)

bincode::deserialize_from可让您在输入流中保留任何尾随数据。


use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Data {
    q: String,
    r: i32,

    #[serde(skip)]
    trailing: Vec<u8>,
}

fn main() -> bincode::Result<()> {
    let bytes = [7, 0, 0, 0, 0, 0, 0, 0, 115, 117, 99, 99, 101, 115, 115, 227, 7, 0, 0, 3, 2, 1];

    let mut cursor = &bytes[..];
    let mut data: Data = bincode::deserialize_from(&mut cursor)?;
    data.trailing = cursor.to_owned();

    println!("{:#?}", data);
    Ok(())
}