Обязательные атрибуты в XML-сериализации - PullRequest
9 голосов
/ 24 мая 2010

Например, у меня есть класс для сериализации

[Serializable]
class Person
{
    [XmlAttribute("name")]
    string Name {get;set;}
}

Мне нужно сделать обязательным атрибут имени. Как это сделать в .NET?

Ответы [ 5 ]

5 голосов
/ 21 марта 2014

Вы можете использовать XmlIgnoreAttribute вместе с шаблоном <FieldName>Specified, чтобы вызвать исключение, если свойство оставлено пустым или пустым. Во время сериализации будет проверяться свойство NameSpecified, чтобы определить, следует ли отображать поле, поэтому, если для свойства Name оставлено значение NULL или пусто, выдается исключение.

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

              return true;
          }
    }
}
4 голосов
/ 23 февраля 2013

Лучший способ решить эту проблему - иметь отдельный XSD, который вы используете для проверки XML перед передачей его на XmlSerializer.Самый простой способ работы с XSD и XmlSerializer - начать с XSD, сгенерировать код для XmlSerializer из этого XSD и , а также использовать его для проверки XML .

4 голосов
/ 24 мая 2010

Прежде всего, [Serializable] не используется сериализатором XML.

Во-вторых, нет способа сделать это обязательным.

0 голосов
/ 27 июля 2017

Вы можете использовать это:

[XmlElement(IsNullable = false)]
0 голосов
/ 24 мая 2010

Полагаю, вы путаете XML с XSD. Если вы хотите, чтобы ваше свойство всегда имело значение, инициализируйте это свойство в конструкторе и создайте исключение, если кто-либо попытается установить его как пустое или нулевое.

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