繁体   English   中英

Google Protocol Buffers - 固定大小的缓冲区?

[英]Google Protocol Buffers - Fixed size buffer?

使用Google Protocol Buffers,我可以为我编码的所有邮件设置最大大小吗?

如果我知道我编码的内容永远不会大于X字节,那么Google Protobuffs总会产生一个大小为Y的缓冲区,如果我给它一个较小的数据量,请将它填充到Y大小?

协议缓冲区的有线格式不会使这个变得微不足道; 我不知道有什么要做的,但有一个选择是将它序列化到一个带有你自己的长度标题的缓冲区,并根据需要使用额外的数据填充。

您需要添加一个长度前缀,因为默认情况下不添加,否则它将在缓冲区末尾读取垃圾。 即使尾随0也不合法(它会寻找一个字段编号)。

我无法对C ++或Jon的C#版本发表评论,但对于我的 C#版本(protobuf-net),您应该可以执行类似(未经测试)的操作:

using(var  ms = new MemoryStream(fixedLength)) {
     ms.SetLength(fixedLength);
     Serializer.SerializeWithLengthPrefix(ms, obj);
     if(ms.Length > fixedLength) { /* boom */ }
     byte[] arr = ms.ToArray(); // use this
}

如果还使用DeserializeWithLengthPrefix这应该反序列化罚款。


重新提问(评论); SerializeWithLengthPrefix是一种protobuf-net特定方法; 在C ++版本中可能有一些东西,但它非常简单。 从头开始实现这个的最简单方法是:

  • 假设我们将留下一个固定长度(4字节)的标头来指示我们有多少实际数据
  • 跳过4个字节(或写00-00-00-00)
  • 现在序列化到缓冲区的其余部分
  • 找到你刚写的字节数
  • 在缓冲区的开头写回该值

相反,显然:

  • 读取4个字节并解释为int
  • 将数据反序列化

正是在protobuf网一点点更复杂,因为它提供了几个选项(整型应该如何编码,是否要包装这让整个事情仍然可以作为一个100%的值protobuf的流处理- 特别是我怀疑我刚刚描述了行为,如果我要求SerializeWithLengthPrefix使用固定宽度编码和“字段0”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM