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

10 réponses

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


Bonjour,

Question "stupide": Si votre objectif est de dupliquer des objets,
pourquoi n'utilisez vous le .clone(), qui lui vous permetra de
configurer exactement ce que vous souhaitez cloner ?

Si celà ne correspond pas à vos besoins, il va faloir nous en dire plus ;-)

A+
TM

Avatar
Jean-Marie
parce-qu'il me faut implémenter la fonction clone()
pour chaque classe !

JM

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


Bonjour,

Question "stupide": Si votre objectif est de dupliquer des objets,
pourquoi n'utilisez vous le .clone(), qui lui vous permetra de
configurer exactement ce que vous souhaitez cloner ?

Si celà ne correspond pas à vos besoins, il va faloir nous en dire plus ;-)

A+
TM



Avatar
TestMan
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


Bonjour,

Question "stupide": Si votre objectif est de dupliquer des objets,
pourquoi n'utilisez vous le .clone(), qui lui vous permetra de
configurer exactement ce que vous souhaitez cloner ?

Si celà ne correspond pas à vos besoins, il va faloir nous en dire
plus ;-)


parce-qu'il me faut implémenter la fonction clone()
pour chaque classe !

JM

Bonjour,


Implementation de Serializable ou implementation de Clonable et
surcharge de méthode .clone() avec simple appel du super.clone()... dans
tous les cas votre vesoin va nécessiter une modification dans chaque
classe à cloner...

A+
TM



Avatar
Jean-Marie
d'après ce que j'ai pu lire, le super.clone() n'est pas toujours
suffisant...
de toute façon j'ai pris une autre direction avec la sérialization
qui est rapide d'un point de vue codage
mais il y a des pièges à éviter comme j'ai pu le constater si
par exemple on veut conserver certaines références comme dans l'exemple
que j'ai donné

JM

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


Bonjour,

Question "stupide": Si votre objectif est de dupliquer des objets,
pourquoi n'utilisez vous le .clone(), qui lui vous permetra de
configurer exactement ce que vous souhaitez cloner ?

Si celà ne correspond pas à vos besoins, il va faloir nous en dire
plus ;-)


parce-qu'il me faut implémenter la fonction clone()
pour chaque classe !

JM

Bonjour,


Implementation de Serializable ou implementation de Clonable et
surcharge de méthode .clone() avec simple appel du super.clone()... dans
tous les cas votre vesoin va nécessiter une modification dans chaque
classe à cloner...

A+
TM





Avatar
Fifan31
C'est sûr que pour enfoncer un clou, on peut frapper avec le poing !
Mais avec un marteau c'est quand même plus approprié !

Donc, si tu veux dupliquer tes objets, tu devrais utiliser le
clonage... qui n'est pas si difficile que ça à mettre en oeuvre.
D'autant qu'avec la sérialisation, tu peux engendrer des pb que tu
n'aurais pas eu comme un pb d'espace disque par exemple)

A+
Avatar
Jean-Marie
en fait je ne stocke pas sur disque et un tel objet est créé
à l'occasion et détruit dès qu'il ne sert plus ;
le seul inconvénient est de ne pouvoir conserver les références
apparemment ; si je prends l'exemple suivant où je sérialise un vecteur
d'objet de type Test, je m'attends à ce qu'en modifiant la valeur
dans l'objet test du vecteur original ((Test)voriginal.get(0)).setVal(1),
cela modifie aussi la valeur dans l'objet sérialisé ce qui n'est pas le
cas :
((Test)vclone.get(0)).getVal() vaut 0 !

y-at'il un moyen d'y parvenir ?

merci

JM



public class TestSerialisation implements Serializable {
private final static long serialVersionUID = 1L;
public TestSerialisation(){
try {
Vector voriginal = new Vector();
Test test=new Test(0);
voriginal.addElement(test);
Vector vclone=(Vector)serialisation(voriginal);
((Test)voriginal.get(0)).setVal(1); // modification de la valeur originale
System.out.println("valeur non modifiée dans le clone :
"+((Test)vclone.get(0)).getVal()); // elle vaut toujours 0
} catch (Exception e) {
e.printStackTrace();
}
}
public Object serialisation(Object object) throws IOException,
ClassNotFoundException {
// Serialize the Object into a byte[]
ByteArrayOutputStream pos = new ByteArrayOutputStream();
ObjectOutputStream objOutfact = new ObjectOutputStream(pos);
try {
objOutfact.writeObject(object);
} catch (Exception e ){
e.printStackTrace();
}
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();
}
}

C'est sûr que pour enfoncer un clou, on peut frapper avec le poing !
Mais avec un marteau c'est quand même plus approprié !

Donc, si tu veux dupliquer tes objets, tu devrais utiliser le
clonage... qui n'est pas si difficile que ça à mettre en oeuvre.
D'autant qu'avec la sérialisation, tu peux engendrer des pb que tu
n'aurais pas eu comme un pb d'espace disque par exemple)

A+




Avatar
Bruno Causse
"Jean-Marie" a écrit dans le message de news:
f367jg$779$
en fait je ne stocke pas sur disque et un tel objet est créé
à l'occasion et détruit dès qu'il ne sert plus ;
le seul inconvénient est de ne pouvoir conserver les références
apparemment ; si je prends l'exemple suivant où je sérialise un vecteur
d'objet de type Test, je m'attends à ce qu'en modifiant la valeur
dans l'objet test du vecteur original ((Test)voriginal.get(0)).setVal(1),
cela modifie aussi la valeur dans l'objet sérialisé ce qui n'est pas le
cas :
((Test)vclone.get(0)).getVal() vaut 0 !

y-at'il un moyen d'y parvenir ?



je ne vois qu'une chose,

le double referencement.

un vecteur de reference, sur une reference (un objet simple avec un seul
champ une reference)

il suffit d'implementer le code pour que cette objet soit transparent.

cela repond t'il a ta queqtion?

Avatar
TestMan
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


Bonjour,

Question "stupide": Si votre objectif est de dupliquer des objets,
pourquoi n'utilisez vous le .clone(), qui lui vous permetra de
configurer exactement ce que vous souhaitez cloner ?

Si celà ne correspond pas à vos besoins, il va faloir nous en dire
plus ;-)


parce-qu'il me faut implémenter la fonction clone()
pour chaque classe !

JM

Bonjour,


Implementation de Serializable ou implementation de Clonable et
surcharge de méthode .clone() avec simple appel du super.clone()...
dans tous les cas votre vesoin va nécessiter une modification dans
chaque classe à cloner...

A+
TM


d'après ce que j'ai pu lire, le super.clone() n'est pas toujours
suffisant...
de toute façon j'ai pris une autre direction avec la sérialization
qui est rapide d'un point de vue codage
mais il y a des pièges à éviter comme j'ai pu le constater si
par exemple on veut conserver certaines références comme dans l'exemple
que j'ai donné

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
Jean-Marie
hum ! je vais essayer déjà sur un exemple simple

"Jean-Marie" a écrit dans le message de news:
f367jg$779$
en fait je ne stocke pas sur disque et un tel objet est créé
à l'occasion et détruit dès qu'il ne sert plus ;
le seul inconvénient est de ne pouvoir conserver les références
apparemment ; si je prends l'exemple suivant où je sérialise un vecteur
d'objet de type Test, je m'attends à ce qu'en modifiant la valeur
dans l'objet test du vecteur original ((Test)voriginal.get(0)).setVal(1),
cela modifie aussi la valeur dans l'objet sérialisé ce qui n'est pas le
cas :
((Test)vclone.get(0)).getVal() vaut 0 !

y-at'il un moyen d'y parvenir ?



je ne vois qu'une chose,

le double referencement.

un vecteur de reference, sur une reference (un objet simple avec un seul
champ une reference)

il suffit d'implementer le code pour que cette objet soit transparent.

cela repond t'il a ta queqtion?





Avatar
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) ????

"Jean-Marie" a écrit dans le message de news:
f367jg$779$
en fait je ne stocke pas sur disque et un tel objet est créé
à l'occasion et détruit dès qu'il ne sert plus ;
le seul inconvénient est de ne pouvoir conserver les références
apparemment ; si je prends l'exemple suivant où je sérialise un vecteur
d'objet de type Test, je m'attends à ce qu'en modifiant la valeur
dans l'objet test du vecteur original ((Test)voriginal.get(0)).setVal(1),
cela modifie aussi la valeur dans l'objet sérialisé ce qui n'est pas le
cas :
((Test)vclone.get(0)).getVal() vaut 0 !

y-at'il un moyen d'y parvenir ?



je ne vois qu'une chose,

le double referencement.

un vecteur de reference, sur une reference (un objet simple avec un seul
champ une reference)

il suffit d'implementer le code pour que cette objet soit transparent.

cela repond t'il a ta queqtion?





1 2