J'essaie de sérialiser un TimeSpan
objet .NET en XML et cela ne fonctionne pas. Un rapide google a suggéré que bien qu'il TimeSpan
soit sérialisable, le XmlCustomFormatter
ne fournit pas de méthodes pour convertir des TimeSpan
objets vers et depuis XML.
Une approche suggérée consistait à ignorer le TimeSpan
pour la sérialisation, et à la place sérialiser le résultat de TimeSpan.Ticks
(et l'utiliser new TimeSpan(ticks)
pour la désérialisation). Un exemple de ceci suit:
[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); }
}
}
Bien que cela semble fonctionner dans mes brefs tests - est-ce la meilleure façon d'y parvenir?
Existe-t-il un meilleur moyen de sérialiser un TimeSpan vers et depuis XML?
c#
serialization
timespan
joeldixon66
la source
la source
Réponses:
La façon dont vous avez déjà posté est probablement la plus propre. Si vous n'aimez pas la propriété supplémentaire, vous pouvez l'implémenter
IXmlSerializable
, mais vous devez tout faire, ce qui vainc largement le point. J'utiliserais volontiers l'approche que vous avez publiée; il est (par exemple) efficace (pas d'analyse complexe, etc.), les nombres indépendants de la culture, sans ambiguïté et de type horodatage sont facilement et communément compris.En passant, j'ajoute souvent:
Cela le cache simplement dans l'interface utilisateur et dans les références aux DLL, pour éviter toute confusion.
la source
Il ne s'agit que d'une légère modification de l'approche suggérée dans la question, mais ce problème Microsoft Connect recommande d'utiliser une propriété de sérialisation comme celle-ci:
Cela sérialiserait un TimeSpan de 0:02:45 comme:
Alternativement, le
DataContractSerializer
prend en charge TimeSpan.la source
Quelque chose qui peut fonctionner dans certains cas est de donner à votre propriété publique un champ de support, qui est un TimeSpan, mais la propriété publique est exposée sous forme de chaîne.
par exemple:
C'est correct si la valeur de la propriété est utilisée principalement avec la classe contenante ou les classes héritées et est chargée à partir de la configuration xml.
Les autres solutions proposées sont meilleures si vous souhaitez que la propriété publique soit une valeur TimeSpan utilisable pour d'autres classes.
la source
En combinant une réponse de la sérialisation couleur et cette solution originale (qui est excellente en soi), j'ai obtenu cette solution:
où la
XmlTimeSpan
classe est comme ça:la source
Vous pouvez créer un wrapper léger autour de la structure TimeSpan:
Exemple de résultat sérialisé:
la source
Ticks
aussi longtemps.Une option plus lisible serait de sérialiser en tant que chaîne et d'utiliser la
TimeSpan.Parse
méthode pour la désérialiser. Vous pouvez faire la même chose que dans votre exemple mais en utilisantTimeSpan.ToString()
dans le getter etTimeSpan.Parse(value)
dans le setter.la source
Une autre option serait de le sérialiser en utilisant la
SoapFormatter
classe plutôt que leXmlSerializer
classe.Le fichier XML résultant semble un peu différent ... certaines balises préfixées "SOAP", etc ... mais il peut le faire.
Voici ce qui a
SoapFormatter
sérialisé un intervalle de temps de 20 heures et 28 minutes sérialisé à:Pour utiliser la classe SOAPFormatter, vous devez ajouter une référence
System.Runtime.Serialization.Formatters.Soap
et utiliser l'espace de noms du même nom.la source
Ma version de la solution :)
Edit: en supposant qu'il est nullable ...
la source
Timespan stocké en xml en nombre de secondes, mais il est facile à adopter, j'espère. Timespan sérialisé manuellement (implémentant IXmlSerializable):
Il existe un exemple plus complet: https://bitbucket.org/njkazakov/timespan-serialization
Regardez Settings.cs. Et il y a du code difficile à utiliser XmlElementAttribute.
la source
Pour la sérialisation des contrats de données, j'utilise ce qui suit.
la source
Si vous ne souhaitez aucune solution de contournement, utilisez la classe DataContractSerializer de System.Runtime.Serialization.dll.
la source
Essaye ça :
la source