为了账号安全,请及时绑定邮箱和手机立即绑定

C#通过TCP接收后反序列化结构

C#通过TCP接收后反序列化结构

FFIVE 2019-08-23 10:27:36
C#通过TCP接收后反序列化结构我通过TCP接口发送我自己的struct“packet”对象,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();     }}我在结构中使用序列化方法来准备和检索发送之前和之后的数据。为了让接收器知道输入数据的大小,我将一些头数据添加到正在发送的字节中,格式为l = 212; ...这意味着长度= 212; 而...是数据包的其余部分。在接收端,我搜索这个,直到找到整个l = xxxx; 然后我创建一个没有标题的新字节数组,然后尝试反序列化数据。用于反序列化的数据包字节是:tcp stream的buffer.Length - foundHeaderSize (l = xxxx;)如果我在同一台机器上运行客户端和服务器,它可以正常运行,但是如果我将客户端和服务器放在不同的机器上,我会遇到异常并且崩溃。数据包被反序列化时发生异常,说:* System.Runtime.InteropServices.SafeArrayTypeMismatchException数组的运行时类型与System.Runtime.InteropServices.PtrToStructureHelper中元数据中记录的sb类型之间发生不匹配Stacktrace:System.Runtime.InteropServices.PtrToStructure的System.Runtime.InteropServices.PtrToStructureHelper(IntPtr ptr,Object structure,Boolean allowValueClasses)(IntPtr ptr,Type structureType .. *我正在寻求帮助以确定问题的原因。对于通过网络传输的对象,我不能这样做吗?
查看完整描述

2 回答

  • 2 回答
  • 0 关注
  • 567 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信