YamlDotNet
YamlDotNet copied to clipboard
EnumMember is not applied when enum value is a combination of flags.
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
}