2013-08-14 7 views
28

In C#, wie kann ich XmlSerializer veranlassen, eine Eigenschaft während der Serialisierung, aber nicht während der Deserialisierung zu ignorieren? (? Oder wie soll ich tun das gleiche mit Json.net)Ignorieren einer Eigenschaft während der XML-Serialisierung, aber nicht während der Deserialisierung

Um eine Eigenschaft entfernt, serialisiert zu verhindern, können Sie das XmlIgnore Attribut hinzufügen:

[XmlIgnore] 
public int FooBar {get;set;} 

Dies bewirkt, dass die <FooBar> Tag während weggelassen werden Serialisierung.

Dies bedeutet jedoch auch, dass das Tag <FooBar> während der Deserialisierung ignoriert wird.

In meinem Fall, ich akzeptiere ein Array von Elementen von Benutzer in der Anfrage, und für jedes Element Benutzer kann eine Aktion Eigenschaft angeben, wenn sie das Element hinzufügen, ändern oder löschen möchten. Ich möchte für GET-Listenaufrufe dasselbe Modellobjekt verwenden und diese Aktionseigenschaft nicht zurückgeben. Ich erwarte, dass dies ein ziemlich häufiger Fall wäre.

Ein weiterer Anwendungsfall: sagen Sie

public class Circle 
{ 
    public double Radius { get; set; } 
} 

und Sie ändern, um sie hinzuzufügen einen Durchmesser Eigenschaft

public class Circle2 
{ 
    public double Diameter { get; set; } 
    public double Radius { get { return Diameter/2; } set { Diameter = value*2; } } 
} 

Möglicherweise möchten Sie serialisiert nur den Durchmesser, aber immer noch einen Kreis bezwecken sein Deserialisieren von XML-Dateien im alten Format, die nur den Radius enthalten.

ich meine Forschung getan und etwas nicht finden, daher ist diese Frage

Lösung: dachte ich die Lösung aus. Ich kann eine ShouldSerialize Eigenschaft hinzufügen, die immer false zurück, Details bei this MSDN documentation

(diese Lösung als eine tatsächliche Antwort gegeben werden könnte, wenn diese Frage erneut geöffnet wird)

+0

Wie können Sie es nicht serialisieren, aber erwarten, dass es es deserialisiert? – Justin

+0

Geben Sie einer Eigenschaft einen Standardwert? Wie sonst würden Sie eine Eigenschaft während der Deserialisierung "nicht ignorieren"? – dasblinkenlight

+0

Ich bin zu faul, um die Dokumente jetzt zu durchsuchen, aber wenn Sie durch die Dokumentation von json.NET schauen, garantiere ich, dass es Beispiele gibt, die Ihnen zeigen, wie man eine Eigenschaft während der Serialisierung/Deserialisierung ignoriert. – evanmcdonnal

Antwort

15

Wenn Sie das Element bei der Serialisierung ignorieren wollen mit XmlSerializer, können Sie XmlAttributeOverrides verwenden:

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
XmlAttributes attribs = new XmlAttributes(); 
attribs.XmlIgnore = true; 
attribs.XmlElements.Add(new XmlElementAttribute("YourElementName")); 
overrides.Add(typeof(YourClass), "YourElementName", attribs); 

XmlSerializer ser = new XmlSerializer(typeof(YourClass), overrides); 
ser.Serialize(... 
+0

Danke Fcuesta, aber XmlIgnore würde sowohl für Serialisierung und Deserialisierung gelten. Ich suche nach einer Möglichkeit zur Deserialisierung, wenn die Eigenschaft bereitgestellt wird, aber niemals serialisieren. – Manoj

+3

Verwenden Sie bei der Serialisierung: XmlSerializer ser = new XmlSerializer (typeof (YourClass), überschreibt); Bei der Deserialisierung verwende XmlSerializer ser = new XmlSerializer (typeof (YourClass)); ohne den Overrides-Parameter – fcuesta

+0

Danke dir. Dieser Mechanismus ist nicht sehr intuitiv. – xr280xr

19

Dies ist die Lösung von Manoj umrissen ist:

Wenn Sie Serialisierung o zu unterdrücken wollen f eine bestimmte Eigenschaft Foo, aber immer noch in der Lage sein, es zu deserialisieren, können Sie eine Methode public bool ShouldSerializeFoo() hinzufügen, die immer false zurückgibt.

Beispiel:

public class Circle2 
{ 
    public double Diameter { get; set; } 
    public double Radius { get { return Diameter/2; } set { Diameter = value*2; } } 

    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
    public bool ShouldSerializeRadius() {return false;} 
} 

Dadurch wird der Radius verursachen nicht serialisiert werden, aber immer noch erlauben es deserialisiert werden.

Diese Methode muss öffentlich sein, damit der XMLSerializer sie finden kann. Um den Namensraum nicht zu verschmutzen, können Sie das Attribut EditorBrowsable hinzufügen, um es vor der IDE zu verbergen. Leider funktioniert dieses Verstecken nur, wenn die Assembly in Ihrem aktuellen Projekt als DLL referenziert wird, nicht jedoch, wenn Sie das eigentliche Projekt mit diesem Code bearbeiten.

+0

Dies ist äußerst nützlich . – rolls

Verwandte Themen