5

シリアル化および逆シリアル化できるオブジェクトがありますが、逆シリアル化するとエラーがスローされます。

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();

    }
4

1 に答える 1

6

Google 仕様で定義されているように、protobuf メッセージのルート オブジェクトには、メッセージの終わりの概念は含まれていません。これは意図的なものであり、連結は 2 つのフラグメントのマージと同じです。したがって、消費するコードは単一のメッセージに制限する必要があります。これはすべての protobuf 実装で同一であり、protobuf-net に固有のものではありません。

何が起こっているかというと、バッファが現在大きすぎて、最後にゴミがあります。現在(1 つのメッセージを読んでいるため) ガベージはすべてゼロである可能性が高く、ゼロはフィールドの有効なマーカーではありません。ただし、バッファを再利用する場合、ガベージは...何でもかまいません。

あなたの場合、おそらくこれを行う最も簡単な方法はSerializeWithLengthPrefix/DeserializeWithLengthPrefixメソッドを使用することです。これは、メッセージの先頭にペイロードの長さを追加し、その量のデータのみを処理することで、これらすべてを処理します。

最後の考えとして、あなたのコードがメッセージ全体を読んだことを保証するかどうかは私には明らかではありません。1回の受信で(少なくともTCPでは)メッセージの一部、または2ビットのメッセージなどを返すことができます.TCPはストリームベースであり、メッセージベースではありません。

于 2013-10-28T12:53:22.123 に答える