如何将TimeSpan序列化为XML

我在尝试将.NET TimeSpan对象序列化为XML,但它不起作用。 快速谷歌已经建议,尽管TimeSpan是可序列化的,但XmlCustomFormatter不提供将TimeSpan对象与XML进行转换的方法。

一种建议的方法是忽略用于序列化的TimeSpan ,而是序列化TimeSpan.Ticks的结果(并使用new TimeSpan(ticks)进行反序列化)。 下面是一个例子:

[Serializable]
public class MyClass
{
    // Local Variable
    private TimeSpan m_TimeSinceLastEvent;

    // Public Property - XmlIgnore as it doesn't serialize anyway
    [XmlIgnore]
    public TimeSpan TimeSinceLastEvent
    {
        get { return m_TimeSinceLastEvent; }
        set { m_TimeSinceLastEvent = value; }
    }

    // Pretend property for serialization
    [XmlElement("TimeSinceLastEvent")]
    public long TimeSinceLastEventTicks
    {
        get { return m_TimeSinceLastEvent.Ticks; }
        set { m_TimeSinceLastEvent = new TimeSpan(value); }
    }
}

虽然这似乎在我的简短测试中工作 - 这是实现这一目标的最佳方式吗?

有没有更好的方法来将TimeSpan序列化到XML中?


你已经发布的方式可能是最干净的。 如果你不喜欢额外的属性,你可以实现IXmlSerializable ,但是你必须做所有事情 ,这在很大程度上破坏了这一点。 我很乐意使用你发布的方法。 它是(例如)高效的(没有复杂的解析等),文化独立,毫不含糊,时间戳类型的数字很容易和通常被理解。

另外,我经常补充说:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]

这只是隐藏在UI和引用dll中,以避免混淆。


这只是对问题中建议的方法稍作修改,但此Microsoft Connect问题建议使用属性进行序列化,如下所示:

[XmlIgnore]
public TimeSpan TimeSinceLastEvent
{
    get { return m_TimeSinceLastEvent; }
    set { m_TimeSinceLastEvent = value; }
}

// XmlSerializer does not support TimeSpan, so use this property for 
// serialization instead.
[Browsable(false)]
[XmlElement(DataType="duration", ElementName="TimeSinceLastEvent")]
public string TimeSinceLastEventString
{
    get 
    { 
        return XmlConvert.ToString(TimeSinceLastEvent); 
    }
    set 
    { 
        TimeSinceLastEvent = string.IsNullOrEmpty(value) ?
            TimeSpan.Zero : XmlConvert.ToTimeSpan(value); 
    }
}

这会将0:02:45的TimeSpan序列化为:

<TimeSinceLastEvent>PT2M45S</TimeSinceLastEvent>

或者, DataContractSerializer支持TimeSpan。


某些可以在某些情况下工作的东西是为您的公共属性提供一个支持字段,即TimeSpan,但公共属性以字符串形式公开。

例如:

protected TimeSpan myTimeout;
public string MyTimeout 
{ 
    get { return myTimeout.ToString(); } 
    set { myTimeout = TimeSpan.Parse(value); }
}

如果属性值主要在包含的类或继承类中使用,并且从xml配置加载,则这是可以的。

如果您希望公有属性成为其他类的可用TimeSpan值,其他建议的解决方案会更好。

链接地址: http://www.djcxy.com/p/18497.html

上一篇: How to serialize a TimeSpan to XML

下一篇: How can I String.Format a TimeSpan object with a custom format in .NET?