Estoy tratando de serializar un TimeSpan
objeto .NET a XML y no funciona. Un rápido google ha sugerido que si bien TimeSpan
es serializable, XmlCustomFormatter
no proporciona métodos para convertirTimeSpan
objetos ay desde XML.
Un enfoque sugerido era ignorar la TimeSpan
serialización y, en su lugar, serializar el resultado de TimeSpan.Ticks
(y usarla new TimeSpan(ticks)
para la deserialización). Un ejemplo de esto sigue:
[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); }
}
}
Si bien esto parece funcionar en mis breves pruebas, ¿es esta la mejor manera de lograrlo?
¿Hay una mejor manera de serializar un TimeSpan hacia y desde XML?
c#
serialization
timespan
joeldixon66
fuente
fuente
Respuestas:
La forma en que ya ha publicado es probablemente la más limpia. Si no le gusta la propiedad adicional, puede implementarla
IXmlSerializable
, pero luego tiene que hacer todo , lo que en gran medida anula el punto. Me encantaría usar el enfoque que publicaste; es (por ejemplo) eficiente (sin análisis complejo, etc.), independiente de la cultura, inequívoco, y los números de tipo de marca de tiempo se entienden fácil y comúnmente.Como comentario aparte, a menudo agrego:
Esto solo lo oculta en la interfaz de usuario y en referencias dlls, para evitar confusiones.
fuente
Esta es solo una ligera modificación en el enfoque sugerido en la pregunta, pero este problema de Microsoft Connect recomienda usar una propiedad para la serialización como esta:
Esto serializaría un TimeSpan de 0:02:45 como:
Alternativamente, el
DataContractSerializer
soporte TimeSpan.fuente
Algo que puede funcionar en algunos casos es darle a su propiedad pública un campo de respaldo, que es un TimeSpan, pero la propiedad pública está expuesta como una cadena.
p.ej:
Esto está bien si el valor de la propiedad se usa principalmente con la clase que contiene o las clases heredadas y se carga desde la configuración xml.
Las otras soluciones propuestas son mejores si desea que la propiedad pública sea un valor TimeSpan utilizable para otras clases.
fuente
Combinando una respuesta de serialización de color y esta solución original (que es genial por sí misma) obtuve esta solución:
donde
XmlTimeSpan
clase es así:fuente
Puede crear un contenedor ligero alrededor de la estructura TimeSpan:
Resultado serializado de muestra:
fuente
Ticks
tiempo.Una opción más legible sería serializar como una cadena y usar el
TimeSpan.Parse
método para deserializarla. Podrías hacer lo mismo que en tu ejemplo pero usandoTimeSpan.ToString()
en el getter yTimeSpan.Parse(value)
en el setter.fuente
Otra opción sería serializarlo usando la
SoapFormatter
clase en lugar de laXmlSerializer
clase.El archivo XML resultante se ve un poco diferente ... algunas etiquetas con prefijo "SOAP", etc ... pero puede hacerlo.
Esto es lo que se
SoapFormatter
serializó en un intervalo de tiempo de 20 horas y 28 minutos serializado para:Para usar la clase SOAPFormatter, es necesario agregar referencias
System.Runtime.Serialization.Formatters.Soap
y usar el espacio de nombres del mismo nombre.fuente
Mi versión de la solución :)
Editar: suponiendo que es anulable ...
fuente
El intervalo de tiempo almacenado en xml como número de segundos, pero espero que sea fácil de adoptar. Intervalo de tiempo serializado manualmente (implementando IXmlSerializable):
Hay un ejemplo más completo: https://bitbucket.org/njkazakov/timespan-serialization
Mira Settings.cs. Y hay un código complicado para usar XmlElementAttribute.
fuente
Para la serialización del contrato de datos, uso lo siguiente.
fuente
Si no desea ninguna solución alternativa, use la clase DataContractSerializer de System.Runtime.Serialization.dll.
fuente
Prueba esto :
fuente