我正在使用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提供),我喜欢声明式样式.
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.请注意,这并未针对一次反序列化整个字节数组进行优化.