bon, rapide récapitulatif du probleme :
J'ai un objet qui contient une HashMap.
Je sérialise cet objet. Je le récupere par désérialisation. Je le resérialise, et dans certains cas, le résultat de la sérialisation est différent, suivant la version de la jvm semble-t'il.
Le code qui montre le probleme :
L'objet sérialisé : CalendarAction
Le programme de test :
Code :
- import java.io.*;
-
- public class TestSerialisation
- {
- public static void main(String [] args)
- throws Exception
- {
- test("end" );
- test("endTime" );
- test("plop" );
- }
-
- private static void test(String hashKey)
- throws Exception
- {
- //creation d'un objet
- CalendarAction ca = new CalendarAction(CalendarAction.GET_EVENTS_FOR_USER);
- ca.set("user", "toto" );
- ca.set("showAll", new Boolean(false));
- ca.set("start", new Long(1919));
- ca.set(hashKey, new Long(93943)); //seule cette clef varie
-
-
- //fichiers de stockage qu'on va comparer
- String origine = "/tmp/test_" +hashKey +"_.1";
- String copie = "/tmp/test_" +hashKey +"_.2";
-
- //premiere serialization
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(origine));
- oos.writeObject(ca);
- oos.close();
-
- //recuperation d'une copie par deserialization
- ObjectInputStream ois = new ObjectInputStream(new FileInputStream(origine));
- CalendarAction caCopy = (CalendarAction)ois.readObject();
- ois.close();
-
- //serialization de la copie
- ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream(copie));
- oos2.writeObject(caCopy);
- oos2.close();
- }
- }
|
Ce que ca donne :
vincent@laptop:/tmp$ diff test_end_*
vincent@laptop:/tmp$ diff test_endTime_*
Les fichiers binaires test_endTime_.1 et test_endTime_.2 sont différents.
vincent@laptop:/tmp$ diff test_plop_*
vincent@laptop:/tmp$ |
avec un jdk1.4.2 ou 1.4.1, ca merde bien avec "endTime" en clef de la HashMap.
avec un jdk1.4.0 par contre, ca marche avec "endTime" mais ca plante avec "end".
Quelqu'un a une idée ?