.net XML序列化中的必需属性

.net XML序列化中的必需属性,.net,xml-serialization,.net,Xml Serialization,例如,我有一个要序列化的类 [Serializable] class Person { [XmlAttribute("name")] string Name {get;set;} } 我需要使Name属性成为必需的。如何在.NET中执行此操作?首先,XML序列化程序不使用[Serializable] 其次,没有办法使它成为必需的。我认为您将XML与XSD混淆了。如果希望属性始终具有值,请在构造函数中初始化此属性,如果有人试图将其设置为空或null,则引发异常 class Per

例如,我有一个要序列化的类

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

我需要使Name属性成为必需的。如何在.NET中执行此操作?

首先,XML序列化程序不使用
[Serializable]


其次,没有办法使它成为必需的。

我认为您将XML与XSD混淆了。如果希望属性始终具有值,请在构造函数中初始化此属性,如果有人试图将其设置为空或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;
    }
   }
}

解决这个问题的最佳方法是使用一个单独的XSD,在将XML传递到
XmlSerializer
之前,使用它来验证XML。使用XSD和
XmlSerializer
最简单的方法是从XSD开始,并且。

如果属性为空或为null,则可以使用
XmlIgnoreAttribute
以及指定的
模式来引发异常。在序列化过程中,将检查
namesspecified
属性以确定是否应呈现该字段,因此如果名称属性保留为null或为空,将引发异常

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

              return true;
          }
    }
}
您可以使用以下选项:

[XmlElement(IsNullable = false)]

什么意思?您到底希望发生什么?-1:person类不可XML序列化,因为它没有公共的无参数构造函数。解决了这个问题,我将删除否决票。这不起作用。这种构造函数永远不会与序列化一起使用,因此也不会调用名称设置程序。如果从原始模型中省略名称属性,则永远不会设置名称属性。XmlSerializer未强制执行所需的规则。彼得·范金克尔的回答最接近于准确;但是,需要从模型中定义XSD(使其保持最新),并且需要对基于字符串的属性进行自定义,因为它们本质上是可以为空的。
Name
所讨论的是一个属性+
xmlementAttribute
的默认构造函数已经将IsNullable设置为false