3

Here is the example that will break compatibility. Is it possible to serialize to strings and ignore new enum members from newer version?

[JsonConverter(typeof(StringEnumConverter))]
public enum FooEnumV1
{
    OldMember,
    OldMember2,
}

[JsonConverter(typeof(StringEnumConverter))]
public enum FooEnumV2
{
        OldMember,
        OldMember2,
        NewMember
}

public class SeatPropertiesTests
{
    [Test]
    public void AddNewDataMember()
    {
        var properties = new List<FooEnumV2>()
        {
            FooEnumV2.OldMember,
            FooEnumV2.OldMember2,
            FooEnumV2.NewMember
        };
        var serialized = JsonConvert.SerializeObject(properties);
        var deserialized = JsonConvert.DeserializeObject<List<FooEnumV1>>(serialized);
        Assert.NotNull(deserialized);
    }
}
jficker
  • 175
  • 6

1 Answers1

2

It can be done using custom EnumConverter instead of using default stringEnumConverter. Here's the custom TolerantEnumConverter created to resolve similar requirements.

Now you'll be declare the serialization attributes on property with custom converter. It serializes enum based on valid values. So your contract won't break on deserialization.

[JsonConverter(typeof(TolerantEnumConverter))]
public enum FooEnumV1
{
    OldMember,
    OldMember2,
}

[JsonConverter(typeof(TolerantEnumConverter))]
public enum FooEnumV2
{
    OldMember,
    OldMember2,
    NewMember
}
Community
  • 1
  • 1
vendettamit
  • 14,315
  • 2
  • 32
  • 54