C # десериализация структуры после получения ее через TCP
Я посылаю свой собственный объект struct "package" через интерфейс TCP, который C # предлагает с TCPListener и TCPClient.
Это моя структура
[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();
}
}
Я использую методы сериализации в структуре для подготовки и получения данных до и после отправки.
Чтобы сообщить получателю размер входящих данных, я добавляю некоторые данные заголовка к отправляемым байтам в формател = 212; ... что означает длину = 212; и... это остальная часть пакета.
На приемном конце я ищу это, пока не найду весь l = xxxx; Затем я создаю новый байтовый массив без заголовка, затем пытаюсь десериализовать данные. Байт пакета для десериализации: tcp stream'sbuffer.Length - foundHeaderSize (Л = хххх;)
Если я запускаю клиент и сервер на одном компьютере, он работает без ошибок, однако, если у меня клиент и сервер на разных компьютерах, я получаю исключения и происходит сбой.
Исключение имеет место при десериализации пакета, говоря:
* System.Runtime.InteropServices.SafeArrayTypeMismatchException Произошло несоответствие между типом времени выполнения массива и типом sb, записанным в метаданных в System.Runtime.InteropServices.PtrToStructureHelper
Stacktrace: System.Runtime.InteropServices.PtrToStructureHelper (IntPtr ptr, Структура объекта, Логическое значение allowValueClasses) в System.Runtime.InteropServices.PtrToStructure (IntPtr ptr, Тип StructureType .. *
Я прошу помощи, чтобы определить причину проблемы. Могу ли я так не делать с объектами, которые пришли по сети?