Sérialisation : il n'y a que le dernier objet de sérialisé
5 réponses
MxT
Bonjour,
Je ne vois pas pourquoi, lorsque je sérialise 2 objets de type Client,
il semble qu'il n'y ait que le dernier (client2) qui soit effectivement
enregistré dans le fichier...
Merci d'avance.
MxT
La classe principale :
import java.io.*;
import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException,
ClassNotFoundException {
/* fichier de sérialisation */
String fichierSerialisation = "C:\\Documents and
Settings\\Moi\\Bureau\\fichierSerialisation.txt";
/* création de 2 objets client */
Client client1 = new Client("nom_client1", "societe_client1");
Client client2 = new Client ("nom_client2", "societe_client2");
/* création des objets de sérialisation/desserialisation */
SerDer agentSer1 = new SerDer(fichierSerialisation);
SerDer agentSer2 = new SerDer(fichierSerialisation);
/* sérialisation des objets client */
agentSer1.serialise(client1);
agentSer2.serialise(client2);
/* MÉTHODE DE SÉRIALISATION */
public void serialise(Object unObjet) throws IOException {
FileOutputStream nomFichier = new
FileOutputStream(fichier);
ObjectOutputStream fluxEcrit = new
ObjectOutputStream(nomFichier);
fluxEcrit.writeObject(unObjet);
fluxEcrit.flush();
fluxEcrit.close();
}
/* MÉTHODE DE DÉSÉRIALISATION */
public Object reinstancie() throws IOException,
ClassNotFoundException {
/* FileInputStream obtient les byte à partir d'un
fichier */
FileInputStream nomFichier = new
FileInputStream(fichier);
/* un objet ObjectInpuStream désérialize des données
primitives et des objets
préalablement écrits en utilisant ObjectOutputStream
*/
ObjectInputStream fluxLu = new
ObjectInputStream(nomFichier);
/* la classe Object est la racine de la hiérarchie de
toutes les classes */
/* readObject() lit un objet ObjectInputStream*/
Object obj = fluxLu.readObject();
Tout simplement parce que tu le fais avec 2 agents différents, donc ils ouvrent chacun le fichier AU DEBUT!!!
-- Isammoc
MxT
Tout simplement parce que tu le fais avec 2 agents différents, donc ils ouvrent chacun le fichier AU DEBUT!!!
Merci pour la réponse. J'ai modifié ma classe principale comme ci-dessous, mais ça ne fonctionne toujours pas...
import java.io.*; import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException, ClassNotFoundException {
/* fichier de sérialisation */ String fichierSerialisation = "C:Documents and SettingsMoiBureaufichierSerialisation.txt";
/* création de 2 objets client */ Client client1 = new Client("nom_client1", "societe_client1"); Client client2 = new Client ("nom_client2", "societe_client2");
/* création d'un objet de sérialisation/desserialisation */ SerDer agentSer = new SerDer(fichierSerialisation);
/* sérialisation des objets client */ agentSer.serialise(client1); agentSer.serialise(client2);
/* affichage des objets désérialisés */ agentSer.identifie(objetLu1); agentSer.identifie(objetLu2);
} }
Tout simplement parce que tu le fais avec 2 agents différents, donc ils
ouvrent chacun le fichier AU DEBUT!!!
Merci pour la réponse.
J'ai modifié ma classe principale comme ci-dessous, mais ça ne
fonctionne toujours pas...
import java.io.*;
import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException,
ClassNotFoundException {
/* fichier de sérialisation */
String fichierSerialisation = "C:\Documents and
Settings\Moi\Bureau\fichierSerialisation.txt";
/* création de 2 objets client */
Client client1 = new Client("nom_client1", "societe_client1");
Client client2 = new Client ("nom_client2", "societe_client2");
/* création d'un objet de sérialisation/desserialisation */
SerDer agentSer = new SerDer(fichierSerialisation);
/* sérialisation des objets client */
agentSer.serialise(client1);
agentSer.serialise(client2);
Tout simplement parce que tu le fais avec 2 agents différents, donc ils ouvrent chacun le fichier AU DEBUT!!!
Merci pour la réponse. J'ai modifié ma classe principale comme ci-dessous, mais ça ne fonctionne toujours pas...
import java.io.*; import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException, ClassNotFoundException {
/* fichier de sérialisation */ String fichierSerialisation = "C:Documents and SettingsMoiBureaufichierSerialisation.txt";
/* création de 2 objets client */ Client client1 = new Client("nom_client1", "societe_client1"); Client client2 = new Client ("nom_client2", "societe_client2");
/* création d'un objet de sérialisation/desserialisation */ SerDer agentSer = new SerDer(fichierSerialisation);
/* sérialisation des objets client */ agentSer.serialise(client1); agentSer.serialise(client2);
/* affichage des objets désérialisés */ agentSer.identifie(objetLu1); agentSer.identifie(objetLu2);
} }
Guillaume Alleon
Suite à une lecture en diagonale, j'ai l'impression que ton fichier est créé à chaque fois que tu sérialises. Tu devrais plutôt l'ouvrir dans le constructeur ...
MxT wrote:
Tout simplement parce que tu le fais avec 2 agents différents, donc ils ouvrent chacun le fichier AU DEBUT!!!
Merci pour la réponse. J'ai modifié ma classe principale comme ci-dessous, mais ça ne fonctionne toujours pas...
import java.io.*; import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException, ClassNotFoundException {
/* fichier de sérialisation */ String fichierSerialisation = "C:Documents and SettingsMoiBureaufichierSerialisation.txt";
/* création de 2 objets client */ Client client1 = new Client("nom_client1", "societe_client1"); Client client2 = new Client ("nom_client2", "societe_client2");
/* création d'un objet de sérialisation/desserialisation */ SerDer agentSer = new SerDer(fichierSerialisation);
/* sérialisation des objets client */ agentSer.serialise(client1); agentSer.serialise(client2);
/* affichage des objets désérialisés */ agentSer.identifie(objetLu1); agentSer.identifie(objetLu2);
} }
Suite à une lecture en diagonale, j'ai l'impression que ton fichier est
créé à chaque fois que tu sérialises. Tu devrais plutôt l'ouvrir dans le
constructeur ...
MxT wrote:
Tout simplement parce que tu le fais avec 2 agents différents, donc
ils ouvrent chacun le fichier AU DEBUT!!!
Merci pour la réponse.
J'ai modifié ma classe principale comme ci-dessous, mais ça ne
fonctionne toujours pas...
import java.io.*;
import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException,
ClassNotFoundException {
/* fichier de sérialisation */
String fichierSerialisation = "C:\Documents and
Settings\Moi\Bureau\fichierSerialisation.txt";
/* création de 2 objets client */
Client client1 = new Client("nom_client1", "societe_client1");
Client client2 = new Client ("nom_client2", "societe_client2");
/* création d'un objet de sérialisation/desserialisation */
SerDer agentSer = new SerDer(fichierSerialisation);
/* sérialisation des objets client */
agentSer.serialise(client1);
agentSer.serialise(client2);
Suite à une lecture en diagonale, j'ai l'impression que ton fichier est créé à chaque fois que tu sérialises. Tu devrais plutôt l'ouvrir dans le constructeur ...
MxT wrote:
Tout simplement parce que tu le fais avec 2 agents différents, donc ils ouvrent chacun le fichier AU DEBUT!!!
Merci pour la réponse. J'ai modifié ma classe principale comme ci-dessous, mais ça ne fonctionne toujours pas...
import java.io.*; import java.util.*;
public class Test2 {
public static void main(String args[]) throws IOException, ClassNotFoundException {
/* fichier de sérialisation */ String fichierSerialisation = "C:Documents and SettingsMoiBureaufichierSerialisation.txt";
/* création de 2 objets client */ Client client1 = new Client("nom_client1", "societe_client1"); Client client2 = new Client ("nom_client2", "societe_client2");
/* création d'un objet de sérialisation/desserialisation */ SerDer agentSer = new SerDer(fichierSerialisation);
/* sérialisation des objets client */ agentSer.serialise(client1); agentSer.serialise(client2);
/* affichage des objets désérialisés */ agentSer.identifie(objetLu1); agentSer.identifie(objetLu2);
} }
Olivier Thomann
Suite à une lecture en diagonale, j'ai l'impression que ton fichier est créé à chaque fois que tu sérialises. Tu devrais plutôt l'ouvrir dans le constructeur ... Sinon un autre conseil. Définis le champ serialVersionUID, sinon tes
instances sérialisées seront dépendantes du compilateur utilisé pour compiler tes classes. C'est très important! -- Olivier
Suite à une lecture en diagonale, j'ai l'impression que ton fichier est
créé à chaque fois que tu sérialises. Tu devrais plutôt l'ouvrir dans le
constructeur ...
Sinon un autre conseil. Définis le champ serialVersionUID, sinon tes
instances sérialisées seront dépendantes du compilateur utilisé pour
compiler tes classes. C'est très important!
--
Olivier
Suite à une lecture en diagonale, j'ai l'impression que ton fichier est créé à chaque fois que tu sérialises. Tu devrais plutôt l'ouvrir dans le constructeur ... Sinon un autre conseil. Définis le champ serialVersionUID, sinon tes
instances sérialisées seront dépendantes du compilateur utilisé pour compiler tes classes. C'est très important! -- Olivier
Thibaut Desmarest
MxT wrote:
Bonjour,
Je ne vois pas pourquoi, lorsque je sérialise 2 objets de type Client, il semble qu'il n'y ait que le dernier (client2) qui soit effectivement enregistré dans le fichier... Merci d'avance. MxT
/* MÉTHODE DE SÉRIALISATION */ public void serialise(Object unObjet) throws IOException {
FileOutputStream nomFichier = new FileOutputStream(fichier);
ObjectOutputStream fluxEcrit = new ObjectOutputStream(nomFichier);
Salut, je vais peut être dire n'importe quoi, mais moi je pense que ton problème vient du fait que quand tu écris ton deuxième objet dans le fichier tu l'écris par dessus le premier. Tu l'as donc ecrasé...
Si c'est bien le cas, deux solutions :
Soit tu veux absolument pouvoir écrire dans le fichier à des instants différents et dans ce cas là je pense que tu devrais écrire :
FileOutputStream nomFichier = new FileOutputStream(fichier, true); // append == true pour écrire à la fin du fichier plutôt qu'au début.
Soit tu te contentes d'écrire tout d'un coup et dans ce cas là tu n'as qu'à ranger les objets que tu veux sérialiser dans un autre objet, dans un tableau ou dans un Vector...
P.S: ce n'est pas la peine de mettre des dans les noms de fichiers, même sous windows, Java sait faire la conversion si tu mets :
"C:/Documents and Settings/Moi/Bureau/fichierSerialisation.txt";
En plus ca t'évite des problèmes de portage si tu utilises des chemins relatifs...
Voilà, j'espere t'avoir été utile...
MxT wrote:
Bonjour,
Je ne vois pas pourquoi, lorsque je sérialise 2 objets de type Client,
il semble qu'il n'y ait que le dernier (client2) qui soit effectivement
enregistré dans le fichier...
Merci d'avance.
MxT
/* MÉTHODE DE SÉRIALISATION */
public void serialise(Object unObjet) throws IOException {
FileOutputStream nomFichier = new
FileOutputStream(fichier);
ObjectOutputStream fluxEcrit = new
ObjectOutputStream(nomFichier);
Salut, je vais peut être dire n'importe quoi, mais moi je pense que ton
problème vient du fait que quand tu écris ton deuxième objet dans le
fichier tu l'écris par dessus le premier. Tu l'as donc ecrasé...
Si c'est bien le cas, deux solutions :
Soit tu veux absolument pouvoir écrire dans le fichier à des instants
différents et dans ce cas là je pense que tu devrais écrire :
FileOutputStream nomFichier = new
FileOutputStream(fichier, true); // append == true
pour écrire à la fin du fichier plutôt qu'au début.
Soit tu te contentes d'écrire tout d'un coup et dans ce cas là tu n'as
qu'à ranger les objets que tu veux sérialiser dans un autre objet, dans
un tableau ou dans un Vector...
P.S: ce n'est pas la peine de mettre des \ dans les noms de fichiers,
même sous windows, Java sait faire la conversion si tu mets :
"C:/Documents and Settings/Moi/Bureau/fichierSerialisation.txt";
En plus ca t'évite des problèmes de portage si tu utilises des chemins
relatifs...
Je ne vois pas pourquoi, lorsque je sérialise 2 objets de type Client, il semble qu'il n'y ait que le dernier (client2) qui soit effectivement enregistré dans le fichier... Merci d'avance. MxT
/* MÉTHODE DE SÉRIALISATION */ public void serialise(Object unObjet) throws IOException {
FileOutputStream nomFichier = new FileOutputStream(fichier);
ObjectOutputStream fluxEcrit = new ObjectOutputStream(nomFichier);
Salut, je vais peut être dire n'importe quoi, mais moi je pense que ton problème vient du fait que quand tu écris ton deuxième objet dans le fichier tu l'écris par dessus le premier. Tu l'as donc ecrasé...
Si c'est bien le cas, deux solutions :
Soit tu veux absolument pouvoir écrire dans le fichier à des instants différents et dans ce cas là je pense que tu devrais écrire :
FileOutputStream nomFichier = new FileOutputStream(fichier, true); // append == true pour écrire à la fin du fichier plutôt qu'au début.
Soit tu te contentes d'écrire tout d'un coup et dans ce cas là tu n'as qu'à ranger les objets que tu veux sérialiser dans un autre objet, dans un tableau ou dans un Vector...
P.S: ce n'est pas la peine de mettre des dans les noms de fichiers, même sous windows, Java sait faire la conversion si tu mets :
"C:/Documents and Settings/Moi/Bureau/fichierSerialisation.txt";
En plus ca t'évite des problèmes de portage si tu utilises des chemins relatifs...