1. ホーム
  2. c#

[解決済み】TimeSpanをXMLにシリアライズする方法

2022-04-11 18:31:32

質問

をシリアライズしようとしています。 TimeSpan オブジェクトをXMLに変換することができません。ググってみると TimeSpan はシリアライズ可能ですが XmlCustomFormatter を変換するメソッドは提供されません。 TimeSpan オブジェクトをXMLに変換したり、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); }
    }
}

私の簡単なテストではうまくいくように見えますが、これが最善の方法なのでしょうか?

XMLとの間でTimeSpanをシリアライズする、より良い方法はありますか?

どのように解決するのですか?

すでに投稿されている方法が一番きれいでしょう。余分なプロパティが嫌なら IXmlSerializable しかし、その場合 すべて というのは、ほとんど意味がありません。例えば、効率的で(複雑な解析などが不要)、文化に依存せず、曖昧さがなく、タイムスタンプ型の数値は簡単で一般的に理解されるからです。

余談ですが、私はよく付け加えます。

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

これは、混乱を避けるために、UIとDLLを参照する際にそれを隠すだけです。