Serialisation/deserialisation d'un arrayList retourne des objets vides
bonjour,
j'utilise la serialisation pour sauvegarder mes données, notament je serialize un arraylist comme ca :
Code:
1 2 3 4 5 6 7 8
|
ArrayList<FishObject> objects = null;
... affectation de objects ...
FileOutputStream fos = new FileOutputStream("monfichier");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(objects);
oos.flush();
oos.close(); |
FishObject est bien serialisable :
Code:
public class FishObject extends Object3D implements Comparable<FishObject>, Serializable{
et sauf erreur de ma part, apres un bon paquet de debug mon arrayList objects contient bien des données avant d'être sérialisé :(
Quand je recharche tout ca
Code:
1 2 3 4 5
|
fis = new FileInputStream("monfichier");
ois = new ObjectInputStream(fis);
objects = (ArrayList<FishObject>) ois.readObject();
ois.close(); |
mon arrayList objects est plein d'objets vides (attributs aux valeurs par défaut), il semble quand bien que le nombre d'objets est bon au moins
Alors là je vois pas ...
help
Info sur la sérialisation
Pour décourvrir les secrets de la sérialisation :
http://java.sun.com/developer/techni...serialization/
en gros, l'atribut SerialUID permet à ta classe d'être acceptée à tous les coups par le ObjectStream, mais tu prend le risque d'avoir un résultat incohérent, alors dans ce cas il vaut mieux redéfinir ta propre sérilization:
1. soit en surchargeant les méthodes:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
180 private void writeObject(ObjectOutputStream out) throws IOException
190 {
200 out.defaultWriteObject();
220 }
230 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
240 {
250 // our "pseudo-constructor"
260 in.defaultReadObject();
270 // now we are a "live" object again, so let's run rebuild and start
280 // autre traitement à toi
290
300 } |
2. soit en implémentant "Externalizable" ce qui te rend sérializable et te permet de créer ton propre mécanisme de séralisation.
Arpès, il faut bien gérer tes version: ajouter un N° de version d'enregistrement dans ta classe (je ne pense pas qu'on puisse utiliser directement le SerialUID, risque de plantage) , et avoir un bloc pour désérialiser chaque version pour maintenir la compatibilité ascendante.