Question

J'utilise XmlSerializer pour écrire et lire un objet au format XML en C #. J'utilise actuellement les attributs XmlElement et XmlIgnore pour manipuler la sérialisation de l'objet.

S'il manque un élément xml dans mon fichier XML, mon objet se désérialise toujours (xml - > object). Comment indiquer (de préférence via les attributs) qu’un certain champ est "obligatoire"?

Voici un exemple de méthode que j'utilise actuellement:

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

La solution idéale serait d'ajouter quelque chose comme un attribut XmlRequired .

De même, existe-t-il une bonne référence pour quels attributs sont disponibles pour manipuler le comportement de XmlSerializer?

Était-ce utile?

La solution

J'ai une réponse pour la deuxième partie: "Attributs contrôlant la sérialisation XML" .

Enquête sur la première partie ...

EDIT: Je soupçonne fortement que vous ne pouvez pas faire cela via la désérialisation XML elle-même. Je viens d'exécuter xsd.exe sur un exemple de schéma qui inclut un attribut obligatoire - et il en va de même si l'attribut est marqué comme étant facultatif. S'il y avait un moyen d'exiger que des propriétés soient définies, je m'attendrais à ce que ce soit implémenté dans ce cas.

Je pense que vous devez simplement valider votre arbre d'objets après l'avoir désérialisé. Désolé pour ça ...

Autres conseils

La seule façon que j'ai trouvée de faire cela est via XSD. Ce que vous pouvez faire est de valider pendant la désérialisation:

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);
}

Pour des raisons d'extensibilité, XmlSerializer est très indulgent en matière de désérialisation; des éléments tels que [Valeur par défaut] , ShouldSerialize {Foo} et {Foo} spécifiés sont principalement utilisés pendant sérialisation (l'exception étant {Foo} spécifié , défini lors de la désérialisation et interrogé lors de la sérialisation).

En tant que tel; Il n’est pas facile de le faire, à moins d’implémenter IXmlSerializable et de le faire vous-même. damagenoob affiche une option xsd, qui est également une option.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top