Sérialisation
fixoudb
Messages postés
2
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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 !
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); }Il y a juste un problème, l'ordinateur ne connaît pas la classe File... est-ce à moi de la construire ?