C# 谷歌协议缓冲区-固定大小的缓冲区?
使用Google协议缓冲区,我可以为我编码的所有消息设置最大大小吗C# 谷歌协议缓冲区-固定大小的缓冲区?,c#,c++,protocol-buffers,protobuf-net,C#,C++,Protocol Buffers,Protobuf Net,使用Google协议缓冲区,我可以为我编码的所有消息设置最大大小吗 如果我知道我的编码永远不会超过X字节,那么Google Protobuff总是会产生一个大小为Y的缓冲区,如果我给它一个较小的数据量,将其填充到Y的大小?协议缓冲区的有线格式不会让这变得微不足道;我不知道该怎么做,但有一种选择是使用自己的长度头将其序列化到缓冲区中,并根据需要添加额外的数据 您需要添加长度前缀,因为默认情况下不会添加长度前缀,否则它将在缓冲区末尾读取垃圾。即使是尾随0也不合法(它将查找字段号) 我不能评论C++或
如果我知道我的编码永远不会超过X字节,那么Google Protobuff总是会产生一个大小为Y的缓冲区,如果我给它一个较小的数据量,将其填充到Y的大小?协议缓冲区的有线格式不会让这变得微不足道;我不知道该怎么做,但有一种选择是使用自己的长度头将其序列化到缓冲区中,并根据需要添加额外的数据 您需要添加长度前缀,因为默认情况下不会添加长度前缀,否则它将在缓冲区末尾读取垃圾。即使是尾随0也不合法(它将查找字段号)
我不能评论C++或乔恩的C版本,但是对于我的C版本(原Buffnet),你应该能够做一些(未测试的):
如果还使用反序列化WithLengthPrefix
,则反序列化应该很好
重新审议问题(评论)
SerializeWithLengthPrefix
是一种协议特定于网络的方法;在C++版本中可能有一些东西,但它非常简单。从零开始实现这一点的最简单方法是:
- 假设我们将保留一个固定长度(4字节)的头,以指示我们有多少实际数据
- 跳过4个字节(或写入00-00-00-00)
- 现在序列化到缓冲区的其余部分
- 查找您刚才写入的字节数
- 将该值写回缓冲区的开头
- 读取4个字节并解释为int
- 反序列化数据
在protobuf net中,它稍微复杂一点,因为它提供了更多的选项(int应该如何编码,以及是否包装它,以便整个内容仍然可以被视为100%值protobuf流-特别是,如果我要求
SerializeWithLengthPrefix
使用固定宽度编码和“字段0”,我怀疑我刚刚描述了该行为)贾景晖,总是很有帮助。你能更详细地解释SerializeWithLengthPrefix到底做了什么吗?再次感谢!还有一件事,我是用C++版本的协议缓冲区反序列化……在C++版本里有没有长格式的反序列化??MarcGravell。你能扩展你的例子吗?请把循环显示给WRI。请告诉我200个obj。我不确定ms的位置是如何向前移动的。我非常想写固定长度的记录
using(var ms = new MemoryStream(fixedLength)) {
ms.SetLength(fixedLength);
Serializer.SerializeWithLengthPrefix(ms, obj);
if(ms.Length > fixedLength) { /* boom */ }
byte[] arr = ms.ToArray(); // use this
}