C# XmlSerializer和可空属性

C# XmlSerializer和可空属性,c#,.net,attributes,nullable,xmlserializer,C#,.net,Attributes,Nullable,Xmlserializer,我有一个类,它有许多可为空的属性,我想将这些属性序列化为XML属性。这显然是一个禁忌,因为它们被认为是“复杂类型”。因此,我实现了*指定模式,其中我创建了一个加法*值和*指定属性,如下所示: [XmlIgnore] public int? Age { get { return this.age; } set { this.age = value; } } [XmlAttribute("Age")] public int AgeValue { get { return t

我有一个类,它有许多可为空的属性,我想将这些属性序列化为XML属性。这显然是一个禁忌,因为它们被认为是“复杂类型”。因此,我实现了*指定模式,其中我创建了一个加法*值和*指定属性,如下所示:

[XmlIgnore] public int? Age { get { return this.age; } set { this.age = value; } } [XmlAttribute("Age")] public int AgeValue { get { return this.age.Value; } set { this.age = value; } } [XmlIgnore] public bool AgeValueSpecified { get { return this.age.HasValue; } } [XmlIgnore] 公共整数?年龄 { 获取{返回this.age;} 设置{this.age=value;} } [XmlAttribute(“年龄”)] 公共智力价值 { 获取{返回this.age.Value;} 设置{this.age=value;} } [XmlIgnore] 指定公共布尔值 { 获取{返回this.age.HasValue;} } 这很好-如果“Age”属性有一个值,它将被序列化为一个属性。如果它没有值,则不会序列化

问题是,正如我提到的,我的类中有很多可为null的-s,而这种模式只会使事情变得混乱和不可管理

我希望有一种方法可以使Nullable对XmlSerializer更友好。或者,如果做不到这一点,可以使用一种方法来创建一个可为空的替换

有人知道我该怎么做吗


谢谢。

在类上实现
IXmlSerializable
接口。然后,您可以在
ReadXML
WriteXML
方法中处理特殊情况,例如空值


我在处理一些代码时遇到了类似的问题,我决定对正在序列化和反序列化的属性使用字符串。我的结局是这样的:

[XmlAttribute("Age")]
public string Age
{
    get 
    { 
        if (this.age.HasValue)
            return this.age.Value.ToString(); 
        else
            return null;
    }
    set 
    { 
        if (value != null)
            this.age = int.Parse(value);
        else
            this.age = null;
    }
}

[XmlIgnore]
public int? age;

我想这是必须的-最好能告诉一个“复杂”类型序列化为属性。如果你有很多属性,但只有一个可空,这不是意味着手动序列化每个属性吗?有没有一种好方法可以只针对可为null的属性?@Curt答案中的Proxy属性可以做到这一点,但我认为必须存在属性装饰器?这仍然是可空属性的最佳解决方案吗?
[XmlAttribute("Age")]
public string Age
{
    get 
    { 
        if (this.age.HasValue)
            return this.age.Value.ToString(); 
        else
            return null;
    }
    set 
    { 
        if (value != null)
            this.age = int.Parse(value);
        else
            this.age = null;
    }
}

[XmlIgnore]
public int? age;