【问题标题】:Serialization library optimized for space? [closed]针对空间优化的序列化库? [关闭]
【发布时间】:2014-02-19 23:34:31
【问题描述】:

是否有人知道在位级别有效的序列化库(沿协议缓冲区行)?我需要通过非常昂贵的链路(租用卫星)传输字节,我们需要尽可能地打包这些字节以降低成本。

例如,我们忽略对齐:如果一个值的范围是已知的(例如 0-128),我们将其打包成 7 位,并将剩余的位用于需要打包的下一个值。我们只使用我们需要的信息而不使用其他信息来打包 DateTime 值(例如删除年份和秒并将结果打包成 20 位)。将消息计数减少两个字节。

目前我们所有的消息都是手工制作的,这很容易出错。是否有类似于协议缓冲区的东西可以打包位域并在 C 和 C# 中生成代码?我知道 boost 的 dynamic_bitset,但这不是 C# 的消耗品(很容易)。在我继续按照this question 的答案编写库之前,我们可以考虑另一种方法吗?

【问题讨论】:

  • 您是否考虑过简单地压缩流?

标签: c# c serialization deserialization protocol-buffers


【解决方案1】:

在这种情况下,我建议您花时间找出您的数据集并制定自定义解决方案。我的推理如下。

如果您选择现成的东西,您将运行由其他人维护的良好、稳定的代码,并且您对代码重用感觉良好,并且会赶上最后期限。但是,如果此代码不适合您的特定需求(除非您真的很幸运),您将无法使用自定义解决方案尽可能多地节省自己。尤其是因为您似乎已经找到了一种避免发送冗余信息(即日期时间戳中的年份)的方法。

一旦您了解要发送的内容并删除接收者可以从您的消息中猜测或推断出的所有信息,您就可以应用压缩。我会推荐一种我已经研究了几个月的压缩方法,Arithmetic Coding。您可以通过Michael Dipperstein here 找到一个实现,但可能需要做一些工作才能将其插入您的解决方案。可以在here in this pdf找到一个非常好的算法描述。

我给你这个链接而不是一些 C# 代码的原因是我怀疑你提到了一个卫星链接,你正在处理一个嵌入式系统并且你可能正在用 C 或 C++ 编码。

请注意,我对算术编码的建议意味着我建议您在这里做很多工作。

但是,我的假设是您确实需要提高效率。通过压缩,效率来自于了解您的数据集并为其定制算法。如果您对效率稍低的方法感到满意,那么还有更多通用算法......

【讨论】:

  • 感谢您的精彩回答,很抱歉这个问题被审核为“暂停”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2023-03-11
  • 2014-02-16
相关资源
最近更新 更多