Domanda

Ho una proprietà definita come:

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

Se l'Elenco<> Elimina non ha elementi

<delete />

viene emesso.Se l'Elenco<> Elimina è impostato su null

<delete xsi:nil="true" />

viene emesso.C'è un modo per utilizzare gli attributi per ottenere l'eliminazione di un elemento di non essere emesso se la raccolta non ha elementi?

Greg - Perfetto, grazie, non avevo neanche letto il IsNullable documentazione appena assunto era di segnalazione che non è necessario.

Rob Cooper - Stavo cercando di evitare ISerializable, ma Gregs suggerimento funziona.Ho fatto funzionare il problema è descritto in (1), ho rotto un sacco di codice, semplicemente restituire null se la raccolta è stata di lunghezza zero.Per ottenere intorno a questo, ho creato un EventsBuilder classe (la classe io sono la serializzazione è chiamato Eventi) che hanno gestito tutta la durata/creazione di oggetti sottostanti degli Eventi di classe che sputa i nostri Eventi, le classi per la serializzazione.

È stato utile?

Soluzione

Se si imposta IsNullable=false o semplicemente rimuovere (è false per impostazione predefinita), quindi "elimina" elemento non verrà emesso.Questo funziona solo se la raccolta è uguale a null.

La mia ipotesi è che c'è una confusione tra "annullabilità" in termini di .NET, e quello relativo alle nullable elementi XML -- quelli che sono contrassegnati da xml:nil attributo.XmlArrayAttribute.IsNullable controlli della proprietà di quest'ultimo.

Altri suggerimenti

Ho avuto lo stesso problema per cui non voglio un elemento riprodotto solo se il campo è vuoto o 0.XML generati non poteva usare xsi:null="true" (da disegno).

Ho letto da qualche parte che se si include una proprietà di tipo bool con lo stesso nome del campo che si desidera controllare, ma con il suffisso 'Specificato', XMLSerializer sarà controllare il valore di ritorno di questa proprietà per determinare se il campo corrispondente dovrebbe essere incluso.

Per raggiungere questo obiettivo senza l'attuazione di IXMLSerializer:

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

   return isRendered;
 }
 set
 {
 }
}

Prima di tutto, direi di chiedere a te stesso "Che cosa è la Serializzazione?".

Il XmlSerializer sta facendo esattamente quello che deve fare, persistendo l'attuale stato dell'oggetto XML.Ora, io non sono sicuro perché il comportamento attuale non è "giusto" per te, visto che se hai inizializzato l'Elenco, allora è inizializzato.

Penso che hai tre opzioni:

  1. Aggiungere il codice per il Getter per restituire null se la raccolta ha 0 oggetti.Questo può rovinare altro codice hanno però.
  2. Implementare il IXmlSerializable interfaccia e fare tutto il lavoro da soli.
  3. Se questo è un processo comune, quindi si consiglia di guardare alla mia domanda "La Serializzazione XML e Ereditate Tipi"- Sì, so che si tratta di un altro problema, ma si mostra come creare un generico intermediario serializzazione di classe che possono essere "montati" per consentire un serilization processo di essere incapsulato.Si potrebbe creare una classe simile a trattare con l'override di processo predefinito null/zero-voce collezioni.

Spero che questo aiuta.

Si potrebbe implementare sempre IXmlSerializer ed eseguire la serializzazione manualmente.

Vedere http://www.codeproject.com/KB/cs/IXmlSerializable.aspx per un esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top