Как сериализовать TimeSpan в XML - PullRequest
198 голосов
/ 12 марта 2009

Я пытаюсь сериализовать объект .NET TimeSpan в XML, и он не работает. Быстрый Google предположил, что, хотя 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?

Ответы [ 12 ]

0 голосов
/ 03 апреля 2012

Для сериализации контракта данных я использую следующее.

  • Сохранение закрытого сериализованного свойства обеспечивает чистоту открытого интерфейса.
  • Использование имени открытого свойства для сериализации обеспечивает чистоту XML.
Public Property Duration As TimeSpan

<DataMember(Name:="Duration")>
Private Property DurationString As String
    Get
        Return Duration.ToString
    End Get
    Set(value As String)
        Duration = TimeSpan.Parse(value)
    End Set
End Property
0 голосов
/ 09 марта 2012

Попробуйте это:

//Don't Serialize Time Span object.
        [XmlIgnore]
        public TimeSpan m_timeSpan;
//Instead serialize (long)Ticks and instantiate Timespan at time of deserialization.
        public long m_TimeSpanTicks
        {
            get { return m_timeSpan.Ticks; }
            set { m_timeSpan = new TimeSpan(value); }
        }
...