Domanda

Sto usando XmlSerializer per scrivere e leggere un oggetto in XML in C #. Attualmente uso gli attributi XmlElement e XmlIgnore per manipolare la serializzazione dell'oggetto.

Se nel mio file xml manca un elemento xml richiesto, il mio oggetto si deserializza ancora (oggetto xml - >) bene. Come faccio a indicare (preferibilmente tramite Attributi) che un determinato campo è "richiesto"?

Ecco un metodo di esempio di ciò che sto usando attualmente:

[XmlElement(ElementName="numberOfWidgets")]
public int NumberThatIsRequired {
    set ...;
    get ...;
}

La mia soluzione ideale sarebbe quella di aggiungere qualcosa come un attributo XmlRequired .

Inoltre, esiste un buon riferimento a quali attributi sono disponibili per manipolare il comportamento di XmlSerializer?

È stato utile?

Soluzione

Ho una risposta per la seconda parte: " Attributi che controllano la serializzazione XML " .

Ancora indagando sulla prima parte ...

EDIT: sospetto fortemente che tu non possa farlo attraverso la deserializzazione XML stessa. Ho appena eseguito xsd.exe su uno schema di esempio che include un attributo richiesto - ed è esattamente lo stesso se l'attributo è contrassegnato come facoltativo. Se ci fosse un modo per richiedere le proprietà da impostare, mi aspetterei che fosse implementato in quel caso.

Sospetto che fondamentalmente devi solo convalidare il tuo albero di oggetti dopo averlo deserializzato. Mi dispiace per quello ...

Altri suggerimenti

L'unico modo in cui ho scoperto di farlo è tramite XSD. Quello che puoi fare è validare mentre deserializzi:

static T Deserialize<T>(string xml, XmlSchemaSet schemas)
{
    //List<XmlSchemaException> exceptions = new List<XmlSchemaException>();
    ValidationEventHandler validationHandler = (s, e) =>
    {
        //you could alternatively catch all the exceptions
        //exceptions.Add(e.Exception);
        throw e.Exception;
    };

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Schemas.Add(schemas);
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationEventHandler += validationHandler;

    XmlSerializer serializer = new XmlSerializer(typeof(T));
    using (StringReader sr = new StringReader(xml))
        using (XmlReader books = XmlReader.Create(sr, settings))
           return (T)serializer.Deserialize(books);
}

Per motivi di estensibilità, XmlSerializer è molto tollerante quando si tratta di deserializzazione; cose come [DefaultValue] , ShouldSerialize {Foo} e {Foo} Specificato sono principalmente usati durante serializzazione (l'eccezione è {Foo} Specified , impostata durante la deserializzazione e interrogata durante la serializzazione).

Come tale; non esiste un modo semplice per farlo, a meno che non si implementi IXmlSerializable e lo si faccia da soli. damagednoob mostra un'opzione xsd, che è anche un'opzione.

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