C # desserializando uma estrutura depois de recebê-la através do TCP
Estou enviando meu próprio objeto struct "pacote" através da interface TCP que o C # oferece com TCPListener e TCPClient.
Esta é minha estrutura
[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();
}
}
Estou usando os métodos de serialização dentro da estrutura para preparar e recuperar os dados antes e depois do envio.
Para que o destinatário saiba o tamanho dos dados recebidos, adiciono alguns dados de cabeçalho aos bytes enviados, no formato del = 212; ... o que significa comprimento = 212; e a... é o resto do pacote.
No lado receptor, procuro isso até encontrar l = xxxx inteiro; então eu faço uma nova matriz de bytes sem o cabeçalho e tento desserializar os dados. O byte de pacote a ser usado para desserialização é: tcp stream'sbuffer.Length - foundHeaderSize (l = xxxx;)
Se eu executar o cliente e o servidor na mesma máquina, ele funcionará sem erros; no entanto, se eu tiver o cliente e o servidor em máquinas separadas, recebo exceções e ele trava.
A exceção ocorre quando o pacote está sendo desserializado, dizendo:
* System.Runtime.InteropServices.SafeArrayTypeMismatchException Ocorreu uma incompatibilidade entre o tipo de tempo de execução da matriz e o tipo sb registrado nos metadados em System.Runtime.InteropServices.PtrToStructureHelper
Stacktrace: System.Runtime.InteropServices.PtrToStructureHelper (IntPtr ptr, Estrutura de objetos, Boolean allowValueClasses) em System.Runtime.InteropServices.PtrToStructure (IntPtr ptr, Type structureType .. *
Estou pedindo ajuda para identificar a causa do problema. Não posso fazer isso com objetos que vieram pela rede?