probleme de sérialisation

probleme de sérialisation - Java - Programmation

Marsh Posté le 29-01-2004 à 20:47:55    

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 :
  1. import java.io.*;
  2.  
  3.   public class TestSerialisation
  4.   {
  5.      public static void main(String [] args)
  6.      throws Exception
  7.      {
  8.         test("end" );
  9.         test("endTime" );
  10.         test("plop" );
  11.      }
  12.      
  13.      private static void test(String hashKey)
  14.      throws Exception
  15.      { 
  16.         //creation d'un objet
  17.         CalendarAction ca = new CalendarAction(CalendarAction.GET_EVENTS_FOR_USER);
  18.         ca.set("user", "toto" );
  19.         ca.set("showAll", new Boolean(false));
  20.         ca.set("start", new Long(1919));
  21.         ca.set(hashKey, new Long(93943)); //seule cette clef varie
  22.        
  23.    
  24.         //fichiers de stockage qu'on va comparer  
  25.         String origine = "/tmp/test_" +hashKey +"_.1";
  26.         String copie = "/tmp/test_" +hashKey +"_.2";
  27.        
  28.         //premiere serialization
  29.         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(origine));
  30.         oos.writeObject(ca);
  31.         oos.close(); 
  32.      
  33.         //recuperation d'une copie par deserialization
  34.         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(origine));
  35.         CalendarAction caCopy = (CalendarAction)ois.readObject();
  36.         ois.close();
  37.        
  38.         //serialization de la copie
  39.         ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream(copie));
  40.         oos2.writeObject(caCopy);
  41.         oos2.close();   
  42.      }
  43.   }


 
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 ?

Reply

Marsh Posté le 29-01-2004 à 20:47:55   

Reply

Marsh Posté le 29-01-2004 à 21:37:52    

ton test de tout à l'heure est tjs valide? (flemme de faire un copier/coller) ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-01-2004 à 21:40:10    

sur mon bsd ça bloque apres "generatin keypair" [:zebra33]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-01-2004 à 21:59:14    

the real moins moins a écrit :

ton test de tout à l'heure est tjs valide? (flemme de faire un copier/coller) ?


oui mais il fait des choses inutiles (la signature)


Message édité par lorill le 29-01-2004 à 21:59:28
Reply

Marsh Posté le 29-01-2004 à 22:00:14    

the real moins moins a écrit :

sur mon bsd ça bloque apres "generatin keypair" [:zebra33]


alors copie/colle cet exemple :o

Reply

Marsh Posté le 29-01-2004 à 22:11:08    


-bash-2.05b$ java -version
java version "1.4.1-p3"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-p3-root_26_jun_2003_04_44)
Java HotSpot(TM) Client VM (build 1.4.1-p3-root_26_jun_2003_04_44, mixed mode)
-bash-2.05b$ java TestSerialisation
-bash-2.05b$ diff /tmp/test_end_*
-bash-2.05b$ diff /tmp/test_endTime_.*
Binary files /tmp/test_endTime_.1 and /tmp/test_endTime_.2 differ
-bash-2.05b$


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 30-01-2004 à 08:13:17    

the real moins moins a écrit :


-bash-2.05b$ java -version
java version "1.4.1-p3"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-p3-root_26_jun_2003_04_44)
Java HotSpot(TM) Client VM (build 1.4.1-p3-root_26_jun_2003_04_44, mixed mode)
-bash-2.05b$ java TestSerialisation
-bash-2.05b$ diff /tmp/test_end_*
-bash-2.05b$ diff /tmp/test_endTime_.*
Binary files /tmp/test_endTime_.1 and /tmp/test_endTime_.2 differ
-bash-2.05b$




merci, mais j'ai bien vu qu'avec une jvm>=1.4.1 ca donne ca.
la question, c'est pourquoi ? ou est l'erreur ?

Reply

Marsh Posté le 30-01-2004 à 08:38:41    

bon, j'ai trouver comment le contourner, mais ca m'intrigue quand même...

Reply

Marsh Posté le 30-01-2004 à 13:09:21    

lorill a écrit :

bon, j'ai trouver comment le contourner, mais ca m'intrigue quand même...

comment ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 30-01-2004 à 13:28:15    


mon soucis a la base c'est de signer ce qui est envoyé, pour m'assurer que c'est bien la personne déclarée comme emetteur qui envoie.
 
la, je serialisait l'objet et je signait les octets résultats. Vu que visiblement 2 sérialisations d'un objet identique ne me garantissent pas les mêmes octets, je ne fais plus la signature sur les octets de l'objet sérialisés, mais sur le résultat d'une méthode de mes objets.
 
voila.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed