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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
<?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...