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 :

Héritage et sérialization


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Héritage et sérialization
    Bonjour,

    J'ai un problème de sérialization avec une classe C héritant d'une classe B héritant d'une classe A.

    Le problème est que je ne retrouve pas dans mon objet désérializé les attributs spécifiques à la classe C alors que les attributs de la classe B sont ok.

    Les classes A et B implémentent l'interface Serializable. J'ai donné des constructeurs vides aux classes B et C.

    D'après ce que j'ai lu, une classe héritant d'une classe Serializable est-elle même Serializable, il n'y a donc pas besoin de préciser que la classe fille implémente l'interface Serializable.

    Je ne peux pas copier/coller le code, mais le ferais plus tard si besoin, cela dit ça me semble un problème assez basique. Quelles doivent être les "bonnes pratiques" en la matière ?
    Pouvez-vous donc m'aider ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Le Makron Voir le message
    Je ne peux pas copier/coller le code, mais le ferais plus tard si besoin,
    Ben oui, ce serait bien qu'on voie A, B, C, le code de sérialisation, le code de désérialisation et le test que tu fais démontrant que les champs de C sont vides.

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Mais en l’occurrence qu'est-ce qui doit théoriquement être fait pour qu'une classe héritant d'une autre classe soit correctement sérializée/désérializée ?

    Les tests que je fais pour démontrer que les champs de C sont vides : utilisation du debbuger d'eclipse : avant sérialization le champ est ok, après désérialization, le champ du nouvel objet est null, les champs de la classe mère sont ok.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Le Makron Voir le message
    Mais en l’occurrence qu'est-ce qui doit théoriquement être fait pour qu'une classe héritant d'une autre classe soit correctement sérializée/désérializée ?
    Il n'y a rien à faire justement.

    La question serait donc : qu'as-tu fait pour produire ce résultat ?



    a++

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    ah ben en fait même la sérialization/désérialization de la classe B ne marche pas ! Donc dans le code les classes Vector et SmoothedVector ne sont pas désérialisées comme il faut.

    Alors voici le code des classes utilisées. D'abord celui des classes de l'API que j'utilise (ardor3d) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public interface ReadOnlyVector3 {
    ...
    }
     
    public class Vector3 implements Cloneable, Savable, Externalizable, ReadOnlyVector3, Poolable {
    ...
    }
    mes classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
     
    public interface IVector extends ReadOnlyVector3 {
     
    	public Vector3 set(ReadOnlyVector3 vector);
     
    	public IPolygon[] getPolys();
    	public void setPolys(IPolygon[] polys);
    	public Edge[] getEdges();
    	public void setEdges(Edge[] edgess);
    	public boolean geomEquals(IVector vector);
     
    }
     
    public class Vector extends Vector3 implements IVector {
     
    	public transient static int cp = 0;
     
    	private int id;
     
    	private IPolygon polys[] = null;
    	private Edge edges[] = null;
     
    	public Vector() {
    		super(0.0, 0.0, 0.0);
    	}
     
    	public Vector(double x, double y, double z) {
    		super(x, y, z);
    		id = cp++;
    	}
     
    	public Vector(ReadOnlyVector3 v) {
    		super(v.getX(), v.getY(), v.getZ());
    		id = cp++;
    	}
    ...
    }
     
    public class SmoothedVector extends Vector3 implements IVector {
     
    	public transient static int cp = 0;
     
    	private int id;
     
    	protected Vector3 normal;
     
    	private IPolygon polys[] = null;
    	private Edge edges[] = null;
     
    	public SmoothedVector() {
    		super();
    	}
     
    	public SmoothedVector(Vector3 v, Vector3 normal) {
     
    		super(v);
    		this.normal = normal;
    	}
     
    	public SmoothedVector(double x, double y, double z, double nx, double ny, double nz) {
     
    		super(x, y, z);
    		this.normal = new Vector3(nx, ny, nz);
    	}
    	public Vector3 getNormal() {
    		return normal;
    	}
    ...
    }
    et enfin le code pour tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    	public static void main(String[] args) {
     
    		BufferedReader br = null;
     
    		try {
     
    			Pattern pattern = Pattern.compile("\\s+");
    			String[] toks = pattern.split("b 1 2 3 4 5 6");
     
    			SmoothedVector sm =new SmoothedVector(
    					Double.parseDouble(toks[1]), 
    					Double.parseDouble(toks[2]), 
    					Double.parseDouble(toks[3]), 
    					Double.parseDouble(toks[4]),
    					Double.parseDouble(toks[5]),
    					Double.parseDouble(toks[6]));
     
    			Vector v = new Vector(1.0, 2.0, 3.0);
    			v.setEdges(new Edge[2]);
    			v.setPolys(new Polygon[5]);
     
        		FileOutputStream  fichier = new FileOutputStream ("d:\\compound2.ser");
        		ObjectOutputStream  oos = new ObjectOutputStream (fichier);
        		oos.writeObject(v);
        		oos.flush();
        		oos.close();
     
     
     
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (br != null)
    					br.close();
    			} catch (IOException ex) {
    				ex.printStackTrace();
    			}
    		}
     
    		try {
    			FileInputStream fichier = new FileInputStream("d:\\compound2.ser");
    			ObjectInputStream ois = new ObjectInputStream(fichier);
    			Object o = ois.readObject();
    			Vector v = (Vector)o;
    //			SmoothedVector sm  = (SmoothedVector)o;
    			System.out.println("**");
     
    		} catch (java.io.IOException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}   
     
     
     
    	}

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Bonjour,

    ta classe mère est Externalizable, ce qui signifie que la Serialization est faite explicitement par la classe et non par la JVM comme avec les implémentations basiques de l'interface Serializable.

    Tu dois redéfinir les méthodes de l'interface Externalizable et y appeler les méthodes de la classe parente.
    Ainsi, chaque classe est responsable de la (de)serialization de ses membres.

    Tu trouveras facilement quelques tutos sur les interfaces Serializable/Externalizable pour creuser un peu la chose.

  7. #7
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    ah bon ? ah ben première nouvelle !
    Voilà qui ne facilite pas ma tache...
    Et bien merci.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Le Makron Voir le message
    ah bon ? ah ben première nouvelle !
    Voilà qui ne facilite pas ma tache...
    Et bien merci.
    Si tu veux te faciliter la tâche, tu utilise Serializable, et pas Externalizable.

  9. #9
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Je ne peux malheureusement pas car c'est une classe d'API

  10. #10
    Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    C'est bon, j'ai réussi.
    Merci à vous.

Discussions similaires

  1. Norme sérialization pour héritage
    Par losformen dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 20/04/2015, 15h19
  2. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  3. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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