【问题标题】:How can I deserialize a bincode field without a given length如何反序列化没有给定长度的 bincode 字段
【发布时间】:2019-05-17 14:16:47
【问题描述】:

所以我试图反序列化由二进制数据(bincode)组成的消息,这个二进制不是由 serde 序列化的,但我正在尝试使用 serde 来反序列化它。但是,数据发送可选地有一个原始数据部分,其长度没有前缀,但保证是消息的其余部分。 Serde 总是期望一个长度。由于与不是由我制造/设计的系统的向后兼容性问题,我无法添加长度,这种兼容性很重要。使用 Serde 可以实现这一点吗?我将如何做到这一点?

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

【问题讨论】:

    标签: rust deserialization serde


    【解决方案1】:

    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(())
    }
    

    【讨论】:

    • 碰巧这也正是我所需要的!感谢您的回复和我的 +1 :D
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多