C # Eine Struktur deserialisieren, nachdem sie über TCP empfangen wurde

Ich sende mein eigenes struct "packet" -Objekt über die TCP-Schnittstelle, die C # mit TCPListener und TCPClient bietet.

Das ist meine Struktur

[Serializable]
struct RemuseNetworkPacket
{
    public String ApplicationCode;
    public String ReceiverCode;
    public RemusePacketType Type;
    public uint ID;
    public uint cID;
    public String Name;
    public byte[] Data;
    public String Text;
    public System.Drawing.Point Coords;
    public String Timestamp;
    public String Time;
    public String SenderName;

    public byte[] Serialize()
    {
        var buffer = new byte[Marshal.SizeOf(typeof(RemuseNetworkPacket))];
        var gch = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        var pBuffer = gch.AddrOfPinnedObject();
        Marshal.StructureToPtr(this, pBuffer, false);
        gch.Free();
        return buffer;
    }

    public void Deserialize(byte[] data)
    {
        var gch = GCHandle.Alloc(data, GCHandleType.Pinned);
        this = (RemuseNetworkPacket)Marshal.PtrToStructure(gch.AddrOfPinnedObject(), typeof(RemuseNetworkPacket));
        gch.Free();
    }
}

Ich verwende die Serialisierungsmethoden in der Struktur, um die Daten vor und nach dem Senden vorzubereiten und abzurufen.

Um den Empfänger über die Größe der eingehenden Daten zu informieren, füge ich den zu sendenden Bytes einige Header-Daten im Format @ hinz l = 212; ... was bedeutet Länge = 212; und die ... ist der Rest des Pakets.

m empfangenden Ende suche ich danach, bis ich das gesamte l = xxxx finde; dann erstelle ich ein neues Byte-Array ohne den Header und versuche dann, die Daten zu deserialisieren. Das für die Deserialisierung zu verwendende Paketbyte lautet: tcp stream's buffer.Length - foundHeaderSize (l = xxxx;)

Wenn ich Client und Server auf demselben Computer ausführe, funktioniert dies ohne Fehler. Wenn Client und Server jedoch auf unterschiedlichen Computern ausgeführt werden, treten Ausnahmen auf und der Vorgang stürzt ab.

Die Ausnahme tritt auf, wenn das Paket deserialisiert wird und sagt:

* System.Runtime.InteropServices.SafeArrayTypeMismatchException Es ist ein Konflikt zwischen dem Laufzeittyp des Arrays und dem in den Metadaten unter System.Runtime.InteropServices.PtrToStructureHelper @ aufgezeichneten SB-Typ aufgetrete

Stacktrace: System.Runtime.InteropServices.PtrToStructureHelper (IntPtr ptr, Objektstruktur, Boolean allowValueClasses) bei System.Runtime.InteropServices.PtrToStructure (IntPtr ptr, Typ structureType .. *

Ich bitte um Hilfe, um die Ursache des Problems zu ermitteln. Kann ich das nicht mit Objekten machen, die über das Netzwerk kamen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage