Rust数据结构的二进制序列化

5

目前在 Rust 中序列化为二进制的状态如何?

我有一些很大的(1-10MB)数据结构需要通过网络发送,并且不想将它们编码为 JSON 或十六进制(我找到的两个序列化器)。

我找到了 #[repr(packed)]。我应该使用它吗?还是有更可移植的解决方案?


1
使用 https://github.com/TyOverby/bincode 或 https://github.com/BurntSushi/rust-cbor 库中的任意一个都可以很容易地完成此操作 --- 两者都支持标准的 io::{Read,Write} 特性以及 rustc-serializeEncodableDecodable 特性。 - BurntSushi5
bincode正是我所寻找的。如果你将其作为答案,我会接受它。 - fadedbee
3
我不能这样做,因为那些了解更多的人显然认为这是一个糟糕的问题。(你问,“目前的状态是什么?”但我理解不了这如何是“基于观点”的。) - BurntSushi5
2
@BurntSushi5:1. 关于库的推荐属于离题;2. 在众多库中选择一个很容易变成意见之争。这并不是说这个问题“不好”,而是被认为不适合在StackOverflow上提问。 - Matthieu M.
1
本题不要求任何库的推荐。 - BurntSushi5
1个回答

7
#[repr(packed)] 只会让你的数据更小,但它不提供任何格式保证或序列化帮助。
以下是几种选择(按我的意见从最好到最差排列):
  1. 使用Rust的Cap'n proto实现
  2. 编写自己的Serializer和Deserializer。
    • 你可以完全控制格式
    • 对于每个单独的数据,都需要运行时开销
    • 你需要实现大量的东西
  3. 你可以将你的结构体转换为[u8]并发送它
    • 可能是最快的解决方案
    • 你需要确保程序在两端的编译器完全相同,否则格式不匹配。
    • 有人可能会向你发送坏数据。当你将其transmute回来时,你会得到缓冲区溢出等问题
    • 你的数据结构中的引用会导致野指针和未定义行为
      • 不要使用引用

transmute 不仅不能用于引用类型,还不能用于任何具有间接性的类型,例如 StringVec<_>。实际上,它只能用于由基本内置类型和这些类型的固定大小数组组成的结构体。 - Vladimir Matveev
@VladimirMatveev 那是否只是“复制”类型? - Levans
2
@Levans,不是只有具有引用的类型才能是Copy。我认为Copy + 'static更合适,但是据我所知,*const指针也是Copy - Vladimir Matveev
@VladimirMatveev 哦,没错,确实是这样。 - Levans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接