Serialization 锈蚀数据结构的二进制序列化
在Rust中序列化为二进制的当前状态是什么 我有一些大型(1-10MB)数据结构要通过网络发送,不想将它们编码为JSON或hex(我发现的两个序列化程序) 我找到了Serialization 锈蚀数据结构的二进制序列化,serialization,binary,rust,Serialization,Binary,Rust,在Rust中序列化为二进制的当前状态是什么 我有一些大型(1-10MB)数据结构要通过网络发送,不想将它们编码为JSON或hex(我发现的两个序列化程序) 我找到了#[repr(packed)]。这是我应该使用的,还是有更便于携带的东西?#[repr(packed)]只会使您的数据变小。它不提供任何格式保证或序列化帮助 您在这里有几个选择(按我的意见从最佳到最差的顺序排列): 您可以使用Cap'n proto实现进行Rust 它不是真正的序列化,更多的是结构的强制格式,然后通过网络发送而不进
#[repr(packed)]
。这是我应该使用的,还是有更便于携带的东西?#[repr(packed)]
只会使您的数据变小。它不提供任何格式保证或序列化帮助
您在这里有几个选择(按我的意见从最佳到最差的顺序排列):
- 它不是真正的序列化,更多的是结构的强制格式,然后通过网络发送而不进行任何转换
- 快速
- 您可以完全控制格式
- 每个数据的运行时开销
- 你需要实现很多东西
将结构转换为[u8]
并发送该文件
- 可能是最快的解决方案
- 您需要确保两侧程序的编译器完全相同,否则格式不匹配
- 邪恶的人可能会向你发送坏数据。当你把它转换回来时,你会得到缓冲区溢出和其他东西
- 数据结构中的引用将导致通配符和未定义的行为
- 不要使用参考资料
这应该是很容易做到这一点,无论是使用标准的
io::{Read,Write}
traits,还是rustc serialize
的Encodable
和Decodable
traits。bincode正是我想要的。如果你回答这个问题,我会接受的。我不能,因为那些更了解的人显然认为这是一个糟糕的问题。(你问,“目前的状态是什么…?”这是如何“基于意见”的,远远超出了我有限的精神理解能力。)@BurntSushi5:1。图书馆的建议是离题的;2.在其他图书馆中挑选一个很容易演变成一场意见之争。这并不是问题“不好”,而是判断它不适合StackOverflow。问题的任何部分都不需要库推荐。transmute
不仅对引用有效,而且对任何间接类型都有效,如String
或Vec
。事实上,它只适用于由基本内置类型和此类类型的固定大小数组组成的结构。@Vladimitavevevevev这是Copy
types吗?@Levans,没有-带引用的类型也可以是Copy
。我想说,static更像它,但是*const
指针也是Copy
AFAIK.@VladimirMatveev哦,的确如此。