【问题标题】:Why does my protobuf-net stream not work?为什么我的 protobuf-net 流不起作用?
【发布时间】:2013-11-07 05:57:52
【问题描述】:

我有一个可以序列化和反序列化的对象,但是在反序列化时它会抛出一个错误:

Invalid field in source data: 0

我不知道为什么会这样

反序列化和接收代码:

public void listenUDP()
{
        EndPoint ep = (EndPoint)groupEP;
        //BinaryFormatter bf = new BinaryFormatter();
        recieving_socket.Bind(ep);
        while (true)
        {

            byte[] objData = new byte[65535];
            recieving_socket.ReceiveFrom(objData, ref ep);
            MemoryStream ms = new MemoryStream();
            ms.Write(objData, 0, objData.Length);
            ms.Seek(0, SeekOrigin.Begin);

            messageHandle(ProtoBuf.Serializer.Deserialize<SimplePacket>(ms));
            ms.Dispose();


        }
    }

序列化代码:

public void sendDataUDP(Vec2f[] data)
    {

            SimplePacket packet = new SimplePacket(DateTime.UtcNow, data);
            //IFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            System.Diagnostics.Stopwatch st = System.Diagnostics.Stopwatch.StartNew();
            //formatter.Serialize(stream, data);
            ProtoBuf.Serializer.Serialize<SimplePacket>(stream, packet);
            //Console.WriteLine(st.ElapsedTicks);
            stream.Close();
            st.Restart();
            sending_socket.SendTo(stream.ToArray(), sending_end_point);
            //Console.WriteLine(st.ElapsedTicks);
            st.Stop();

    }

【问题讨论】:

    标签: c# serialization protobuf-net


    【解决方案1】:

    protobuf 消息中的根对象,如 google 规范所定义,不包括消息的 end 的任何概念。这是有意的,因此连接等同于合并两个片段。因此,消费代码需要将自己限制为一条消息。这在所有 protobuf 实现之间都是相同的,并不特定于 protobuf-net。

    发生的情况是您的缓冲区当前过大,最后出现垃圾。 目前(因为您正在阅读一条消息)垃圾很可能全为零,而零不是字段的有效标记。但是,当重新使用缓冲区时,垃圾可能是……任何东西。

    在您的情况下,可能最简单的方法是使用 SerializeWithLengthPrefix / DeserializeWithLengthPrefix 方法,它们通过在消息开头添加有效负载长度来为您处理所有这些,并且只处理那么多数据。

    作为最后的想法:我不清楚您的代码是否会保证已阅读 整个 消息;单个接收可以(至少在 TCP 上)返回消息的一部分 - 或 2 个和一点消息等:TCP 是基于流的,而不是基于消息的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      相关资源
      最近更新 更多