Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 谷歌协议缓冲区-固定大小的缓冲区?_C#_C++_Protocol Buffers_Protobuf Net - Fatal编程技术网

C# 谷歌协议缓冲区-固定大小的缓冲区?

C# 谷歌协议缓冲区-固定大小的缓冲区?,c#,c++,protocol-buffers,protobuf-net,C#,C++,Protocol Buffers,Protobuf Net,使用Google协议缓冲区,我可以为我编码的所有消息设置最大大小吗 如果我知道我的编码永远不会超过X字节,那么Google Protobuff总是会产生一个大小为Y的缓冲区,如果我给它一个较小的数据量,将其填充到Y的大小?协议缓冲区的有线格式不会让这变得微不足道;我不知道该怎么做,但有一种选择是使用自己的长度头将其序列化到缓冲区中,并根据需要添加额外的数据 您需要添加长度前缀,因为默认情况下不会添加长度前缀,否则它将在缓冲区末尾读取垃圾。即使是尾随0也不合法(它将查找字段号) 我不能评论C++或

使用Google协议缓冲区,我可以为我编码的所有消息设置最大大小吗


如果我知道我的编码永远不会超过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
}