public static Packet DeserializePacket(IPacketHeader packetHeader, Stream source /*, out object customErrorData*/) { ET_CSPacketHeader header = packetHeader as ET_CSPacketHeader; if (header == null) { Debug.LogError("header为空."); return(null); } Packet packet = null; if (header.IsValid) { Type packetType = GetClientToServerPacketType(header.Id); if (packetType != null && source is MemoryStream) { object instance = Activator.CreateInstance(packetType); packet = (Packet)ProtobufHelper.FromStream(instance, (MemoryStream)source); } else { Debug.LogError("Can not deserialize packet for packet id '{0}'.", header.Id.ToString()); } } else { Debug.LogError("Packet header is invalid."); } header.Clear(); return(packet); }
public bool Serialize <T>(T packet, Stream destination) where T : Packet { PacketBase packetImpl = packet as PacketBase; if (packetImpl == null) { Log.Warning("Packet is invalid."); return(false); } if (packetImpl.PacketType != PacketType.ClientToServer) { Log.Warning("Send packet invalid."); return(false); } //memoryStream.SetLength(memoryStream.Capacity); //memoryStream.Position = PacketHeaderLength; memoryStream.Seek(PacketHeaderLength, SeekOrigin.Begin); memoryStream.SetLength(PacketHeaderLength); //Serializer.SerializeWithLengthPrefix(memoryStream, packet, PrefixStyle.Fixed32); ProtobufHelper.ToStream(packet, memoryStream); // 头部消息 ET_CSPacketHeader packetHeader = ReferencePool.Acquire <ET_CSPacketHeader>(); packetHeader.Flag = 0; //客户端发送的消息,默认flag为0,服务器会解析flag字段值 packetHeader.PacketLength = (int)memoryStream.Length - ETPackets.ET_PacketSizeLength; // 消息内容长度需要减去头部消息长度,只包含packetSize一个字段 packetHeader.Id = (ushort)packet.Id; memoryStream.Position = 0; this.byteses[0].WriteTo(0, (ushort)packetHeader.PacketLength); this.byteses[1][0] = packetHeader.Flag; this.byteses[2].WriteTo(0, packetHeader.Id); int index = 0; foreach (var bytes in this.byteses) { Array.Copy(bytes, 0, memoryStream.GetBuffer(), index, bytes.Length); index += bytes.Length; } //Serializer.SerializeWithLengthPrefix(memoryStream, packetHeader, PrefixStyle.Fixed32); ReferencePool.Release(packetHeader); memoryStream.WriteTo(destination); long len = destination.Length; long pos = destination.Position; byte[] temp = (destination as MemoryStream).GetBuffer(); return(true); //} }
public static IPacketHeader DeserializePacketHeader(Stream source) { ET_CSPacketHeader scHeader = new ET_CSPacketHeader(); MemoryStream memoryStream = source as MemoryStream; if (memoryStream != null) { int packetSize = BitConverter.ToUInt16(memoryStream.GetBuffer(), 0); byte flag = memoryStream.GetBuffer()[ETPackets.ET_MessageFlagIndex]; ushort opcode = BitConverter.ToUInt16(memoryStream.GetBuffer(), ETPackets.ET_MessageOpcodeIndex); //这里需要用服务端发过来的packetSize的值减去消息包中flag和opcode的长度, //因为服务端在发送消息时设置的packetSize的值是包含flag和opcode的,而 //客户端在解析包头的时候已经解析了flag和opcode,因此剩余要解析的数据长度要减去3(flag和opcode的总长度是3个字节) scHeader.PacketLength = packetSize - ETPackets.ET_MessageIdentifyLength; scHeader.Flag = flag; scHeader.Id = opcode; return(scHeader); } return(null); }