je me sers de la sérialisation pour dupliquer des objets complexes ;
or je m'aperçois que les références sont perdues (ce qui est sûrement
inhérent au processus de sérialisation).
y-a-t'il un moyen cependant de conserver dans certains cas ces références ?
je prends l'exemple simple suivant où je sérialise un vecteur d'objet
(de type Test); je voudrais que les références des objets contenues
dans le nouveau vecteur ne change pas ; au départ je crée un objet test
avec _val égal à 0 puis je duplique le vecteur (duplication); un nouveau
vecteur est créé contenant un objet de type Test ; je modifie alors la
_val dans l'objet test de départ,
mais cette modification n'est pas répercutée dans le nouvel objet
(dupliqué) qui contient toujours la valeur 0 !
public class TestSerialisation implements Serializable {
private final static long serialVersionUID = 1L;
public TestSerialisation(){
try {
Vector v = new Vector();
Test test=new Test(0);
v.addElement(test);
// duplication du vecteur
Vector vduplique=(Vector)duplication(v);
// modification de _val dans l'objet test
((Test)v.get(0)).setVal(1);
System.out.println("new val = "+((Test)vduplique.get(0)).getVal());
// affichage de la valeur 0 au lieu de 1 !
} catch (Exception e) {
e.printStackTrace();
}
}
public Object duplication(Object object) throws IOException,
ClassNotFoundException {
// Serialize the Object into a byte[]
ByteArrayOutputStream pos = new ByteArrayOutputStream();
ObjectOutputStream objOutfact = new ObjectOutputStream(pos);
objOutfact.writeObject(object);
objOutfact.flush();
objOutfact.close();
// De-Serialize the byte[] into en Object
byte[] fooBytes = pos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream( fooBytes );
ObjectInputStream ois = new ObjectInputStream( bais );
ois.close();
return ois.readObject();
}
class Test implements java.io.Serializable{
private final static long serialVersionUID = 1L;
private int _val;
Test(int i) {
_val=i;
}
void setVal(int i) {
_val=i;
}
int getVal() {
return _val;
}
}
public static void main(String [] args) throws Exception {
new TestSerialisation();
}
}
cependant je ne comprend pas pourquoi le fait de sérialiser un vecteur modifie la valeur des objets qu'il contient, (chacun de ces objets étant une référence) ????
La serialisation prend en compte tous les objets référencé, et les
objets référencés aux objets référencés, etc. Pour ne pas sérialiser un objet il faut qu'il soit déclaré comme transient
Olivier
cependant je ne comprend pas pourquoi le fait de sérialiser
un vecteur modifie la valeur des objets qu'il contient,
(chacun de ces objets étant une référence) ????
La serialisation prend en compte tous les objets référencé, et les
objets référencés aux objets référencés, etc. Pour ne pas sérialiser un
objet il faut qu'il soit déclaré comme transient
cependant je ne comprend pas pourquoi le fait de sérialiser un vecteur modifie la valeur des objets qu'il contient, (chacun de ces objets étant une référence) ????
La serialisation prend en compte tous les objets référencé, et les
objets référencés aux objets référencés, etc. Pour ne pas sérialiser un objet il faut qu'il soit déclaré comme transient
Olivier
Jean-Marie
alors il n'y a pas de solution puisque j'ai en fait besoin de créer un nouveau vecteur avec des références identiques au vecteur d'origine, et je pensais pour cela surcharger les méthodes writeObject et readObject pour obtenir le résultat voulu
jean-Marie
cependant je ne comprend pas pourquoi le fait de sérialiser un vecteur modifie la valeur des objets qu'il contient, (chacun de ces objets étant une référence) ????
La serialisation prend en compte tous les objets référencé, et les
objets référencés aux objets référencés, etc. Pour ne pas sérialiser un objet il faut qu'il soit déclaré comme transient
Olivier
alors il n'y a pas de solution puisque j'ai en fait besoin de créer
un nouveau vecteur avec des références identiques au vecteur d'origine,
et je pensais pour cela surcharger les méthodes
writeObject et readObject pour obtenir le résultat voulu
jean-Marie
cependant je ne comprend pas pourquoi le fait de sérialiser
un vecteur modifie la valeur des objets qu'il contient,
(chacun de ces objets étant une référence) ????
La serialisation prend en compte tous les objets référencé, et les
objets référencés aux objets référencés, etc. Pour ne pas sérialiser un
objet il faut qu'il soit déclaré comme transient
alors il n'y a pas de solution puisque j'ai en fait besoin de créer un nouveau vecteur avec des références identiques au vecteur d'origine, et je pensais pour cela surcharger les méthodes writeObject et readObject pour obtenir le résultat voulu
jean-Marie
cependant je ne comprend pas pourquoi le fait de sérialiser un vecteur modifie la valeur des objets qu'il contient, (chacun de ces objets étant une référence) ????
La serialisation prend en compte tous les objets référencé, et les
objets référencés aux objets référencés, etc. Pour ne pas sérialiser un objet il faut qu'il soit déclaré comme transient
Olivier
Jean-Marie
Bonjour
tout à fait d'accord avec vous lorsqu'on est au début du chemin, ce qui n'est pas mon cas ; et comme il s'agit d'un cas particulier dans l'ensemble de l'application il est préférable de gérer ce cas particulier
JM
Bonjour,
Pas toujours suffisant ?!? Pouvez-vous précisez ?
Lorsqu'on a prit un mauvais chemin, il est parfois plus prudent et sage d'en changer ;-)
A+ TM
Bonjour
tout à fait d'accord avec vous lorsqu'on est au début du chemin,
ce qui n'est pas mon cas ; et comme il s'agit d'un cas particulier
dans l'ensemble de l'application il est préférable de gérer ce cas
particulier
JM
Bonjour,
Pas toujours suffisant ?!? Pouvez-vous précisez ?
Lorsqu'on a prit un mauvais chemin, il est parfois plus prudent et sage
d'en changer ;-)
tout à fait d'accord avec vous lorsqu'on est au début du chemin, ce qui n'est pas mon cas ; et comme il s'agit d'un cas particulier dans l'ensemble de l'application il est préférable de gérer ce cas particulier
JM
Bonjour,
Pas toujours suffisant ?!? Pouvez-vous précisez ?
Lorsqu'on a prit un mauvais chemin, il est parfois plus prudent et sage d'en changer ;-)
A+ TM
ownowl
alors il n'y a pas de solution puisque j'ai en fait besoin de créer un nouveau vecteur avec des références identiques au vecteur d'origine, et je pensais pour cela surcharger les méthodes writeObject et readObject pour obtenir le résultat voulu
si tu fait un clone sur le vecteur, tu auras exactement le résultat voulu (si j'ai bien compris) , à savoir que les référence des objets du vecteur original et du vecteur cloné seront les même. quand tu clone un vecteur seul l'enveloppe (le vecteur) et les références sont clonés, pas le contenu.
de plus du point de vue performance entre les deux méthodes, il n'y a pas photo Oliver
alors il n'y a pas de solution puisque j'ai en fait besoin de créer
un nouveau vecteur avec des références identiques au vecteur d'origine,
et je pensais pour cela surcharger les méthodes
writeObject et readObject pour obtenir le résultat voulu
si tu fait un clone sur le vecteur, tu auras exactement le résultat
voulu (si j'ai bien compris) , à savoir que les référence des objets du
vecteur original et du vecteur cloné seront les même. quand tu clone un
vecteur seul l'enveloppe (le vecteur) et les références sont clonés, pas
le contenu.
de plus du point de vue performance entre les deux méthodes, il n'y a
pas photo
Oliver
alors il n'y a pas de solution puisque j'ai en fait besoin de créer un nouveau vecteur avec des références identiques au vecteur d'origine, et je pensais pour cela surcharger les méthodes writeObject et readObject pour obtenir le résultat voulu
si tu fait un clone sur le vecteur, tu auras exactement le résultat voulu (si j'ai bien compris) , à savoir que les référence des objets du vecteur original et du vecteur cloné seront les même. quand tu clone un vecteur seul l'enveloppe (le vecteur) et les références sont clonés, pas le contenu.
de plus du point de vue performance entre les deux méthodes, il n'y a pas photo Oliver