private DeserializeDelegate EmitDeserializationDelegate() { DeserializedFieldEntry[] DeserializationDelegate(MappingDataNode mappingDataNode, ISerializationManager serializationManager, ISerializationContext?serializationContext, bool skipHook) { var mappedInfo = new DeserializedFieldEntry[BaseFieldDefinitions.Length]; for (var i = 0; i < BaseFieldDefinitions.Length; i++) { var fieldDefinition = BaseFieldDefinitions[i]; if (fieldDefinition.Attribute.ServerOnly && !IoCManager.Resolve <INetManager>().IsServer) { mappedInfo[i] = new DeserializedFieldEntry(false, fieldDefinition.InheritanceBehavior); continue; } var mapped = mappingDataNode.Has(fieldDefinition.Attribute.Tag); if (!mapped) { mappedInfo[i] = new DeserializedFieldEntry(mapped, fieldDefinition.InheritanceBehavior); continue; } var type = fieldDefinition.FieldType; var node = mappingDataNode.Get(fieldDefinition.Attribute.Tag); var result = fieldDefinition.Attribute.CustomTypeSerializer != null ? serializationManager.ReadWithTypeSerializer(type, fieldDefinition.Attribute.CustomTypeSerializer, node, serializationContext, skipHook) : serializationManager.Read(type, node, serializationContext, skipHook); var entry = new DeserializedFieldEntry(mapped, fieldDefinition.InheritanceBehavior, result); mappedInfo[i] = entry; } return(mappedInfo); } return(DeserializationDelegate); }
private DeserializeDelegate EmitDeserializationDelegate() { DeserializedFieldEntry[] DeserializationDelegate(MappingDataNode mappingDataNode, ISerializationManager serializationManager, ISerializationContext?serializationContext, bool skipHook) { var mappedInfo = new DeserializedFieldEntry[BaseFieldDefinitions.Length]; for (var i = 0; i < BaseFieldDefinitions.Length; i++) { var fieldDefinition = BaseFieldDefinitions[i]; if (fieldDefinition.Attribute.ServerOnly && !IoCManager.Resolve <INetManager>().IsServer) { mappedInfo[i] = new DeserializedFieldEntry(false, fieldDefinition.InheritanceBehavior); continue; } var mapped = mappingDataNode.Has(fieldDefinition.Attribute.Tag); if (!mapped) { mappedInfo[i] = new DeserializedFieldEntry(mapped, fieldDefinition.InheritanceBehavior); continue; } var type = fieldDefinition.FieldType; var node = mappingDataNode.Get(fieldDefinition.Attribute.Tag); DeserializationResult result; if (fieldDefinition.Attribute.CustomTypeSerializer != null) { var foundInterface = false; foreach (var @interface in fieldDefinition.Attribute.CustomTypeSerializer.GetInterfaces()) { if (@interface.GetGenericTypeDefinition() != typeof(ITypeReader <,>)) { continue; } if (@interface.GenericTypeArguments[0] == type && @interface.GenericTypeArguments[1] == node.GetType()) { foundInterface = true; } } if (!foundInterface) { throw new InvalidOperationException( $"Could not find implementation of ITypeReader for type {type} and node {node.GetType()} on customtypeserializer {fieldDefinition.Attribute.CustomTypeSerializer}"); } result = serializationManager.ReadWithTypeSerializer(type, fieldDefinition.Attribute.CustomTypeSerializer, node, serializationContext, skipHook); } else { result = serializationManager.Read(type, node, serializationContext, skipHook); } var entry = new DeserializedFieldEntry(mapped, fieldDefinition.InheritanceBehavior, result); mappedInfo[i] = entry; } return(mappedInfo); } return(DeserializationDelegate); }