private object SerializeDeserialize(object obj)
        {
            MemoryStream memoryStream = null;

            var serializerResolver = new SerializerResolverBuilder <MessageBody>().Build();
            var serializer         = serializerResolver.GetSerializer(obj.GetType());

            try
            {
                memoryStream = new MemoryStream();
                using (var streamWriter = new StreamWriter(memoryStream))
                    using (var streamReader = new StreamReader(memoryStream))
                    {
                        var serializationContext = new SerializationContext(serializerResolver);
                        serializer.Serialize(streamWriter, serializationContext, obj);
                        var arr = memoryStream.ToArray();
                        Console.WriteLine(BitConverter.ToString(arr));

                        memoryStream.Position = 0;
                        var deserializationContext = new SerializationContext(serializerResolver);
                        var result = serializer.Deserialize(streamReader, deserializationContext);
                        memoryStream = null;
                        return(result);
                    }
            }
            finally
            {
                if (memoryStream != null)
                {
                    memoryStream.Dispose();
                }
            }
        }
 public Type FindType(byte[] packet)
 {
     MemoryStream memoryStream = null;
     try
     {
         memoryStream = new MemoryStream(packet);
         using (var streamReader = new StreamReader(memoryStream))
         {
             var typeInfo = this.packetInspector.FindSubType(streamReader);
             memoryStream = null;
             return typeInfo != null ? typeInfo.Type : null;
         }
     }
     finally
     {
         if (memoryStream != null)
         {
             memoryStream.Dispose();
         }
     }
 }
        public Type FindType(byte[] packet)
        {
            MemoryStream memoryStream = null;

            try
            {
                memoryStream = new MemoryStream(packet);
                using (var streamReader = new StreamReader(memoryStream))
                {
                    var typeInfo = this.packetInspector.FindSubType(streamReader);
                    memoryStream = null;
                    return(typeInfo != null ? typeInfo.Type : null);
                }
            }
            finally
            {
                if (memoryStream != null)
                {
                    memoryStream.Dispose();
                }
            }
        }
        public TypeInfo FindSubType(StreamReader reader)
        {
            var current = this.typeInfo;

            while (current != null)
            {
                if (current.KnownType == null)
                {
                    return current;
                }

                reader.Position = current.KnownType.Offset;
                int identifier;
                switch (current.KnownType.IdentifierType)
                {
                    case IdentifierType.Byte:
                        identifier = reader.ReadByte();
                        break;
                    case IdentifierType.Int16:
                        identifier = reader.ReadInt16();
                        break;
                    case IdentifierType.Int32:
                        identifier = reader.ReadInt32();
                        break;
                    default:
                        return null;
                }

                var subType = current.GetSubType(identifier);
                if (subType == null)
                {
                    return null;
                }

                current = subType;
            }

            return null;
        }
        private object SerializeDeserialize(object obj)
        {
            MemoryStream memoryStream = null;

            var serializerResolver = new DebuggingSerializerResolverBuilder<MessageBody>().Build();
            var serializer = serializerResolver.GetSerializer(obj.GetType());

            try
            {
                memoryStream = new MemoryStream();
                using (var streamWriter = new StreamWriter(memoryStream))
                using (var streamReader = new StreamReader(memoryStream))
                {
                    var serializationContext = new SerializationContext(serializerResolver);
                    serializer.Serialize(streamWriter, serializationContext, obj);
                    var arr = memoryStream.ToArray();
                    Console.WriteLine(BitConverter.ToString(arr));

                    memoryStream.Position = 0;
                    var deserializationContext = new SerializationContext(serializerResolver);
                    var result = serializer.Deserialize(streamReader, deserializationContext);
                    memoryStream = null;
                    return result;
                }
            }
            finally
            {
                if (memoryStream != null)
                {
                    memoryStream.Dispose();
                }
            }
        }
        internal object Deserialize(StreamReader streamReader, PropertyMetaData propertyMetaData)
        {
            if (propertyMetaData.UsesFlagsAttributes.Any() == false)
            {
                return null;
            }

            var usesFlag = this.Evaluate(propertyMetaData.UsesFlagsAttributes);
            if (usesFlag == null)
            {
                return null;
            }

            var serializer = this.serializerResolver.GetSerializer(usesFlag.Type);
            var value = serializer.Deserialize(streamReader, this, propertyMetaData);

            if (propertyMetaData.Type.IsValueType)
            {
                if (propertyMetaData.Type.IsPrimitive)
                {
                    return Convert.ChangeType(value, propertyMetaData.Type);
                }

                if (propertyMetaData.Type.IsEnum)
                {
                    return Convert.ChangeType(value, Enum.GetUnderlyingType(propertyMetaData.Type));
                }
            }

            return value;
        }
Beispiel #7
0
        private void ProcessIPCMessage(byte[] msgBytes)
        {
            try
            {
                using (MemoryStream stream = new MemoryStream(msgBytes))
                {
                    StreamReader reader = new StreamReader(stream)
                    {
                        Position = 0
                    };

                    if (reader.ReadUInt16() != 0xFFFF)
                    {
                        return;
                    }

                    ushort len = reader.ReadUInt16();

                    if (len != msgBytes.Length)
                    {
                        return;
                    }

                    byte channelId = reader.ReadByte();

                    if (channelId != _channelId)
                    {
                        return;
                    }

                    int charId = reader.ReadInt32();

                    if (charId == Game.ClientInst)
                    {
                        return;
                    }

                    reader.Position = 2;
                    TypeInfo subTypeInfo = _packetInspector.FindSubType(reader, out int opCode);

                    if (subTypeInfo == null)
                    {
                        return;
                    }

                    var serializer = _serializerResolver.GetSerializer(subTypeInfo.Type);
                    if (serializer == null)
                    {
                        return;
                    }

                    reader.Position = 11;
                    SerializationContext serializationContext = new SerializationContext(_serializerResolver);

                    IPCMessage message = (IPCMessage)serializer.Deserialize(reader, serializationContext);

                    if (_callbacks.ContainsKey(opCode))
                    {
                        _callbacks[opCode]?.Invoke(charId, message);
                    }
                }
            }
            catch (Exception e)
            {
                //If you get this message and it concerns you please create an issue or contact me on Discord!
                Chat.WriteLine($"Failed to process IPC message {e.Message}");
            }
        }