我正在将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)协议消息包含无效标记(零)。
通信在开始时是正确的,并且在通信中断的某个时间点会不同步(直到我读到另一个以前缀值开头的消息,也就是不完整的消息) 我的问题是反序列化声音,或者我完全没有商标,就像有些东西我根本不解释。