Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conserver des références lors de la sérialisation

14 réponses
Avatar
Jean-Marie
bonjour

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 !

y-a-t'il un moyen de conserver la référence

merci d'avance

Jean-Marie

-----------------------------------------------------------------------

import java.io.*;
import java.util.Vector;

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();
}
}

4 réponses

1 2
Avatar
ownowl
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

Avatar
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



Avatar
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


Avatar
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

1 2