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();
}
}
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
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 ;-)
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
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
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 ;-)
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
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
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...
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
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
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...
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
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+
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)
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+
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+
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)
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+
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?
"Jean-Marie" <jm@noemail.fr> a écrit dans le message de news:
f367jg$779$1@victor.teaser.fr...
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.
"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?
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
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 ;-)
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
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?
hum ! je vais essayer déjà sur un exemple simple
"Jean-Marie" <jm@noemail.fr> a écrit dans le message de news:
f367jg$779$1@victor.teaser.fr...
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.
"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?
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?
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" <jm@noemail.fr> a écrit dans le message de news:
f367jg$779$1@victor.teaser.fr...
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.
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.