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 -
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...
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:
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
Bonjour,
Cette écriture est maladroite et potentiellement fausse :
Imaginons que l'on prenne deux objets différents :
Soit tu utilises la notation objet avec
Idem pour
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
Remarque : en Java les méthodes et les noms de variables commencent par une minuscule.
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.
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 !
Exemple :
Il y a juste un problème, l'ordinateur ne connaît pas la classe File... est-ce à moi de la construire ?