XML-Serialisierung und leere Sammlungen
Ich habe eine Eigenschaft, definiert als:
[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }
Wenn die Liste<> Löschen hat keine Artikel
<delete />
emittiert wird. Wenn die Liste<> Löschen auf null gesetzt ist,
<delete xsi:nil="true" />
emittiert wird. Gibt es eine Möglichkeit Attribute verwenden, um die löschen element wurde nicht abgegeben werden, wenn in der Auflistung keine Elemente?
Greg - Perfekt danke, wusste ich nicht einmal Lesen Sie die IsNullable-Dokumentation nur vermutet, es war melde es als nicht erforderlich.
Rob Cooper - Ich habe versucht zu vermeiden, ISerializable, aber Gregs Vorschlag funktioniert. Ich habe laufen in das problem, das Sie beschrieben in (1), brach ich eine Reihe von code, indem Sie einfach null zurückgeben, wenn die Sammlung wurde die Länge null. Um dieses erstellte ich eine EventsBuilder Klasse (die Klasse die ich serialisieren aufgerufen, Ereignisse), das es geschafft allen das Leben/die Schöpfung der zugrunde liegenden Objekte, die Events Klasse, spuckt unsere Veranstaltungen Klassen für die Serialisierung.
InformationsquelleAutor Nic Strong | 2008-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie IsNullable=false oder einfach zu entfernen (es ist standardmäßig auf false gesetzt), dann wird der "löschen" - element wird nicht ausgegeben. Dies funktioniert nur, wenn die Sammlung gleich null.
Meine Vermutung ist, dass es eine Verwirrung zwischen "null-Zulässigkeit" in Bezug auf .NET, und die eine in Bezug auf nullable-Elemente in der XML-jene, die gekennzeichnet sind durch xml:nil-Attribut. XmlArrayAttribute.IsNullable-Eigenschaft steuert die letzteren.
InformationsquelleAutor GregK
Ich habe das gleiche Problem, wo ich nicht wollen, dass ein element ausgegeben, wenn das Feld leer ist oder 0.
Die XML ausgegeben, die nicht nutzen konnten xsi:null="true" (durch design).
Habe ich irgendwo gelesen, dass, wenn Sie eine Eigenschaft vom Typ bool mit dem gleichen Namen wie das Feld, das Sie Steuern möchten, aber angehängt mit 'Angegeben', die die XMLSerializer-überprüfen Sie die return-Wert dieser Eigenschaft, um zu bestimmen, wenn das entsprechende Feld aufgenommen werden sollten.
Um dies zu erreichen, ohne die Umsetzung IXMLSerializer:
Bei der weiteren Lektüre dieser Ansatz funktioniert nur mit Wert-Typen.
Dies scheint gut zu funktionieren mit nicht-Wert-Typen, wie in der Liste oben gezeigt. Für die Kürze, kürzen kann man den code für: get { return Löschen!!! = null && Löschen.Count > 0; }
Diese Lösung funktioniert für mich. Danke!
InformationsquelleAutor theahuramazda
First off, würde ich sagen, Fragen Sie sich, "Was ist Serialisierung?".
Den XmlSerializer tut genau das was es tun soll, beibehalten des aktuellen Zustands des Objekts in XML. Nun, ich bin nicht sicher, warum das gegenwärtige Verhalten ist nicht "rechts" für Sie da, wenn Sie initialisiert die Liste, dann wird es ist initialisiert.
Ich glaube, Sie haben drei Möglichkeiten:
Ich hoffe, das hilft.
InformationsquelleAutor Rob Cooper
Konnte man immer implementieren, IXmlSerializer und führen Sie die Serialisierung manuell.
Sehen http://www.codeproject.com/KB/cs/IXmlSerializable.aspx für ein Beispiel.
InformationsquelleAutor Craig Eddy