private SerializeDelegateSignature EmitSerializeDelegate() { MappingDataNode SerializeDelegate( object obj, ISerializationManager manager, ISerializationContext?context, bool alwaysWrite, object?[] defaultValues) { var mapping = new MappingDataNode(); for (var i = BaseFieldDefinitions.Length - 1; i >= 0; i--) { var fieldDefinition = BaseFieldDefinitions[i]; if (fieldDefinition.Attribute.ReadOnly) { continue; } if (fieldDefinition.Attribute.ServerOnly && !IoCManager.Resolve <INetManager>().IsServer) { continue; } var value = FieldAccessors[i](ref obj); if (value == null) { continue; } if (!fieldDefinition.Attribute.Required && !alwaysWrite && Equals(value, defaultValues[i])) { continue; } var type = fieldDefinition.FieldType; var node = fieldDefinition.Attribute.CustomTypeSerializer != null ? manager.WriteWithTypeSerializer(type, fieldDefinition.Attribute.CustomTypeSerializer, value, alwaysWrite, context) : manager.WriteValue(type, value, alwaysWrite, context); mapping[fieldDefinition.Attribute.Tag] = node; } return(mapping); } return(SerializeDelegate); }
private SerializeDelegateSignature EmitSerializeDelegate() { MappingDataNode SerializeDelegate( object obj, ISerializationManager manager, ISerializationContext?context, bool alwaysWrite, object?[] defaultValues) { var mapping = new MappingDataNode(); for (var i = BaseFieldDefinitions.Length - 1; i >= 0; i--) { var fieldDefinition = BaseFieldDefinitions[i]; if (fieldDefinition.Attribute.ReadOnly) { continue; } if (fieldDefinition.Attribute.ServerOnly && !IoCManager.Resolve <INetManager>().IsServer) { continue; } var value = FieldAccessors[i](ref obj); if (value == null) { continue; } if (!fieldDefinition.Attribute.Required && !alwaysWrite && Equals(value, defaultValues[i])) { continue; } var type = fieldDefinition.FieldType; DataNode node; if (fieldDefinition.Attribute.CustomTypeSerializer != null) { var foundInterface = false; foreach (var @interface in fieldDefinition.Attribute.CustomTypeSerializer.GetInterfaces()) { if (@interface.GetGenericTypeDefinition() != typeof(ITypeWriter <>)) { continue; } if (@interface.GenericTypeArguments[0] == type) { foundInterface = true; } } if (!foundInterface) { throw new InvalidOperationException( $"Could not find implementation of ITypeWriter for type {type} on customtypeserializer {fieldDefinition.Attribute.CustomTypeSerializer}"); } node = manager.WriteWithTypeSerializer(type, fieldDefinition.Attribute.CustomTypeSerializer, value, alwaysWrite, context); } else { node = manager.WriteValue(type, value, alwaysWrite, context); } mapping[fieldDefinition.Attribute.Tag] = node; } return(mapping); } return(SerializeDelegate); }