Roe*_*oey 6 c# c++ protocol-buffers protobuf-net
使用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
}
Run Code Online (Sandbox Code Playgroud)
如果也使用,这应该反序列化罚款DeserializeWithLengthPrefix.
重新提问(评论); SerializeWithLengthPrefix是一种protobuf-net特定的方法; 有可能是一些在C++版本,但它是非常简单的.从头开始实现这个的最简单方法是:
相反,显然:
它在protobuf-net中稍微复杂一点,因为它提供了一些选项(int应该如何编码,以及是否包装它以便整个事物仍然可以被视为100%值protobuf流- 特别是我怀疑我刚刚描述了行为,如果我要求SerializeWithLengthPrefix使用固定宽度编码和"字段0").