如何使用serde和bincode将填充超过32个字节的C结构映射?

Gab*_*iel 3 rust serde

我正在使用serde和bincode映射二进制结构.

#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate bincode;

#[derive(Serialize, Deserialize)]
struct Superblock {
    magic: [u8; 16],
    //reserved: [u8; 492],
    crc: u32,
}
Run Code Online (Sandbox Code Playgroud)

事情按预期工作,但我无法映射保留字段.显然,固定大小的数组仅定义为最大32个字节的大小.

如何注册我的自定义大小的数组,以便填充反序列化?

serde + bincode是正确的方法吗?我需要控制字节顺序(bincode提供),我喜欢声明式样式.

ken*_*ytm 6

serde_derive支持字段属性 #[serde(serialize_with="func")],#[serde(deserialize_with="func")]#[serde(with="module")]允许提供自定义序列化/反序列化例程:

#[derive(Serialize, Deserialize)]
struct Superblock {
    magic: [u8; 16],
    #[serde(with="array_492")]   // <--
    reserved: [u8; 492],
    crc: u32,
}

mod array_492 {
    use serde::*;

    pub fn serialize<S, T>(array: &[T; 492], ser: S) -> Result<S::Ok, S::Error> 
        where S: Serializer, T: Serialize
    {
        unimplemented!() // fill in yourself.
    }

    pub fn deserialize<'de, D, T>(de: D) -> Result<[T; 492], D::Error> { 
        where D: Deserializer<'de>, T: Deserialize<'de>
    {
        unimplemented!() // fill in yourself.
    }
}
Run Code Online (Sandbox Code Playgroud)

有关实际实现,请参阅此要点:https://gist.github.com/kennytm/21403667b5a17172cfcd11f9df9365e2.请注意,这并未针对一次反序列化整个字节数组进行优化.