Serialização / Desserialização de java.util.Date

4 respostas
5leipn1r

Olá pessoal, espero que vocês possam me ajudar com esse problemão que eu encontrei.
Estou tendo um problema com serialização / desserialização de data que pode ser simulado e compreendido com os passos a seguir:

Crio e instancio um novo objeto java.util.Date

Date data = new Date();

Que irá instanciar a data atual. Por exemplo 06/05/2009 - 09:00 GMT -03:00

Quando eu serializo este objeto, apenas o fastTime do objeto Date é serializado, e este não contém a informação do timezone.

Quando eu desserializo, ele verifica que não existe uma informacão válida no cdate do objeto date e cria um novo, com o timezone default. Então, se eu desserializo este objeto date em uma máquina onde o timezone é diferente do original, por exemplo GMT -02:00 o valor da data é alterado (06/05/2009 - 10:00 GMT -02:00)

Como o timezone original não é serializado juntamente com a data eu não tenho como saber a constituição original dessa data.

Este problema ocorre tanto na serialização com ObjectOutputStream do proprio java quanto com a serialização de RPC do GWT.
No primeiro caso, eu acredito que criando uma classe que extenda date, e através de reflection recriando a maioria dos métodos originais do date seja possivel uma solução, mas o GWT não permite reflection.

Acredito que uma outra possivel solução seria criar uma classe que estenda Date, e armazene em inteiros os valores de dia, mes, ano , hora, minuto, segundo e timezone e quando serializado/desserializado reconstrua um novo objeto date. Mas existem dois poréns. O primeiro é que fica com cara de “gambi” e o segundo é que no GWT, quando se está no “lado client” você não consegue criar um objeto date especificando o timezone qe você deseja como pode ser feito no lado server com TimeZone.setDefault(TimeZone.get(“GMT -03:00”)) e instanciando um new date logo abaixo disso por exemplo.

Sendo assim eu preciso de outra solução.

Alguém já passou por isso e/ou tem alguma sugestão ?

Agradecido desde já.

4 Respostas

T

Uai, mas 06/05/2009 09:00 GMT -03:00 é o mesmo instante no tempo que 06/05/2009 10:00 GMT -02:00, não?

Não entendi seu problema.

B

Ola,

Este problema ocorre tipicamente quando estamos em horário de verão… dai sofremos com ele aqui.

A questão é, o date não guarda o timezone de criação, para vc resolver este problema vc tem que trabalhar com o Calendar, este armazena o timezone, só que se vc fizer um getTime() no calendar, ele irá usar o itmezone da maquina.

Marky.Vasconcelos

Cara… esqueçe o Date… use o Calendar ou então o http://joda-time.sourceforge.net/

5leipn1r

Eu sei que ambas as representações são referentes ao mesmo instante, porém ao se fazer um toString do objeto date, eu preciso que seja exibido com o timezone original.
Eu não posso usar Calendar pois o calendar não é valido no lado Client do GWT.

Mais alguma sugestão?

Criado 6 de maio de 2009
Ultima resposta 6 de mai. de 2009
Respostas 4
Participantes 4