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; }
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}"); } }