谷歌从golang到c#​​的protobuf - 协议消息包含无效标记(零)

时间:2017-11-04 14:18:01

标签: c# go protocol-buffers

当我使用protobuf从c#向Golang发送一个字节数据包时,我没有问题。但是当我从Golang发送一个字节到c#get error。

我在c#中使用此代码来获取golang发送的protobuf:

 Stream stream = new MemoryStream(m);
        PRSData data;
        data = PRSData.Parser.ParseFrom(stream);
        print(data);

然后我在c#中出现了这个错误:

  

InvalidProtocolBufferException:协议消息包含无效   标签(零)。 Google.Protobuf.CodedInputStream.ReadTag()

c#生成的protobuf的结构是正确的,但golang的结构是不正确的

c#生成的protobuf结构是:

{ "action": "move", "id": "player_361", "room": "SyONuNo0W", "pos": { "x": 74.423, "y": -0.04, "z": 10.903 } }

golang生成的protobuf结构是:

action:"move" id:"player_361" room:"SyONuNo0W" pos:<x:74.423 y:-0.04 z:10.903 >

请帮助我在c#和Golang中使用protobuf并真正实现它们之间的转换。

1 个答案:

答案 0 :(得分:0)

从套接字读取到缓冲区时,您需要确保正确跟踪您拥有的数据。在您的示例(注释)中,这是size,您必须确保任何处理都限制在那么多字节。由于您使用的是MemoryStream,因此您会注意到有一个构造函数接受缓冲区以及偏移量(零)和计数(size)。

请注意,如果您在单个套接字上处理多个消息,则还需要处理&#34; framing&#34; - TCP不保证在发送数据的相同块中接收数据 - 只是相同顺序的相同字节。