源数据中的字段无效:0 TCP_Message

时间:2015-02-17 18:02:48

标签: deserialization protobuf-net

我使用ProtoBuf-Net对TCP_Messages进行序列化和反序列化。

我已经尝试了我在这里找到的所有建议,所以我真的不知道错误在哪里。

序列化是服务器端,反序列化是在应用程序客户端进行的。

序列化代码:

        public void MssGetCardPersonalInfo(out RCPersonalInfoRecord ssPersonalInfoObject, out bool ssResult) {
        ssPersonalInfoObject = new RCPersonalInfoRecord(null);

        TCP_Message msg = new TCP_Message(MessageTypes.GetCardPersonalInfo);
        MemoryStream ms = new MemoryStream();
        ProtoBuf.Serializer.Serialize(ms, msg);
        _tcp_Client.Send(ms.ToArray());
        _waitToReadCard.Start();
        _stopWaitHandle.WaitOne();

反序列化:

       private void tpcServer_OnDataReceived(Object sender, byte[] data, TCPServer.StateObject clientState)
    {
        TCP_Message message = new TCP_Message();
        MemoryStream ms = new MemoryStream(data);

        try
        {

            //ms.ToArray();
            //ms.GetBuffer();
            //ms.Position = 0;
            ms.Seek(0, SeekOrigin.Begin);
            message = Serializer.Deserialize<TCP_Message>(ms);
        } catch (Exception ex)
            {
                EventLog.WriteEntry(_logSource, "Error deserializing: " + ex.Message, EventLogEntryType.Error, 103);
            }

正如你所看到的,我已尝试了一系列不同的方法,现在已经发表了评论。

我也尝试使用DeserializeWithLengthPrefix进行反序列化,但它也没有用。

我对此有点像菜鸟,所以如果你能帮助我,我会非常感激。

感谢&#39; S

1 个答案:

答案 0 :(得分:0)

首先要看的是:是您收到所发送数据的数据。直到你能回答&#34;是&#34;对此,所有其他问题都没有实际意义非常容易混淆网络代码并最终读取部分帧等。作为原始调试器测试:

Debug.WriteLine(Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length));

应该有效。如果两个base-64字符串不相同,那么您不能使用相同的数据。这可能是由于一系列原因,包括分组分组和组合。您需要记住,在流中,您发送的内容不是您获得的内容 - 至少,不是片段级别。你可能会发送&#34;数据的方式:

  • 一捆20个字节
  • 一捆10个字节

但在接收端,阅读完全合法:

  • 1个字节
  • 22个字节
  • 7个字节

所有TCP保证都是字节的顺序准确度。它说没什么关于他们在块上的细分。编写网络代码时,基本上有两种方法:

  • 有一个同步从流和本地缓冲区读取的线程(不能很好地扩展)
  • 异步代码(非常可扩展),但接受您将需要做很多事情&#34;我是否有完整的框架?如果不是,则附加到输入缓冲区;如果是这样,处理任何可用的帧数据(可能是多个),然后将任何不完整的数据混洗到缓冲区的开头#34;