2016-03-30 1 views
2

Hier ist das Beispiel, das die Kompatibilität bricht. Ist es möglich, in Strings zu serialisieren und neue Enum-Mitglieder aus neueren Versionen zu ignorieren?Ist es möglich, ein neues enum-Mitglied hinzuzufügen und den Vertrag mit Newtonsoft json nicht zu brechen, wenn enum als Zeichenfolge seriviert wird?

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

Antwort

2

Es kann mit benutzerdefinierten EnumConverter anstelle von Standard StringEnumConverter getan werden. Hier ist die benutzerdefinierte TolerantEnumConverter erstellt, um ähnliche Anforderungen zu lösen.

Jetzt werden Sie die Serialisierungsattribute auf Eigenschaft mit benutzerdefinierten Konverter deklarieren. Es serialisiert Enum basierend auf gültigen Werten. So wird Ihr Vertrag bei der Deserialisierung nicht unterbrochen.

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

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