[Sérialisation] d'objets de types différents
Bonjour,
Je développe une application client/serveur communiquant par objets sérialisés au moyen d'un flux ObjectOutputStream. Les objets sérialisés pouvant être de types différents, je suis confronté à un petit problème :
Tant que mon client transmet les objets dans un ordre déterminé (et connu du serveur), tout fonctionne sans souçis. Ce dernier sait en effet, à quel type d'objet s'attendre et peut le désérialiser correctement. Exemple :
Code:
1 2 3 4 5
| // Client (sérialise les objets sur le flux réseau)
ObjectOutputStream oos = new ObjectOutputStream(maSocketClient.getOutputStream());
oos.writeObject(new Truc());
oos.writeObject(new Machin());
oos.writeObject(new Bidule()); |
Code:
1 2 3 4 5
| // Serveur (désérialise)
ObjectInputStream ois = new ObjectInputStream(maSocketServeur.getInputStream());
Truc t = (Truc)ois.readObject();
Machin m = (Machin)ois.readObject();
Bidule b = (Bidule)ois.readObject(); |
Par contre, imaginez par exemple que l'utilisateur puisse décider de l'objet à envoyer sur le flux (au moyen d'une interface graphique par exemple). Comment puis-je savoir, au niveau de mon serveur, quel type d'objet je dois récupérer, et comment l'instancier ?
J'ai essayé de le récupérer dans la classe générale Object, à partir duquel je peux trouver le nom de la classe, etc...
Code:
1 2 3 4 5 6 7 8
| Object o = ois.readObject();
if (o.getClass().getName().compareTo("Truc") == 0) {
// je voudrais utiliser ici mon object Truc
} else if (o.getClass().getName().compareTo("Machin") == 0) {
// je voudrai utiliser ici mon objet Machin
} else if (o.getClass().getName().compareTo("Bidule") == 0) {
// je voudrai utiliser ici mon objet Bidule
} |
C'est bien beau, mais les méthodes d'un Truc, d'un Machin, ou d'un Bidule ne sont évidemment pas disponibles dans un Object. Ca doit probablement n'être qu'un détail, mais comment faire ?
Merci