Ich versuche, ein .NET- TimeSpan
Objekt in XML zu serialisieren , und es funktioniert nicht. Eine schnelle Google hat vorgeschlagen, dass es zwar TimeSpan
serialisierbar ist, XmlCustomFormatter
aber keine Methoden zum Konvertieren von TimeSpan
Objekten in und aus XML bietet .
Ein vorgeschlagener Ansatz bestand darin, das TimeSpan
für die Serialisierung zu ignorieren und stattdessen das Ergebnis von TimeSpan.Ticks
(und die Verwendung new TimeSpan(ticks)
für die Deserialisierung) zu serialisieren . Ein Beispiel hierfür folgt:
[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); }
}
}
Während dies in meinen kurzen Tests zu funktionieren scheint - ist dies der beste Weg, um dies zu erreichen?
Gibt es eine bessere Möglichkeit, eine TimeSpan von und nach XML zu serialisieren?
c#
serialization
timespan
joeldixon66
quelle
quelle
Antworten:
Die Art und Weise, wie Sie bereits gepostet haben, ist wahrscheinlich die sauberste. Wenn Ihnen die zusätzliche Eigenschaft nicht gefällt, können Sie sie implementieren
IXmlSerializable
, aber dann müssen Sie alles tun , was den Punkt weitgehend zunichte macht. Ich würde gerne den Ansatz verwenden, den Sie veröffentlicht haben. Es ist (zum Beispiel) effizient (kein komplexes Parsen usw.), kulturunabhängige, eindeutige und zeitstempelartige Zahlen sind leicht und allgemein zu verstehen.Nebenbei füge ich oft hinzu:
Dies verbirgt es nur in der Benutzeroberfläche und beim Verweisen auf DLLs, um Verwirrung zu vermeiden.
quelle
Dies ist nur eine geringfügige Änderung des in der Frage vorgeschlagenen Ansatzes. In diesem Microsoft Connect-Problem wird jedoch empfohlen, eine Eigenschaft für die Serialisierung wie folgt zu verwenden:
Dies würde eine Zeitspanne von 0:02:45 serialisieren als:
Alternativ
DataContractSerializer
unterstützt das TimeSpan.quelle
In einigen Fällen kann dies funktionieren, indem Sie Ihrer öffentlichen Eigenschaft ein Hintergrundfeld zuweisen, bei dem es sich um eine Zeitspanne handelt. Die öffentliche Eigenschaft wird jedoch als Zeichenfolge angezeigt.
z.B:
Dies ist in Ordnung, wenn der Eigenschaftswert hauptsächlich in der enthaltenden Klasse oder in den ererbenden Klassen verwendet und aus der XML-Konfiguration geladen wird.
Die anderen vorgeschlagenen Lösungen sind besser, wenn die öffentliche Eigenschaft ein verwendbarer TimeSpan-Wert für andere Klassen sein soll.
quelle
Durch die Kombination einer Antwort aus der Farbserialisierung und dieser ursprünglichen Lösung (die für sich genommen großartig ist) habe ich folgende Lösung erhalten:
wo
XmlTimeSpan
Klasse so ist:quelle
Sie können einen Light Wrapper um die TimeSpan-Struktur erstellen:
Beispiel für ein serialisiertes Ergebnis:
quelle
Ticks
so lange.Eine besser lesbare Option wäre, als Zeichenfolge zu serialisieren und die
TimeSpan.Parse
Methode zum Deserialisieren zu verwenden. Sie können das Gleiche wie in Ihrem Beispiel tun, jedochTimeSpan.ToString()
im Getter undTimeSpan.Parse(value)
im Setter verwenden.quelle
Eine andere Möglichkeit wäre, es mit der
SoapFormatter
Klasse und nicht mit der zu serialisierenXmlSerializer
Klasse .Die resultierende XML-Datei sieht etwas anders aus ... einige "SOAP" -präfixierte Tags usw. ... aber sie kann es.
Hier ist , was
SoapFormatter
eine Zeitspanne von 20 Stunden serialisiert und 28 Minuten serialisiert:Um die SOAPFormatter-Klasse zu verwenden, müssen Sie einen Verweis auf
System.Runtime.Serialization.Formatters.Soap
den gleichnamigen Namespace hinzufügen und diesen verwenden.quelle
Meine Version der Lösung :)
Bearbeiten: vorausgesetzt, es ist nullbar ...
quelle
Zeitspanne in XML als Anzahl von Sekunden gespeichert, aber es ist einfach zu übernehmen, hoffe ich. Manuell serialisierte Zeitspanne (Implementierung von IXmlSerializable):
Es gibt ein umfassenderes Beispiel: https://bitbucket.org/njkazakov/timespan-serialization
Schauen Sie sich Settings.cs an. Und es gibt einen kniffligen Code, um XmlElementAttribute zu verwenden.
quelle
Für die Serialisierung von Datenverträgen verwende ich Folgendes.
quelle
Wenn Sie keine Problemumgehungen wünschen, verwenden Sie die DataContractSerializer-Klasse aus System.Runtime.Serialization.dll.
quelle
Versuche dies :
quelle