YamlDotNet icon indicating copy to clipboard operation
YamlDotNet copied to clipboard

EnumMember is not applied when enum value is a combination of flags.

Open filzrev opened this issue 11 months ago • 5 comments
trafficstars

Describe the bug When serialize enum value combinations. value is serialized by default enum name. And the name that is specified by EnumMember is not used.

To Reproduce

Test Code

[Flags]
public enum TestEnum
{
	[JsonStringEnumMemberName("A")]
	[EnumMember(Value = "A")]
	AAA = 1,
	[JsonStringEnumMemberName("B")]
	[EnumMember(Value = "B")]
	BBB = 2,
}

public class Tests
{
    [Fact]
    public void YamlDotNetTest()
    {
          var serializer = new SerializerBuilder().Build();

          // Arrange
          var value = TestEnum.AAA | TestEnum.BBB;

          // Act
          var result = serializer.Serialize(value);

          // Assert
          result.Should().Be("A, B\r\n"); // Failed. Expected: "A,B\r\n" but Actual: "AAA, BBB\r\n"
    }
}

Serialize result of System.Text.Json / NewtonsoftJson

When serialize same value with System.Text.Json / NewtonsoftJson enum value is serialized as expected.

// System.Text.Json use `JsonStringEnumMemberName` attribute (EnumMember attribute is not used)
[Fact]
public void SystemTextJsonTest()
{	
	var options = new JsonSerializerOptions { };
	options.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));
	
	// Arrange
	var value = TestEnum.AAA | TestEnum.BBB;

	// Act
	var result = System.Text.Json.JsonSerializer.Serialize(value, options);

	// Assert
	result.Should().Be("\"A, B\""); // Success
}

// NewtonsoftJson use `EnumMember` attribute.
[Fact]
public void NewtonsoftJsonTest()
{
	// Arrange
	var value = TestEnum.AAA | TestEnum.BBB;

	// Act
	var result = JsonConvert.SerializeObject(value, new Newtonsoft.Json.Converters.StringEnumConverter());

	// Assert
	result.Should().Be("\"A, B\""); // Success
}

filzrev avatar Dec 03 '24 07:12 filzrev