2010-12-08 1 views

Antwort

13

Sie können eine zusätzliche Eigenschaft erstellen, die MyPropertySpecified aufgerufen wird, die einen booleschen Wert zurückgibt.
Wenn diese Eigenschaft true zurückgibt, wird die MyProperty-Eigenschaft serialisiert. Wenn es false zurückgibt, wird es nicht serialisiert.

Auch möchten Sie diese Eigenschaft mit der XmlIgnoreAttribute dekorieren, so dass diese bestimmte Eigenschaft nicht serialisiert ist.

Beispiel:

public class Person 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    [XmlIgnore] 
    public bool NameSpecified 
    { 
     get { return Name != "secret"; } 
    } 
} 
+0

Ich denke, du hast die Frage falsch verstanden. OP möchte, dass das Attribut ausgegeben wird (in der XML enthalten). –

+2

Wie ich es sehe, möchte er in einigen Fällen einige Eigenschaften dieser Klasse nach xml ausgeben (serialisieren), und in anderen Fällen will er nicht. Dies wird durch meine Antwort gelöst. Ob diese Eigenschaft als Attribut oder als Element serialisiert werden soll, kann von den anderen verfügbaren XMLSerializationAttributes definiert werden. (XmlAttribute für Beispiel). –

+0

Darn, ich muss das versuchen. Wusste nicht, dass xD +1 – Anton

0

Sie können OnSerializingAttribute während der Serialisierung verwenden, die es uns ermöglicht, Methode vor der Serialisierung aufzurufen. Sie können weitere Informationen darüber erhalten here

+0

Funktioniert das mit XML-Serialisierung? –

+0

Was würde er außerdem tun, wenn das spezifische Attribut ein Werttyp wäre? Soweit ich weiß, kann OnSerializing verwendet werden, um während der Serialisierung Werte usw. festzulegen, es ändert nicht, ob das Attribut serialisiert wird. Ich nehme an, dass Sie erwarten, dass NULL-Werte nicht serialisiert werden, aber im Falle von Werttypen gibt es einen Wert in der Eigenschaft und somit würde es zusätzliche Arbeit erfordern, um das Verhalten, das das OP will, zu erhalten. – Anton

0

Imho müssten Sie IXmlSerializable auf die Klasse implementieren und die WriteXml und ReadXml Methoden so umzusetzen, dass sie nur die von Ihnen angegebenen von den Bedingungen auf Basis Attribut schreiben und Lesen verarbeiten kann mit oder ohne dieses bestimmte Attribut, das bei der Deserialisierung vorhanden ist.

IXmlSerializable at Msdn

+0

WriteXml() lässt nicht zu, dass das Element vollständig weggelassen wird. –

+0

Durch die Implementierung von IXmlSerializable können Sie das serialisierte Objekt für die gesamte Klasseninstanz vollständig in XML erstellen. Daher können Sie Attribute und Elemente für alle Eigenschaften der Klasse X weglassen. Sicher, Sie können das Element auf Klassenebene nicht weglassen, was sinnvoll ist. Das würde entweder ein XML-Dokument ohne ein Wurzelelement erzeugen oder es sollte von der Klasseninstanz behandelt werden, die die Klasse X als eines ihrer serialisierten Mitglieder hat. – Anton

4

Während Arbeiten und ist eine ziemlich kurze Lösung, die propertyNameSpecified Muster einige Nachteile hat meiner Meinung nach (verpestet die Schnittstelle der Klasse, stützt sich auf die Namen der Eigenschaften, führt implizite Verhalten). Wenn Sie nur eine einfache Bedingung implementieren müssen (z. B. einen Standardwert nicht serialisieren), ist das Attribut DefaultValue eine bessere Wahl.

Zum Beispiel:

public class PurchaseOrder 
{ 
    [DefaultValue("2002")] 
    public string Year; 
} 

Wenn Jahr den Wert "2002" hat, wird es von der XML-Ausgabe entfallen.