Sérialisation

fixoudb Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
j'ai écrit deux méthodes de sérialisation et de dé-sérialisation, et j'ai fait un test simple sur ma classe principale. Voilà mon problème, je ne comprend pas pourquoi l'ordinateur me renvoit 90 au lieu de 45 ? Lorsque je déserialise, le numéro de de mon perso ne devrait-il pas revenir à 45 ?

Merci d'avance de votre aide...


public class Main {
    public static void main(String[] args) {
  
            Personne me = new Personne(45,"Jules");
            me.Ser(me);
            me.changerId(90);
            me.Deser(me);
            me.afficherId();



Ma classe Personne prend comme attribut un numéro et un nom.
La méthode changerId permet de changer le numéro.
La méthode changerId permet de changer le numéro.


Voici mes 2 méthodes de sérialization:


public void Ser(Personne P) {
        try {
          FileOutputStream fs = new FileOutputStream("FILE_NAME");
          ObjectOutputStream os = new ObjectOutputStream(fs);
         os.writeObject(P); // 3
         os.close();
      } catch (Exception e) { 
         e.printStackTrace(); 
      }
    }
    

    public void Deser(Personne P){
        try {
          FileInputStream fis = new FileInputStream("FILE_NAME");
          ObjectInputStream ois = new ObjectInputStream(fis);
         P = (Personne) ois.readObject(); // 4
         ois.close();
      } catch (Exception e) { 
         e.printStackTrace(); 
      }
    }

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Cette écriture est maladroite et potentiellement fausse :
me.Ser(me);

Imaginons que l'on prenne deux objets différents :
a.Ser(b);
lequel tu veux sérialiser a, ou b ?

Soit tu utilises la notation objet avec
me.Ser();
pour sérialiser
this
, soit tu fais des méthodes static et tu sérialises l'argument :
Personne.Ser(me);
...

Idem pour
me.Deser(me);
, ça n'a pas de sens, avec
a.Deser(b);
qu'est-ce que tu désérialises, a, b ?
En réalité ni l'un ni l'autre, ce que tu désérialises c'est l'objet qu'il y a dans le fichier, et c'est ce fichier qu'il faudrait mettre en paramètre.
Notamment quand tu fais
P = (Personne) ois.readObject();
c'est faux, modifier la référence du paramètre ne va pas modifier l'objet qui correspond (et ça c'est toujours vrai, ce n'est pas spécifique à la sérialisation)

Remarque : en Java les méthodes et les noms de variables commencent par une minuscule.
0
fixoudb Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
Tout d'abord merci de vote réponse.

Effectivement les écritures des méthodes Ser et Deser ne sont pas cohérentes au niveau des arguments, seulement j'avais besoin d'une Personne P dans mes fonctions et étant débutant en java je ne sais pas comment faire autrement..
Auriez vous à votre connaissance des méthodes de sérialisation et de déserialisation qui conviendraient dans un cas comme celui-ci ?
L'idée serait de pouvoir ré-obtenir les attributs de mes personnages à chaque réouverture de Netbeans par exemple..

Merci d'avance !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > fixoudb Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
Avec un code similaire à celui que tu as fait plus haut tu peux faire deux méthodes de sérialisation et désérialisation qui fonctionne avec n'importe quel objet sérialisable.

public static void serialize(File file, Serializable object) throws IOException {
    try (FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos)) {
        oos.writeObject(object);
    }
}

public static Serializable deserialize(File file) throws IOException {
    try (FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis)) {
        return (Serializable) ois.readObject();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}

Exemple :
public static void main(String[] args) throws IOException {
    File file = new File("C:/personne.ser");

    Personne p1 = new Personne(45, "Jules");
    serialize(file, p1);

    Personne p2 = (Personne) deserialize(file);
}
0
fixoudb
 
Merci beaucoup, cela devrait être parfait !
Il y a juste un problème, l'ordinateur ne connaît pas la classe File... est-ce à moi de la construire ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > fixoudb
 
Il faut ajouter un
import java.io.File;
de même que tu as dû faire des imports pour java.io.FileInputStream, java.io.FileOutputStream, java.io.ObjectOutputStream et java.io.ObjectInputStream
0