Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Prochaines sessions inter-entreprises : 28-31 mars 2017 / 13-16 juin 2017
Sessions intra-entreprises sur demande.
Inscrivez-vous vite !

Java Quiz #43

FR :
Cela faisait longtemps que je n'avais pas publié de quiz ! L'inspiration vient à manquer, le temps aussi... Mais en voici un tout neuf, présenté en exclusivité lors de ma conférene au YAJUG, le JUG du Luxembourg.
Pouvez-vous repérer le problème de ce code (bien entendu, sans le compiler ni le coller dans votre éditeur préféré) ?

EN :
This quiz has been presented in exclusive to the YAJUG, the java User Group of Luxembourg.
Can you spot what is wrong with this code without compiling it or pasting it in your favorite IDE ?

public class DataSetCreator {
 
    public static void main(String[] args) throws IOException {
        new DataSetCreator().createDataSet(20, new FileOutputStream("test.dat"));
    }
 
    public void createDataSet(int dataSetSize, OutputStream os) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(os);
        Random rand = new Random(System.currentTimeMillis());
        for (int i = 0; i < dataSetSize; i++) {
            oos.writeObject(new Data(rand.nextInt(100)));
        }
        oos.close();
    }
 
    private class Data implements Serializable {
        int number;
        private Data(int number) {
            this.number = number;
        }
        public int getNumber() {
            return number;
        }
    }
 
}

Réponse : bientôt !


Commentaires

1. Le dimanche 20 février 2011, 11:26 par Jérôme

The inner class has an implicit reference to its outer non-serializable class. The easy fix is too make it static.

2. Le dimanche 20 février 2011, 11:27 par xav

La classe Data n'est pas static et est une inner class de DataSetCreator qui n'est pas serializable

3. Le dimanche 20 février 2011, 12:04 par Colin Hebert

Everything seemed okay, and I wondered why you didn't used a stat.... Oh! I see what you did there.

Very good one !

4. Le dimanche 20 février 2011, 13:23 par Benoît Dissert

Bonjour,

Le premier problème est d'évidence relatif aux polices de caractères avec et sans empâtement qui sont mélangées dans le code :-)

Le second est peut-être relatif au type de la classe qui est sérialisée.
Comme c'est une inner classe, relative à l'instance courante de DataSetCreator, laquelle instance n'est pas gardée, puisqu'il y a une référence anonyme, on ne pourra pas récupérer plus tard les objets sérialisés, puisque
l'instance de DataSetCreator étant perdue, on ne connaîtra plus le type des objets sérialisés.

5. Le dimanche 20 février 2011, 14:19 par n!co

manque le constructeur sans argument dans la classe Data pour respecter le contrat de sérialisation ?

6. Le dimanche 20 février 2011, 17:04 par Jérôme

@n!co un constructeur sans argument n'est pas nécessaire, cf. http://www.jguru.com/faq/view.jsp?E... pour une explication détaillée

7. Le vendredi 25 mars 2011, 15:16 par shadowlaw

la class Data implémente Serializable mais n'a pas de UUID et n'implement pas les méthodes readObject() et writeObject ce qui ne respecte pas la spéc pour les classes sérializable

8. Le mercredi 27 avril 2011, 17:44 par globulon

Hum, une classe sérialisable sans constructeur vide ? Ce dernier n'est pas créé par défaut si un constructeur à signature est présent...Je pense que la sérialisation Java ne peut pas s'effectuer dans ce cas là.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.