2016-04-28 6 views
2

Gibt es eine nicht-attributbasierte Methode zum Ignorieren aller Eigenschaften, die beim Serialisieren keinen entsprechenden Konstruktorparameter haben? Wenn Sie diese Klasse beispielsweise serialisieren, sollte die Eigenschaft Combo ignoriert werden. Bei einer Round-Trip-Serialisierung/Deserialisierung einer Instanz von MyClass muss Combo nicht serialisiert werden. Idealerweise könnte ich einige Out-of-the-Box-Einstellungen verwenden.Wie alle Eigenschaften mit keinem entsprechenden Konstruktorparameter beim Serialisieren automatisch ignoriert werden

public class MyClass 
{ 
    public MyClass(int myInt, string myString) 
    { 
     this.MyInt = myInt; 
     this.MyString = myString; 
    } 

    public int MyInt { get; } 

    public string MyString { get; } 

    public string Combo => this.MyInt + this.MyString; 
} 
+0

Wenn die Namen der Parameter im Konstruktor den Namen der Attribute entsprechen, denke ich, dass die Reflektion Ihnen helfen kann, die Liste der Eigenschaften zu erhalten, die serialisiert werden sollen. Dann können Sie dieses einfache verwenden, um die nicht attributbasierte Methode zu erstellen http://stackoverflow.com/questions/9377414/excluding-some-properties-during-serialization-without-changing-the-original-cla – AnotherGeek

Antwort

2

Sie können dies mit einem custom IContractResolver:

public class ConstructorPropertiesOnlyContractResolver : DefaultContractResolver 
{ 
    readonly bool serializeAllWritableProperties; 

    public ConstructorPropertiesOnlyContractResolver(bool serializeAllWritableProperties) 
     : base() 
    { 
     this.serializeAllWritableProperties = serializeAllWritableProperties; 
    } 

    protected override JsonObjectContract CreateObjectContract(Type objectType) 
    { 
     var contract = base.CreateObjectContract(objectType); 

     if (contract.CreatorParameters.Count > 0) 
     { 
      foreach (var property in contract.Properties) 
      { 
       if (contract.CreatorParameters.GetClosestMatchProperty(property.PropertyName) == null) 
       { 
        if (!serializeAllWritableProperties || !property.Writable) 
         property.Readable = false; 
       } 
      } 
     } 

     return contract; 
    } 
} 

Dann nutzen Sie es mögen:

var settings = new JsonSerializerSettings { ContractResolver = new ConstructorPropertiesOnlyContractResolver(false) }; 
var json = JsonConvert.SerializeObject(myClass, Formatting.Indented, settings); 

Pass true für serializeAllWritableProperties, wenn Sie auch die wollen Lese-/Schreibeigenschaften serialisiert sind nicht in der Liste der Konstruktorparameter enthalten, z AnUnrelatedReadWriteProperty in:

public class MyClass 
{ 
    public MyClass(int myInt, string myString) 
    { 
     this.MyInt = myInt; 
     this.MyString = myString; 
    } 

    public int MyInt { get; private set; } 

    public string MyString { get; private set; } 

    public string Combo { get { return this.MyInt + this.MyString; } } 

    public string AnUnrelatedReadWriteProperty { get; set; } 
} 

Hinweis sollten Sie cache your contract resolver for best performance.

+0

wow, awsome Antworten! Vielen Dank, dass Sie sich die Zeit genommen haben, dies aufzuschreiben. – SFun28

Verwandte Themen