序列化一个可空的int

我有一个可空的int类? 数据类型设置为序列化为xml元素。 有没有什么办法来设置它,所以如果值为null,xml序列化程序将不会序列化元素?

我试着添加[System.Xml.Serialization.XmlElement(IsNullable = false)]属性,但我得到一个运行时序列化异常,说有一个错误反映了这个类型,因为“IsNullable可能不会被设置为'false '为Nullable类型,请考虑使用'System.Int32'类型或从XmlElement属性中删除IsNullable属性。“

[Serializable]
[System.Xml.Serialization.XmlRoot("Score", Namespace = "http://mycomp.com/test/score/v1")]
public class Score
{
    private int? iID_m;
    ...

    /// <summary>
    /// 
    /// </summary>        
    public int? ID 
    { 
        get 
        { 
            return iID_m; 
        } 
        set 
        { 
            iID_m = value; 
        } 
    }
     ...
}

上面的类将会序列化为:

<Score xmlns="http://mycomp.com/test/score/v1">
    <ID xsi:nil="true" />
</Score>

但对于空ID,我根本不需要ID元素,主要是因为当我在MSSQL中使用OPENXML时,对于看起来像的元素,它返回0而不是null


XmlSerializer支持ShouldSerialize{Foo}()模式,所以你可以添加一个方法:

public bool ShouldSerializeID() {return ID.HasValue;}

还有{Foo}Specified模式 - 不确定XmlSerializer是否支持该模式。


我正在使用这种微型模式来实现Nullable序列化:

[XmlIgnore]
public double? SomeValue { get; set; }

[XmlAttribute("SomeValue")] // or [XmlElement("SomeValue")]
[EditorBrowsable(EditorBrowsableState.Never)]
public double XmlSomeValue { get { return SomeValue.Value; } set { SomeValue= value; } }  
[EditorBrowsable(EditorBrowsableState.Never)]
public bool XmlSomeValueSpecified { get { return SomeValue.HasValue; } }

这为用户提供了正确的界面,并且在串行化时仍然是正确的。


我想出了一个利用两个属性的解决方法。 一个int? 属性与一个XmlIgnore属性和一个被序列化的对象属性。

    /// <summary>
    /// Score db record
    /// </summary>        
    [System.Xml.Serialization.XmlIgnore()]
    public int? ID 
    { 
        get 
        { 
            return iID_m; 
        } 
        set 
        { 
            iID_m = value; 
        } 
    }

    /// <summary>
    /// Score db record
    /// </summary>        
    [System.Xml.Serialization.XmlElement("ID",IsNullable = false)]
    public object IDValue
    {
        get
        {
            return ID;
        }
        set
        {
            if (value == null)
            {
                ID = null;
            }
            else if (value is int || value is int?)
            {
                ID = (int)value;
            }
            else
            {
                ID = int.Parse(value.ToString());
            }
        }
    }
链接地址: http://www.djcxy.com/p/65131.html

上一篇: Serialize a nullable int

下一篇: Exactly when NSOperation is removed from NSOperationQueue on cancelling request?