是否有可能添加新的枚举成员并且在将枚举串行化为字符串时不与Newtonsoft json断开合约?

时间:2016-03-30 17:24:06

标签: c# json asp.net-web-api enums json.net

以下是破坏兼容性的示例。是否可以序列化为字符串并忽略较新版本的新枚举成员?

[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);
    }
}

1 个答案:

答案 0 :(得分:2)

可以使用自定义EnumConverter而不是使用默认的stringEnumConverter来完成。这是为解决类似要求而创建的自定义TolerantEnumConverter

现在,您将使用自定义转换器声明属性的序列化属性。它根据有效值序列化枚举。因此,您的合同在反序列化方面不会中断。

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

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