从Wire反序列化Protobuf C#

时间:2018-07-24 11:00:20

标签: c# protocol-buffers protobuf-csharp-port

我正在将protobuf谷歌实现用于c#。

到目前为止的故事..我在c ++中有一个服务器,在c#中有一个客户端,并通过带有TCP的protobuf消息进行了交谈。

在客户端,我通过提供的回调来检索从tcpClient.BeginReceive返回的缓冲区并将其追加(因此我猜想它已从netstream垃圾中清除了)。然后在辅助线程上,我尝试反序列化消息。

在服务器端,序列化代码为:

contains

在客户端上,我使用CodedInputStream读取每个块,读取第一个数字,并分派前缀+它包含的用于反序列化的味精

弄清楚长度:

google::protobuf::uint32 msgSize = msg->ByteSize();
int prefix_length = sizeof(msgSize);
int buffer_length = msgSize + prefix_length;

google::protobuf::uint8 buffer[buffer_length];
google::protobuf::io::ArrayoutputStream array_output(buffer, buffer_length, msgSize);
google::protobuf::io::CodedOutputStream coded_output(&array_output);

coded_output.WriteVarint32(msgSize);
msg->SerializeToCodedStream(&coded_output);

//Send to socket
mSendBuffer.Write(buffer, buffer_length);

反序列化:

using (var input = new CodedInputStream(chunk))
{
   int len = input.ReadInt32();
   int requiredLength = len + input.Position; //(we re sure each time the codedInput starts from the beginning)
   byte[] read = await AccumulateResources(requiredLength, chunk);
   byte[] msg = new byte[requiredLength];
   Buffer.BlockCopy(read, 0, msg , 0 , requiredLength);
   Dispatch(msg);
} 

我收到的错误消息是:

1)System.InvalidOperationExeption:导线类型无效

2)协议消息包含无效标记(零)。

通信在开始时是正确的,并且在通信中断的某个时间点会不同步(直到我读到另一个以前缀值开头的消息,也就是不完整的消息) 我的问题是反序列化声音,或者我完全没有商标,就像有些东西我根本不解释。

0 个答案:

没有答案