Sérialisation

Fermé
fixoudb Messages postés 2 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 21 février 2018 - Modifié le 20 févr. 2018 à 20:03
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 23 févr. 2018 à 13:45
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
20 févr. 2018 à 20:21
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 mardi 20 février 2018 Statut Membre Dernière intervention 21 février 2018
21 févr. 2018 à 16:38
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018 > fixoudb Messages postés 2 Date d'inscription mardi 20 février 2018 Statut Membre Dernière intervention 21 février 2018
21 févr. 2018 à 18:55
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
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 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018 > fixoudb
23 févr. 2018 à 13:45
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