Wenn Sie XML-Serialisierung verwenden, um eine Klasse zu serialisieren, wie bestimmte Attribute unter bestimmten Bedingungen ausgegeben werden. in einigen Fällen gibt es dieses Attribut aus, in anderen Fällen nicht.wie Sie ein Attribut in einer bestimmten Bedingung serialisieren
Antwort
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"; }
}
}
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
Funktioniert das mit XML-Serialisierung? –
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
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.
WriteXml() lässt nicht zu, dass das Element vollständig weggelassen wird. –
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
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.
Ich denke, du hast die Frage falsch verstanden. OP möchte, dass das Attribut ausgegeben wird (in der XML enthalten). –
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). –
Darn, ich muss das versuchen. Wusste nicht, dass xD +1 – Anton