Serialisation

roscomac Messages postés 6 Date d'inscription samedi 9 mai 2009 Statut Membre Dernière intervention 21 décembre 2010 - 20 déc. 2010 à 00:18
 Utilisateur anonyme - 22 déc. 2010 à 10:46
Bonjour à tous,

Je vous explique mon problème, j'ai un projet à faire, et je cherche à sérialiser une classe qui contient une arraylist.
Ma sérialisation se passe bien et quand je désérialise avant de quitter mon programme je récupère bien ma liste.
Mais quand je redémarre le programme, il ne récupère rien, alors que le fichier n'a pas été modifié entre temps.

Si vous avez des idées je suis preneur, j'ai tester plusieurs choses et je ne trouve pas de solution!
Merci d'avance.

10 réponses

johnjjj Messages postés 120 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 24 septembre 2012
20 déc. 2010 à 11:01
bonjour
j'aimerai savoir est ce que à la fin tu mis flash pour ObjectOutputStream
ObjectOutputStream oos =new ObjectOutputStream(fos);
.
.
....
oos.flush();

cordialement
0
roscomac Messages postés 6 Date d'inscription samedi 9 mai 2009 Statut Membre Dernière intervention 21 décembre 2010
20 déc. 2010 à 11:47
Bonjour,

Non je n'ai pas mis oos.flush ma méthode pour sérialiser est codé comme ceci :

public static void sauvegarde(ListeCompte listeCompte, String fileName){

try{
// sauvegarde objet
FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(listeCompte);
fos.close();
}
catch (IOException e){
e.printStackTrace();
}

}

Cordialement.
0
roscomac Messages postés 6 Date d'inscription samedi 9 mai 2009 Statut Membre Dernière intervention 21 décembre 2010
20 déc. 2010 à 12:37
Mon code pour désérialiser

public static ListeCompte restauration(String fileName){

ListeCompte listeCompte = new ListeCompte();

try{
// restauration objet
FileInputStream fis = new FileInputStream(fileName);
//InputStream fis=(FileInputStream) ClassLoader.getSystemResourceAsStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
try {
listeCompte=(ListeCompte)ois.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fis.close();

}
catch (IOException e){
e.printStackTrace();
}

return listeCompte;

}
}
0
johnjjj Messages postés 120 Date d'inscription dimanche 4 avril 2010 Statut Membre Dernière intervention 24 septembre 2012
20 déc. 2010 à 18:55
essaie de mettre
oos.flush(); avant fos.close();
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
roscomac Messages postés 6 Date d'inscription samedi 9 mai 2009 Statut Membre Dernière intervention 21 décembre 2010
20 déc. 2010 à 21:43
Je viens de tester et ça ne change rien..
est ce que je fois resérialiser une fois que j'ai désérialiser ou ce n'est pas nécessaire ? je ne vois vraiment pas ce qui bloque
0
Utilisateur anonyme
21 déc. 2010 à 15:36
Bonjour

Tu ne devrais pas avoir à faire ListeCompte listeCompte = new ListeCompte();
comme la liste doit être récupérée avec readObject.

C'est plutôt l'ObjectOutputStream que tu dois fermer, il va fermer le flux qu'il enveloppe.

Si ta liste est vide, cela veut peut-être dire que tes objets ne sont pas sérialisables.










TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
roscomac Messages postés 6 Date d'inscription samedi 9 mai 2009 Statut Membre Dernière intervention 21 décembre 2010
21 déc. 2010 à 18:43
Mon objet est un bien sérialisable puisque lorsque je test avant de quitter mon programme si mon objet a été sérialiser il me renvoie la liste non vide.
Mais le problème est quand je relance mon programme la liste est vide..
0
Utilisateur anonyme
21 déc. 2010 à 22:28
Quand tu sérialises une liste d'objets, cela ne vide pas la liste donc c'est normal que ta liste ne soit pas vide quand tu quittes ton programme. Comment testes-tu si ta liste a été sérialisée? Tu la désérialises de nouveau? As-tu pensé à fixer le serial version UID? Ton code ne respecte pas les bonnes pratiques mais il est assez trivial et devrait marcher. Peux-tu me montrer ta classe ListeCompte?
















TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
roscomac Messages postés 6 Date d'inscription samedi 9 mai 2009 Statut Membre Dernière intervention 21 décembre 2010
21 déc. 2010 à 22:54
Pour tester je désérialise et j'ai bien fixé le serial version UID.


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;



public class ListeCompte implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
*
*/

private static ArrayList<Compte> liste = new ArrayList<Compte>();

public ArrayList<Compte> getListe() {
return liste;
}


public static void setListeCompte(ArrayList<Compte> liste) {
ListeCompte.liste = liste;
}


public ListeCompte(){

}


public static void ajout(Compte newCompte) throws FileNotFoundException, IOException{
liste.add(newCompte);

}

public void afficherContenu() {
// TODO Auto-generated method stub
Object[] tableau = liste.toArray();
for (int i=0; i < tableau.length ; i++ ){
Compte newCompte = (Compte) tableau[i];
System.out.println(newCompte.getNomCompte());
}
}

public void creerCompte(){
// TODO Auto-generated method stub
String nomCompte=scanNomCompte();
int numCompte=scanNumCompte();
String banque=scanNomBanque();
int montant=scanMontant();
Compte newCompte = new Compte(nomCompte,numCompte,banque, montant);
System.out.println("le compte "+nomCompte+ " a été creé");
try {
ajout(newCompte);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static String scanNomCompte(){
System.out.println("Entrez le nom du compte :");
Scanner sc = new Scanner(System.in);
String nomCompte = sc.nextLine();
return nomCompte;
}
public static int scanNumCompte(){
System.out.println("Entrez le numero du compte :");
Scanner sc = new Scanner(System.in);
int numCompte =sc.nextInt();
return numCompte;
}
public static String scanNomBanque(){
System.out.println("Entrez le nom de la banque :");
Scanner sc = new Scanner(System.in);
String banque = sc.nextLine();
return banque;
}

public static int scanMontant(){
System.out.println("Entrez le montant initial du compte :");
Scanner sc = new Scanner(System.in);
int montant = sc.nextInt();
return montant;
}

public static void ajoutTransaction(Compte newCompte) throws Exception {
//vérifier compte existant, transaction affichier tout montant et compagnie!!
String debitCredit = Transaction.scanDebitCredit() ;
Categorie categorie = ListeCategorie.rechercherCategorie();
int montant = Transaction.scanMontant();
String moyenPayement = Transaction.scanMoyenPayement();
Date date = Transaction.scanDate();
Tiers tiers = ListeTiers.rechercherTiers();
Transaction newTransaction= new Transaction(debitCredit , montant, categorie, moyenPayement, date, tiers);
newCompte.setTransaction(newTransaction);
categorie.setTransaction(newTransaction);
tiers.setTransaction(newTransaction);
}
public static Compte rechercherCompte(){
Compte compteRechercher=liste.get(0);
int indice=0;
boolean test=false;
System.out.println("Veuillez taper le nom du compte souhaité.");
Scanner sc = new Scanner(System.in);
String nomCompteRechercher = sc.nextLine();
Object[] tableau = liste.toArray();
while (test=false)
{//tant que le nom du compte rechercher n'est pas trouver dans la liste

compteRechercher = (Compte) tableau[indice];
if (compteRechercher.getNomCompte().equals(nomCompteRechercher)){
test=true;
}
else{
indice++;
}
}
return compteRechercher;
}

public static void sauvegarde(ListeCompte listeCompte, String fileName){

try{
// sauvegarde objet
FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(listeCompte);
oos.flush();
fos.close();
}
catch (IOException e){
e.printStackTrace();
}

}

public static ListeCompte restauration(String fileName){

ListeCompte listeCompte = new ListeCompte();

try{
// restauration objet
FileInputStream fis = new FileInputStream(fileName);
//InputStream fis=(FileInputStream) ClassLoader.getSystemResourceAsStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
try {
listeCompte=(ListeCompte)ois.readObject();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fis.close();

}
catch (IOException e){
e.printStackTrace();
}

return listeCompte;

}
}
0
Utilisateur anonyme
22 déc. 2010 à 10:46
Bonjour

Ta classe ne respecte pas le contrat des Java Beans. Il ne suffit pas d'utiliser l'interface Serializable pour que les instances d'une classe puissent être sérialisées. Voici un exemple de classe sérialisable :

public class Personne{

    private String nom;

    public Personne(){}

    public String getNom(){
        return nom;
    }

    public void setNom(String nom){
        this.nom = nom;
    }
}

La classe doit être publique, avoir un constructeur sans paramètre public, les attributs doivent être des attributs d'instance et non des attributs de classe, chaque attribut à sérialiser doit avoir un accesseur en lecture (get...()) et un accesseur en écriture (set...()) publiques et respectant la syntaxe suivante : set ou get<nom de l'attribut avec la première lettre en majuscule>().

Ce n'est pas possible que les objets de ta classe ListeCompte se sérialisent correctement et ton code est confus, il y a beaucoup trop de méthodes et d'attributs statiques.












TUER : http://tuer.sourceforge.net/tuer.jnlp

yeah! vive java
0
Rejoignez-nous