public int ReadInt32()
        {
            var buffer = new byte[sizeof(int)];

            base.Read(buffer, 0, sizeof(int));

            return(SerializerCore.DeserializeInt32(buffer));
        }
        public short ReadInt16()
        {
            var buffer = new byte[sizeof(short)];

            base.Read(buffer, 0, sizeof(short));

            return(SerializerCore.DeserializeInt16(buffer));
        }
        public string ReadString()
        {
            var buffer = new List <byte>();

            int b;

            while ((b = base.ReadByte()) != 0)
            {
                buffer.Add((byte)b);
            }

            return(SerializerCore.DeserializeString(buffer.ToArray()));
        }
        public byte[] Serialize(FrontendMessage message)
        {
            var messageTypeId = message.GetType().GetField("MessageTypeId")?.GetValue(message);
            var payload       = message.Serialize();

            var buffer = new List <byte>();

            if (messageTypeId != null)
            {
                buffer.Add((byte)messageTypeId);
            }
            buffer.AddRange(SerializerCore.Serialize(payload.Length + sizeof(int)));
            buffer.AddRange(payload);

            return(buffer.ToArray());
        }
        public BackendMessage Deserialize(Stream stream)
        {
            var messageTypeId = (byte)stream.ReadByte();

            Type messageType = null;

            foreach (var customType in CustomTypes)
            {
                var field = customType.GetField("MessageTypeId");
                if (field == null)
                {
                    continue;
                }

                if ((byte)field.GetValue(null) == messageTypeId)
                {
                    messageType = customType;
                    break;
                }
            }

            if (messageType == null)
            {
                throw new ArgumentException("invalid message type", nameof(stream));
            }

            var payloadSizeField = new byte[sizeof(int)];

            stream.Read(payloadSizeField, 0, sizeof(int));

            var payloadSize = SerializerCore.DeserializeInt32(payloadSizeField) - sizeof(int);

            if (payloadSize < 0)
            {
                throw new ArgumentException("invalid payload size", nameof(stream));
            }

            var payload  = new byte[payloadSize];
            var readSize = stream.Read(payload, 0, payloadSize);

            if (readSize != payloadSize)
            {
                throw new ArgumentException("invalid payload size", nameof(stream));
            }

            return(Deserialize(payload, messageType));
        }
        public void Write(string value)
        {
            var buffer = SerializerCore.Serialize(value);

            base.Write(buffer, 0, buffer.Length);
        }