10
votes

Attributs requis dans la sérialisation XML

Par exemple, j'ai une classe à sérialiser xxx

Je dois créer un attribut de nom requis. Comment faire cela dans .net?


1 commentaires

Que veux-tu dire? Que voulez-vous exactement?


5 Réponses :


5
votes

Tout d'abord, [sérialisable] n'est pas utilisé par le sérialiszer XML.

Deuxièmement, il n'y a aucun moyen de le rendre requis.


0 commentaires

-5
votes

Je crois que vous êtes confondre XML avec un XSD. Si vous souhaitez que votre propriété ait toujours une valeur, initialisez cette propriété dans le constructeur et lancez une exception si quelqu'un essaie de le définir pour vider ou null.

class Person
{

  private string _Name = "Not Initialized";
  [XmlAttribute("name")]
  string Name {
    get { return _Name;}
    set {
        if(value == null || value==string.Empty) throw new ArgumentException(...);

        _Name = value;
    }
   }
}


3 commentaires

-1: La classe de la personne n'est pas XML-Serializable car elle n'a pas de constructeur sans paramétrage public. Corrigez cela et je vais supprimer le bowvote.


Cela ne fonctionnera pas. Ce constructeur n'utilisera jamais avec sérialisation, ce qui ne s'appelle donc pas également.


L'attribut de noms ne sera jamais défini si omis du modèle d'origine. XMLSerializer n'applique pas la règle requise. La réponse de Pieter Van Ginkel est la plus proche de la précision; Toutefois, l'étape requise consistait à définir un XSD du modèle (le garder à jour) et nécessite des personnalisations pour les attributs à base de cordes, car ils sont nullables par nature.



6
votes

La meilleure façon de résoudre ce problème est d'avoir un XSD distinct que vous utilisez pour valider le XML avant de le transmettre sur le xmlSerializer . Le moyen le plus simple de travailler avec XSD et xmlSerializer est de démarrer avec un XSD, Générez le code pour le xmlSerializer à partir de ce xsd et Utilisez-le également pour valider le XML .


0 commentaires

8
votes

Vous pouvez utiliser le xmlignoreattribute code> ainsi que le modèle spécifié code> pour lancer une exception si la propriété est laissée vide ou null. Pendant la sérialisation, la propriété nomspecified code> sera vérifiée pour déterminer si le champ doit être rendu, de sorte que si les propriétés de noms ont laissé NULL ou vide une exception est lancée.

class Person
{
   [XmlElement("name")]
   string Name { get; set; }
   [XmlIgnore]
   bool NameSpecified
   {
      get { 
              if( String.IsNullOrEmpty(Name)) throw new AgrumentException(...);

              return true;
          }
    }
}


0 commentaires

-1
votes

Vous pouvez utiliser ceci:

[XmlElement(IsNullable = false)]


1 commentaires

nom en question est un attribut + XMLElementattribute S Défaut définit déjà islamulable sur false