我正在尝试将 .NETTimeSpan对象序列化为 XML,但它不起作用。一个快速的谷歌建议虽然TimeSpan是可序列化的,XmlCustomFormatter但不提供将TimeSpan对象转换为 XML 和从 XML 转换的方法。
TimeSpan
XmlCustomFormatter
一种建议的方法是忽略TimeSpanfor 序列化,而是序列化TimeSpan.Ticks(并new TimeSpan(ticks)用于反序列化)的结果。这方面的一个例子如下:
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 序列化?
您已经发布的方式可能是最干净的。如果你不喜欢额外的属性,你可以实现IXmlSerializable,但是你必须做 所有事情 ,这在很大程度上违背了这一点。我很乐意使用您发布的方法;它是(例如)高效的(没有复杂的解析等),独立于文化的,明确的,并且时间戳类型的数字易于理解。
IXmlSerializable
顺便说一句,我经常补充:
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
这只是将它隐藏在 UI 和引用 dll 中,以避免混淆。