Ejemplo n.º 1
0
    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);
        //}
    }
Ejemplo n.º 3
0
    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);
        }
Ejemplo n.º 5
0
    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);
        //}
    }
Ejemplo n.º 6
0
    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");
    }
Ejemplo n.º 7
0
 public MemoryStream ToStream <TValue>(TValue?value) =>
 ProtobufHelper.ToStream(value);
Ejemplo n.º 8
0
 public static MemoryStream ToStream(this object?value) =>
 ProtobufHelper.ToStream(value);