gpt4 book ai didi

c# - 如何将 TimeSpan 序列化为 XML

转载 作者:IT王子 更新时间:2023-10-29 03:29:44 26 4
gpt4 key购买 nike

我正在尝试将 .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 或从 XML 序列化?

最佳答案

这只是对问题中建议的方法稍作修改,但是 this Microsoft Connect issue建议使用这样的属性进行序列化:

[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。

关于c# - 如何将 TimeSpan 序列化为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com