如何使用bincode序列化没有长度的切片?

时间:2016-07-17 18:30:37

标签: serialization rust

我正在使用bincode crate将结构写入文件。该结构包含一个固定大小的切片。如何在没有切片长度的情况下强制bincode仅写入切片的内容?

#![allow(unstable)]
#![feature(custom_derive, plugin)]
#![plugin(serde_macros)]

extern crate serde;
extern crate bincode;

use std::fs::File;
use bincode::serde::serialize_into;
use bincode::SizeLimit;

#[derive(Serialize)]
struct Foo([u8; 16]);

fn main() {
    let data = Foo([0; 16]);
    let mut writer = File::create("test.bin").unwrap();
    serialize_into::<File, Foo>(&mut writer, &data, SizeLimit::Infinite).unwrap();
}

文件'test.bin'的大小为24字节而不是16。

我在bincode文档中看到related remark,但我不明白如何使用它。

1 个答案:

答案 0 :(得分:3)

  

具有固定大小的切片

[u8; 16] 切片。它是数组,可以强制切片。

无论如何......我不相信你可以。重要功能似乎是Serializer::serialize_fixed_size_array current serializer未实现。这意味着它默认行为与切片相同。

由于切片在编译时没有已知的长度,因此在序列化时必须写入它们的大小。

如果没有其他人可以提供更好的建议,那么可能维护者可以找到实现这一目标的方法。您可能需要礼貌地向维护者询问此功能或提议以帮助完成工作。

除此之外,听起来你正试图让bincode输出适合预先存在的格式。这真的没有意义; bincode是它自己的格式,已经做出了各种选择和权衡。

如果需要,您可以实现自己的编码器/解码器(使用serde或不使用serde)。如果您担心文件大小,也可以将bincode与压缩步骤结合起来。