Sérialisation/Désérialisation de Dates
Bonjour à tous,
J'ai un problème très curieux lorsque je sérialise/désérialise des objets de type Date avec XStream.
Ce problème se produit aléatoirement sur certaines dates. Après sérialisation/désérialisation, la date est différente de celle d'origine (!?!). Il y a un décalage de 3039 secs entre les 2 dates (systématique !)
Je l'ai constaté avec les dates suivantes :
-> 1900-06-02 00:00:00
-> 1910-06-02 00:00:00
Je pensais au départ que les dates étaient trop anciennes mais ce n'est pas le cas, puisque la date "1700-06-02 00:00:00" fonctionne correctement.
J'utilise Java 1.4.2 et XStream 1.2.2.
Voici mon code de test :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class Main2 {
public static Object chargerXML(String cheminFichier) throws IOException {
Object o = null;
XStream xstream = new XStream( new DomDriver( "ISO-8859-1" ) );
File file = new File(cheminFichier);
FileInputStream fis;
fis = new FileInputStream( file );
try {
o = xstream.fromXML(fis);
}
finally{
fis.close();
}
return o;
}
public static void serialiserXML(String cheminFichier, Object objetMetier) throws IOException {
XStream xstream = new XStream(new DomDriver( "ISO-8859-1" ));
File fichier = new File(cheminFichier);
if( ! fichier.exists() ) fichier.createNewFile();
FileOutputStream fos = new FileOutputStream(fichier);
try{
fos.write( "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>".getBytes() );
xstream.toXML(objetMetier, fos);
}
finally{
fos.close();
}
}
public static void main(String[] args) {
try{
Date date1;
Date date2;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date1 = dateFormat.parse( "1700-06-02 00:00:00" );
serialiserXML( "date1.xml" , date1 );
date2 = (Date) chargerXML( "date1.xml" );
System.out.println("Avant sérialisation/chargement : " + dateFormat.format( date1 ));
System.out.println("Après sérialisation/chargement : " + dateFormat.format( date2 ) );
System.out.println();
date1 = dateFormat.parse( "1900-06-02 00:00:00" );
serialiserXML( "date2.xml" , date1 );
date2 = (Date) chargerXML( "date2.xml" );
System.out.println("Avant sérialisation/chargement : " + dateFormat.format( date1 ));
System.out.println("Après sérialisation/chargement : " + dateFormat.format( date2 ) );
System.out.println();
date1 = dateFormat.parse( "1910-06-02 00:00:00" );
serialiserXML( "date3.xml" , date1 );
date2 = (Date) chargerXML( "date3.xml" );
System.out.println("Avant sérialisation/chargement : " + dateFormat.format( date1 ));
System.out.println("Après sérialisation/chargement : " + dateFormat.format( date2 ) );
System.out.println();
date1 = dateFormat.parse( "1950-06-14 09:00:00" );
serialiserXML( "date4.xml" , date1 );
date2 = (Date) chargerXML( "date4.xml" );
System.out.println("Avant sérialisation/chargement : " + dateFormat.format( date1 ));
System.out.println("Après sérialisation/chargement : " + dateFormat.format( date2 ) );
System.out.println();
}
catch( Throwable t ){
t.printStackTrace();
}
}
} |
Ce code affiche sur la sortie standard :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
Avant sérialisation/chargement : 1700-06-02 00:00:00
Après sérialisation/chargement : 1700-06-02 00:00:00
Avant sérialisation/chargement : 1900-06-02 00:00:00
Après sérialisation/chargement : 1900-06-01 23:09:21
Avant sérialisation/chargement : 1910-06-02 00:00:00
Après sérialisation/chargement : 1910-06-01 23:09:21
Avant sérialisation/chargement : 1950-06-14 09:00:00
Après sérialisation/chargement : 1950-06-14 09:00:00 |
A noter que les fichiers XML résultant de la date d'origine contiennent la bonne date. Par exemple, voici le contenu de date2.xml :
Code:
<?xml version="1.0" encoding="ISO-8859-1"?><date>1910-06-02 00:00:00.0 CET</date>
Ce problème intervient donc lors de la désérialisation.
Je ne comprends vraiment pas à quoi c'est dû...
D'où mes questions :
-> Est-ce que quelqu'un a déjà eu ce problème ?
-> Peut-on y faire quelque chose ou s'agit-t-il d'un bug de XStream ?
Merci d'avance pour vos réponses...