Estou tentando serializar um TimeSpan
objeto .NET para XML e ele não está funcionando. Um google rápido sugeriu que, embora TimeSpan
seja serializável, o XmlCustomFormatter
não fornece métodos para converter TimeSpan
objetos de e para XML.
Uma abordagem sugerida foi ignorar a TimeSpan
serialização e, em vez disso, serializar o resultado de TimeSpan.Ticks
(e usar new TimeSpan(ticks)
para desserialização). Um exemplo disso é o seguinte:
[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); }
}
}
Embora isso pareça funcionar nos meus breves testes - esta é a melhor maneira de conseguir isso?
Existe uma maneira melhor de serializar um TimeSpan de e para XML?
c#
serialization
timespan
joeldixon66
fonte
fonte
Respostas:
A maneira como você já postou é provavelmente a mais limpa. Se você não gosta da propriedade extra, pode implementar
IXmlSerializable
, mas precisa fazer tudo , o que derrota amplamente o argumento. Eu ficaria feliz em usar a abordagem que você postou; é (por exemplo) eficiente (sem análise complexa, etc.), números independentes de cultura, inequívocos e do tipo de carimbo de data e hora são fácil e comumente entendidos.Como um aparte, costumo acrescentar:
Isso apenas oculta na interface do usuário e nas dlls de referência, para evitar confusão.
fonte
Essa é apenas uma pequena modificação na abordagem sugerida na pergunta, mas esse problema do Microsoft Connect recomenda o uso de uma propriedade para serialização como esta:
Isso serializaria um TimeSpan de 0:02:45 como:
Como alternativa, o
DataContractSerializer
TimeSpan suporta.fonte
Algo que pode funcionar em alguns casos é dar à sua propriedade pública um campo de apoio, que é um TimeSpan, mas a propriedade pública é exposta como uma sequência.
por exemplo:
Isso está ok se o valor da propriedade for usado principalmente com a classe que contém ou herdar classes e for carregado a partir da configuração xml.
As outras soluções propostas são melhores se você deseja que a propriedade pública seja um valor TimeSpan utilizável para outras classes.
fonte
Combinando uma resposta da serialização de cores e esta solução original (que é ótima por si só), obtive esta solução:
onde
XmlTimeSpan
classe é assim:fonte
Você pode criar um invólucro leve em torno da estrutura do TimeSpan:
Exemplo de resultado serializado:
fonte
Ticks
tempo.Uma opção mais legível seria serializar como uma string e usar o
TimeSpan.Parse
método para desserializá-la. Você pode fazer o mesmo que no seu exemplo, mas usandoTimeSpan.ToString()
no getter eTimeSpan.Parse(value)
no setter.fonte
Outra opção seria serializá-lo usando o
SoapFormatter
classe e não oXmlSerializer
classe.O arquivo XML resultante parece um pouco diferente ... algumas tags com prefixo "SOAP", etc ... mas pode fazê-lo.
Aqui está o que
SoapFormatter
serializou um período de 20 horas e 28 minutos para:Para usar a classe SOAPFormatter, é necessário adicionar referência
System.Runtime.Serialization.Formatters.Soap
e usar o espaço para nome com o mesmo nome.fonte
Minha versão da solução :)
Edit: assumindo que é anulável ...
fonte
Período de tempo armazenado em xml como número de segundos, mas é fácil de adotar, espero. Timespan serializado manualmente (implementando IXmlSerializable):
Há um exemplo mais abrangente: https://bitbucket.org/njkazakov/timespan-serialization
Veja Settings.cs. E há algum código complicado para usar XmlElementAttribute.
fonte
Para serialização de contrato de dados, uso o seguinte.
fonte
Se você não deseja nenhuma solução alternativa, use a classe DataContractSerializer do System.Runtime.Serialization.dll.
fonte
Tente o seguinte:
fonte