如果为null或为空,如何忽略序列化中的可空属性?

The*_*ght 2 c# xml asp.net serialization

我有一个用于Xml序列化的类.

在其中我有一个可以使用XmlAttribute修饰的可空属性:

 [XmlAttribute("lastUpdated")]
 public DateTime? LastUpdated { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果属性为null或为空,如何忽略序列化的属性?

我已经尝试过以下但是当有值时它不会序列化(总是忽略):

  [XmlIgnore]
        public DateTime? LastUpdatedValue { get; set; }

        [XmlAttribute("lastUpdated")]
       public DateTime LastUpdated { get; set; }

        public bool ShouldSerializeLastUpdated()
        {
            return LastUpdatedValue.HasValue;
        }
Run Code Online (Sandbox Code Playgroud)

bin*_*ard 10

XmlSerialization不直接支持Nullable.

如果要使用可为空的属性,则必须使用非可空属性,并添加具有相同名称的属性的布尔属性,后缀为"已指定",在属性必须可序列化时指定.

您的案例的一个例子:

    private DateTime? _lastUpdated;

    [XmlAttribute("lastUpdated")]
    public DateTime LastUpdated {
        get {
            return (DateTime)_lastUpdated;
        }
        set
        {
            _lastUpdated = value;
        }
    }

    public bool LastUpdatedSpecified
    {
        get
        {
            return _lastUpdated.HasValue;
        }
    }
Run Code Online (Sandbox Code Playgroud)


DDR*_*r62 5

我知道这个话题很老。这是我附带的解决方案。封装类型并隐式转换为类型的类。序列化时,成员变量可以标记为IsNullable = false,而不会出现编译器错误,并且在null时阻止其被序列化。

public class Optional<T> where T : struct, IComparable
{
    public Optional(T valueObject)
    {
        Value = valueObject;
    }

    public Optional()
    {
    }

    [XmlText]
    public T Value { get; set; }

    public static implicit operator T(Optional<T> objectToCast)
    {
        return objectToCast.Value;
    }

    public static implicit operator Optional<T>(T objectToCast)
    {
        return new Optional<T>(objectToCast);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在课堂上使用它

[Serializable]
[XmlRoot(ElementName = "foo")]
public class foo
{
   [XmlElement(ElementName = "myInteger", isNullable = false)]
   Optional<int> myInt;
}
Run Code Online (Sandbox Code Playgroud)

你可以做类似的事情

        myFoo.myInt = 7;
        int j = 8 + myFoo.myInt;
Run Code Online (Sandbox Code Playgroud)

出于所有目的,它都是一个int。出于序列化的目的,它可以为null并被阻止序列化。