public override void Send(int opcode, long pid, object message) { MemoryStream stream = this.Stream; stream.Seek(0, SeekOrigin.Begin); stream.SetLength(0); ProtobufHelper.ToStream(message, stream); this.opcodeCache.WriteTo(0, opcode); this.IdCache.WriteTo(0, pid); this.packetSizeCache.WriteTo(0, (int)stream.Length); if (BitConverter.IsLittleEndian) { Array.Reverse(this.opcodeCache, 0, opcodeCache.Length); Array.Reverse(this.IdCache, 0, IdCache.Length); Array.Reverse(this.packetSizeCache, 0, packetSizeCache.Length); } this.sendBuffer.Write(this.opcodeCache, 0, this.opcodeCache.Length); this.sendBuffer.Write(this.IdCache, 0, this.IdCache.Length); this.sendBuffer.Write(this.packetSizeCache, 0, this.packetSizeCache.Length); this.sendBuffer.Write(stream); }
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 void FromStream(int iteration) { #pragma warning disable CS0618 var binaryStream = BinaryHelper.ToStream(_testModel); #pragma warning restore CS0618 var dataContractStream = DataContractHelper.ToStream(_testModel); var jilStream = JilHelper.ToStream(_testModel); var messagePackStream = MessagePackHelper.ToStream(_testModel); var msgPackStream = MsgPackHelper.ToStream(_testModel); var newtonsoftJsonStream = NewtonsoftJsonHelper.ToStream(_testModel); var protobufStream = ProtobufHelper.ToStream(_testModel); var sharpYamlStream = SharpYamlHelper.ToStream(_testModel); var systemTextJsonStream = SystemTextJsonHelper.ToStream(_testModel); var utf8JsonStream = Utf8JsonHelper.ToStream(_testModel); var xmlStream = XmlHelper.ToStream(_testModel); var yamlDotNetStream = YamlDotNetHelper.ToStream(_testModel); var zeroFormatterStream = ZeroFormatterHelper.ToStream(_testModel); Console.WriteLine("FromStream go!"); Runner.Initialize(); Console.WriteLine(Runner.Time("BinaryHelper FromStream", iteration, #pragma warning disable CS0618 () => BinaryHelper.FromStream <TestModel>(binaryStream))); #pragma warning restore CS0618 Console.WriteLine(Runner.Time("DataContractHelper FromStream", iteration, () => DataContractHelper.FromStream <TestModel>(dataContractStream))); Console.WriteLine(Runner.Time("JilHelper FromStream", iteration, () => JilHelper.FromStream <TestModel>(jilStream))); Console.WriteLine(Runner.Time("MessagePackHelper FromStream", iteration, () => MessagePackHelper.FromStream <TestModel>(messagePackStream))); Console.WriteLine(Runner.Time("MsgPackHelper FromStream", iteration, () => MsgPackHelper.FromStream <TestModel>(msgPackStream))); Console.WriteLine(Runner.Time("NewtonsoftJsonHelper FromStream", iteration, () => NewtonsoftJsonHelper.FromStream <TestModel>(newtonsoftJsonStream))); Console.WriteLine(Runner.Time("ProtobufHelper FromStream", iteration, () => ProtobufHelper.FromStream <TestModel>(protobufStream))); Console.WriteLine(Runner.Time("SharpYamlHelper FromStream", iteration, () => SharpYamlHelper.FromStream <TestModel>(sharpYamlStream))); Console.WriteLine(Runner.Time("SystemTextJsonHelper FromStream", iteration, () => SystemTextJsonHelper.FromStream <TestModel>(systemTextJsonStream))); Console.WriteLine(Runner.Time("Utf8JsonHelper FromStream", iteration, () => Utf8JsonHelper.FromStream <TestModel>(utf8JsonStream))); Console.WriteLine(Runner.Time("XmlHelper FromStream", iteration, () => XmlHelper.FromStream <TestModel>(xmlStream))); Console.WriteLine(Runner.Time("YamlDotNetHelper FromStream", iteration, () => YamlDotNetHelper.FromStream <TestModel>(yamlDotNetStream))); Console.WriteLine(Runner.Time("ZeroFormatterHelper FromStream", iteration, () => ZeroFormatterHelper.FromStream <TestModel>(zeroFormatterStream))); Console.WriteLine("\r\nFromStream complete!\r\n"); }
/// <summary> /// 序列化消息包。 /// </summary> /// <typeparam name="T">消息包类型。</typeparam> /// <param name="packet">要序列化的消息包。</param> /// <param name="destination">要序列化的目标流。</param> /// <returns>是否序列化成功。</returns> public bool Serialize <T>(T packet, Stream destination) where T : Packet { // struct MsgHeadEx // { // ushort usSize; // ushort usType; // bool bHasNext; // }; 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); } m_CachedStream.Seek(PacketHeaderLength, SeekOrigin.Begin); m_CachedStream.SetLength(PacketHeaderLength); ProtobufHelper.ToStream(packet, m_CachedStream); CTM_CSPacketHeader packetHeader = ReferencePool.Acquire <CTM_CSPacketHeader>(); packetHeader.PacketLength = (int)m_CachedStream.Length; packetHeader.Id = (ushort)packet.Id; packetHeader.HasNext = 0; m_CachedStream.Position = 0; this.byteses[0].WriteTo(0, (ushort)packetHeader.PacketLength); this.byteses[1].WriteTo(0, packetHeader.Id); this.byteses[2][0] = packetHeader.HasNext; int index = 0; foreach (var bytes in this.byteses) { Array.Copy(bytes, 0, m_CachedStream.GetBuffer(), index, bytes.Length); index += bytes.Length; } ReferencePool.Release(packetHeader); ReferencePool.Release(packet); m_CachedStream.WriteTo(destination); return(true); }
public static bool Serialize <T>(T packet, Stream destination) where T : Packet { PacketBase packetImpl = packet as PacketBase; if (packetImpl == null) { Debug.LogError("Packet is invalid."); return(false); } if (packetImpl.PacketType != PacketType.ServerToClient) { Debug.LogError("Send packet invalid."); return(false); } memoryStream.Seek(PacketHeaderLength, SeekOrigin.Begin); memoryStream.SetLength(PacketHeaderLength); ProtobufHelper.ToStream(packet, memoryStream); // 头部消息 ET_SCPacketHeader packetHeader = new ET_SCPacketHeader(); packetHeader.Flag = 0; //客户端发送的消息,默认flag为0,服务器会解析flag字段值 packetHeader.PacketLength = (int)memoryStream.Length - ETPackets.ET_PacketSizeLength; // 消息总长度需要减去前2字节长度,第3,4,5字节也是消息长度(packetsize)的一部分 //Debug.LogInfo("发送消息长度:" + packetHeader.PacketLength); packetHeader.Id = (ushort)packet.Id; memoryStream.Position = 0; byteses[0].WriteTo(0, (ushort)packetHeader.PacketLength); byteses[1][0] = packetHeader.Flag; byteses[2].WriteTo(0, packetHeader.Id); int index = 0; foreach (var bytes in byteses) { Array.Copy(bytes, 0, memoryStream.GetBuffer(), index, bytes.Length); index += bytes.Length; } memoryStream.WriteTo(destination); long len = destination.Length; long pos = destination.Position; byte[] temp = (destination as MemoryStream).GetBuffer(); return(true); //} }
public void ToStream(int iteration) { Console.WriteLine("ToStream go!"); Runner.Initialize(); Console.WriteLine(Runner.Time("BinaryHelper ToStream", iteration, #pragma warning disable CS0618 () => BinaryHelper.ToStream(_testModel))); #pragma warning restore CS0618 Console.WriteLine(Runner.Time("DataContractHelper ToStream", iteration, () => DataContractHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("JilHelper ToStream", iteration, () => JilHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("MessagePackHelper ToStream", iteration, () => MessagePackHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("MsgPackHelper ToStream", iteration, () => MsgPackHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("NewtonsoftJsonHelper ToStream", iteration, () => NewtonsoftJsonHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("ProtobufHelper ToStream", iteration, () => ProtobufHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("SharpYamlHelper ToStream", iteration, () => SharpYamlHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("SystemTextJsonHelper ToStream", iteration, () => SystemTextJsonHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("Utf8JsonHelper ToStream", iteration, () => Utf8JsonHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("XmlHelper ToStream", iteration, () => XmlHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("YamlDotNetHelper ToStream", iteration, () => YamlDotNetHelper.ToStream(_testModel))); Console.WriteLine(Runner.Time("ZeroFormatterHelper ToStream", iteration, () => ZeroFormatterHelper.ToStream(_testModel))); Console.WriteLine("\r\nToStream complete!\r\n"); }
public MemoryStream ToStream <TValue>(TValue?value) => ProtobufHelper.ToStream(value);
public static MemoryStream ToStream(this object?value) => ProtobufHelper.ToStream(value);