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 :
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
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(); } } }
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
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
Ce problème intervient donc lors de la désérialisation.
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>
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...
Partager