Frage

Ich habe ein eine Eigenschaft wie folgt definiert:

[XmlArray("delete", IsNullable = true)]
[XmlArrayItem("contact", typeof(ContactEvent)),
 XmlArrayItem("sms", typeof(SmsEvent))]
public List<Event> Delete { get; set; }

Wenn die List <> Löschen keine Elemente hat

<delete />

emittiert wird. Wenn die List <> Löschen wird auf null gesetzt

<delete xsi:nil="true" />

emittiert wird. Gibt es eine Möglichkeit Attribute mit dem Löschelement erhält nicht emittiert werden, wenn die Sammlung keine Elemente hat?

Greg - Perfekt danke, ich las nicht einmal die IsNullable Dokumentation einfach angenommen, es wurde signalisiert es als nicht erforderlich.

Rob Cooper - ich versuchte, ISerializable zu vermeiden, aber Gregs Vorschlag funktioniert. Ich habe in das Problem laufen Sie in umrissener (1), habe ich eine Reihe von Code brach von nur null zurückkehrt, wenn die Sammlung der Länge Null war. Um dies zu umgehen habe ich eine EventsBuilder Klasse (die Klasse-I-Serialisierung bin heißt Events), die alle die Lebensdauer / Erstellung der zugrunde liegenden Objekte der Ereignisse Klasse verwaltet, die unsere Veranstaltungen Klassen für die Serialisierung spuckt.

War es hilfreich?

Lösung

Wenn Sie setzen IsNullable = false oder entfernen Sie es einfach (es ist falsch in der Standardeinstellung), dann ist das „Löschen“ Element wird nicht emittiert werden. Dies funktioniert nur, wenn die Sammlung auf null entspricht.

Meine Vermutung ist, dass es eine Verwechslung zwischen „nullability“ in Bezug auf .NET und derjenige Nullable-Elemente in XML verwendet ist - diejenigen, die von xml gekennzeichnet sind: nil-Attribut. XmlArrayAttribute.IsNullable Eigenschaft steuert diese.

Andere Tipps

Ich habe das gleiche Problem hat, wo ich ausgegeben habe kein Element will, wenn das Feld leer oder 0 ist. Die XML ausgegeben konnte nicht xsi verwenden. Null = "true" (mit Absicht)

Ich habe irgendwo gelesen, dass, wenn Sie eine Eigenschaft vom Typ Bool mit dem gleichen Namen wie das Feld, das Sie steuern mögen, schließen ein, aber mit ‚angegeben‘ angehängt, wird der XMLSerializer des Rückgabewert dieser Eigenschaft überprüfen, um festzustellen, ob die entsprechenden Feld soll einbezogen werden.

Um dies zu erreichen, ohne IXmlSerializer Umsetzung:

public List<Event> Delete { get; set; }
[XMLIgnore]
public bool DeleteSpecified
{
 get
 {
   bool isRendered = false;
   if (Delete != null)
   {
     isRendered = (Delete.Count > 0);
   } 

   return isRendered;
 }
 set
 {
 }
}

Als erstes würde ich selbst sagen fragen " Was ist Serialisierung? ".

Die XmlSerializer tut genau das, was es soll dabei sein, den aktuellen Zustand des Objekts zu XML persistierenden. Nun, ich bin nicht sicher, warum das aktuelle Verhalten nicht „richtig“ für Sie ist, da, wenn Sie die Liste initialisiert haben, dann ist es ist initialisiert.

Ich glaube, Sie haben drei Möglichkeiten:

  1. Fügen Sie Code zu dem Getter null zurück, wenn die Sammlung 0 Produkte hat. Dies kann vermasseln anderen Code haben Sie aber.
  2. Implementieren Sie die IXmlSerializable Schnittstelle und alles tun, die Arbeit selbst.
  3. Wenn dies ein weit verbreitetes Verfahren ist, dann möchten Sie vielleicht auf meine Frage suchen „ XML-Serialisierung und Inherited Typen “- Ja, ich weiß, dass es mit einem anderen Thema beschäftigt, aber es zeigt Ihnen, wie eine generische Vermittler Serialisierung Klasse erstellen, die dann werden‚verschraubt‘ein serilization Prozess zu ermöglichen, verkapselt wird. Sie könnten eine ähnliche Klasse erstellen mit Überschreiben des Standardprozesses für null / Nullpunkt Sammlungen zu behandeln.

Ich hoffe, das hilft.

Sie können immer IXmlSerializer implementieren und die Serialisierung manuell durchführen.

Siehe http://www.codeproject.com/KB/cs/IXmlSerializable. aspx für ein Beispiel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top