使用Google协议缓冲区,我可以为我编码的所有邮件设置最大大小吗?
如果我知道我编码的内容永远不会大于X字节,那么Google Protobuffs总会生成一个大小为Y的缓冲区,如果我给它一个较小的数据量,请将其填充到Y大小?
答案 0 :(得分:5)
协议缓冲区的有线格式不会使这个变得微不足道;我不是意识到要做的事情,但有一个选择是将它序列化到一个带有你自己的长度标题的缓冲区中,并根据需要填充额外的数据。 / p>
您需要添加一个长度前缀,因为默认情况下不添加,否则它将在缓冲区末尾读取垃圾。即使尾随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 ++版本中的东西,但它非常简单。从头开始实现此的最简单方法是:
在protobuf-net中它是一个 little 位更复杂,因为它提供了一些选项(int应该如何编码,以及是否要包装它以便整个事情仍然可以被视为100%价值的protobuf流 - 特别是我怀疑我刚刚描述了行为,如果我要求SerializeWithLengthPrefix
使用固定宽度编码和“字段0”)。