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
}