20
fév.
2011
fév.
2011
Java Quiz #43
Java / JEE ›
Java Quiz
|
Tags :
java
Par Olivier Croisier
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
The inner class has an implicit reference to its outer non-serializable class. The easy fix is too make it static.
La classe Data n'est pas static et est une inner class de DataSetCreator qui n'est pas serializable
Everything seemed okay, and I wondered why you didn't used a stat.... Oh! I see what you did there.
Very good one !
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.
manque le constructeur sans argument dans la classe Data pour respecter le contrat de sérialisation ?
@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
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
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à.