C#: TimeSpan serialisieren

Möchte man mit einer Klasse einen TimeSpan serialisieren, muss man sich eines kleinen Wrappers behelfen, da andernfalls der TimeSpan-Wert falsch serialisiert und so beim Deserialisieren mit “00:00:00” überschrieben wird. Das kann zu äußerst unangenehmen Nebeneffekten führen und mir ist es unbegreiflich warum TimeSpans nicht von Haus aus sauber serialisiert werden können.

Binde dazu das folgende struct in deine Klasse ein, die serialisiert werden soll:

 
        public struct TimeSpan : IXmlSerializable
        {
            private System.TimeSpan _value;

            public static implicit operator TimeSpan(System.TimeSpan value)
            {
                return new TimeSpan { _value = value };
            }

            public static implicit operator System.TimeSpan(TimeSpan value)
            {
                return value._value;
            }

            public XmlSchema GetSchema()
            {
                return null;
            }

            public void ReadXml(XmlReader reader)
            {
                _value = System.TimeSpan.Parse(reader.ReadElementContentAsString());
            }

            public void WriteXml(XmlWriter writer)
            {
                writer.WriteValue(_value.ToString());
            }
        }

Diese Wrapperklasse stammt ursprünglich hier her: , funktionierte allerdings nicht richtig bei mir, da der reader-Aufruf “ReadContentAsString()” eine Exception warf. Die obige Klasse funktioniert bei mir fehlerfrei, auch in Verbindung mit dem Entity Framework.

Und so schaut das ganze als serialisiertes XML aus:

    <ServiceRuntimeDefinitionService>
      <SerializedServiceRuntimeDefinition>
        <SeralizedServiceRuntimeDaysList />
        <Description />
        <RuntimeName>DummyRuntime</RuntimeName>
        <Start>13:00:00</Start>
        <End>14:00:00</End>
        <ToleranceStart>00:10:00</ToleranceStart>
        <ToleranceEnd>00:10:00</ToleranceEnd>
        <DefaultAVG>00:01:00</DefaultAVG>
        <Duration>2.08:29:35.2500000</Duration>
      </SerializedServiceRuntimeDefinition>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.