Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在将枚举序列化为字符串时,是否可以添加新的枚举成员而不破坏与Newtonsoft json的约定?_C#_Json_Asp.net Web Api_Enums_Json.net - Fatal编程技术网

C# 在将枚举序列化为字符串时,是否可以添加新的枚举成员而不破坏与Newtonsoft json的约定?

C# 在将枚举序列化为字符串时,是否可以添加新的枚举成员而不破坏与Newtonsoft json的约定?,c#,json,asp.net-web-api,enums,json.net,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,

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

[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);
    }
}
[JsonConverter(typeof(StringEnumConverter))]
公共枚举FooEnumV1
{
老成员,
老成员2,
}
[JsonConverter(类型(StringEnumConverter))]
公共枚举FooEnumV2
{
老成员,
老成员2,
新成员
}
公共类座椅性能测试
{
[测试]
public void AddNewDataMember()
{
var属性=新列表()
{
FooEnumV2.OldMember,
FooEnumV2.OldMember2,
FooEnumV2.NewMember
};
var serialized=JsonConvert.serialized对象(属性);
var deserialized=JsonConvert.DeserializeObject(序列化);
Assert.NotNull(反序列化);
}
}

可以使用自定义EnumConverter,而不是使用默认的stringEnumConverter。下面是为解决类似需求而创建的定制

现在,您将使用自定义转换器声明属性上的序列化属性。它根据有效值序列化枚举。所以你的合同不会因为反序列化而破裂

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

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