IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Serialization] Objets sérialisés/déserialisés !=


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut [Serialization] Objets sérialisés/déserialisés !=
    Bonjour.

    Je développe une applic et je viens d'entamer la partie sauvegarde. J'ai donc commencé par un petit test: j'ai une classe abstraite Data et une classe Critere qui en dérive.

    La classe Critere à différents attributs: int,float,String,autre objets,...
    Je set donc les attributs dans mon object puis je veux le sérialiser. Erreur de compilation car il veut un constructeur par défaut dans la classe Data.

    Ok, je lui met et maintenant ca marche mais il ne me copie pas l'objet mais un nouvel objet créé avec le constructeur par défaut qui ne fait aucune initialisation .

    Je sais qu'il y a moyen de controler la sérialisation mais est-ce normal qu'il ne copie pas les attributs de mon objet par défaut ???

    Merci d'avance

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Lethal
    Ok, je lui met et maintenant ca marche mais il ne me copie pas l'objet mais un nouvel objet créé avec le constructeur par défaut qui ne fait aucune initialisation .
    Les mécanismes de la sérialisation utilisent la réflexion de Java: une classe Serializable possède une sorte de "constructeur caché" si on veut. Mais il n'empêche que tous les attributs non-static et non-transient doivent être mémorisés automatiquement. Par exemple, avec ce code, les données sont sauvegardées puis chargées sans problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A implements Serializable {int i;}
    ...
    A a = new A();
    a.i=50;
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.obj"));
    oos.writeObject(o);
    oos.close();
     
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.obj"));
    a=(A)ois.readObject();
    ois.close();
    System.out.println("a.i="+a.i); // 50
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Voila en fait ma classe mère "Data" n'implémentais pas serializable et maintenant ca marche ... même si je ne comprend pas trop pourquoi ?!?

    Si qqun à une explication logique, je suis preneur

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par Lethal
    Voila en fait ma classe mère "Data" n'implémentais pas serializable et maintenant ca marche ... même si je ne comprend pas trop pourquoi ?!?

    Si qqun à une explication logique, je suis preneur
    bin seules les classes qui implémentent Serializable (ou Externalizable) peuvent être écrites dans un flux... le fait d'implémenter Serializable agit comme un "marqueur" pour indiquer que les champs non static de la classes doivent être écrits dans le flux (lors du writeObject)...

    Si tu veux agir finement sur les mécanismes de la sérialisation, tu peux redéfinir les méthodes "defaultReadObject" et "defaultWriteObject" de ta classe (attention, ce sont des méthodes privées probablement invoquées par réflexion lors de la sérialisation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
      ois.defaultReadObject();
      //...
    }
     
    private void writeObject(ObjectOutputStream oos) throws IOException {
      oos.defaultWriteObject();
      //...
    }
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Citation Envoyé par Pill_S
    bin seules les classes qui implémentent Serializable (ou Externalizable) peuvent être écrites dans un flux... le fait d'implémenter Serializable agit comme un "marqueur" pour indiquer que les champs non static de la classes doivent être écrits dans le flux (lors du writeObject)...
    Oui je sais mais le fait de mettre un classe abstraite serializable n'a pas de sens pour moi vu qu'elle ne sera jamais instanciée telle quelle. Je pensais donc que le simple fait de déclarer les classes filles serializable suffisait et était plus logique.

Discussions similaires

  1. Stockage en base de données d'objets sérialisés
    Par MagnetiK dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 07/06/2011, 08h52
  2. Comment fusionner 2 objets sérialisés ?
    Par jp203 dans le forum C++
    Réponses: 1
    Dernier message: 23/01/2010, 11h09
  3. Serialize objet Metier > Cannot Serialize winform !
    Par Haknaton dans le forum Windows Forms
    Réponses: 5
    Dernier message: 01/06/2009, 18h44
  4. Objets sérialisés corrompus avec $_GET et $_POST
    Par davcha dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2007, 23h20
  5. [Sessions] Session + Serialize + Objets?
    Par Chiwawa dans le forum Langage
    Réponses: 2
    Dernier message: 28/09/2005, 20h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo