Determiner si un objet est "serializable" - Java - Programmation
Marsh Posté le 07-06-2006 à 16:51:17
etheriel a écrit : si l'objet est serializable, mais contient d'autres objets qui ne le sont pas, ca n'en tient pas compte. |
je vois pas ou est le problème... étant donné qu'il implémente une interface, tu n'as pas à te préoccuper de l'implémentation qui est faite derrière ! à partir du moment ou le instanceof t'indique que l'objet est de type Serializable, alors tu peux utiliser ses méthodes ! sans parler du fait que readObject et writeObject renvoient IOException en cas de souci !
Marsh Posté le 07-06-2006 à 17:02:49
boulax a écrit : Sauf que tu peux etre serializable sans implémenter l'interface serializable, qui n'est qu'une interface sémantique (car vide) |
ben oui mais on peut supposer que le gusse qui a créé la classe a quand même eu le bon gout d'implémenter l'interface et de s'assurer que tout était pris en compte
edit: le fourbe a supprimé son post
Marsh Posté le 07-06-2006 à 17:21:41
je dis de la merde
Marsh Posté le 07-06-2006 à 17:24:34
les methodes read/writeObject ne doivent pas necessairement etre implementées pour qu'un objet soit serialisable.
je crois.
Marsh Posté le 07-06-2006 à 17:33:03
the real moins moins a écrit : les methodes read/writeObject ne doivent pas necessairement etre implementées pour qu'un objet soit serialisable. |
Ca c'est vrai par contre.
Marsh Posté le 07-06-2006 à 20:19:39
Harkonnen a écrit : je vois pas ou est le problème... étant donné qu'il implémente une interface, tu n'as pas à te préoccuper de l'implémentation qui est faite derrière ! à partir du moment ou le instanceof t'indique que l'objet est de type Serializable, alors tu peux utiliser ses méthodes ! sans parler du fait que readObject et writeObject renvoient IOException en cas de souci ! |
Je me suis mal fait comprendre: je dois realiser une communication entre 2 JVM via une socket, et l'utilisation d'un writeObject sur un ObjectOutputStream. L'objet que je vais faire passer dans le tuyau doit donc etre Serializable, mais EGALEMENT tous les objets rattachés à cet objet (ses attributs)
Ex: L'objet A est serializable, mais contient un objet B qui ne l'est pas. Si je fait un writeObject(A), ca plante (NotSerializableException) car B n'est pas serializable. Or, (A instanceof Serializable) retourne pourtant "true"
Ma question est: y-a-t-il un moyen de savoir avant de faire le writeObject si tout va bien se passer (ie: qu'aucun objet non serializable n'est present)
Et le "je catch la NotSerializableException" n'est pas une solution, car elle laisse le stream dans un etat pas joli-joli (dixit la javadoc)
Marsh Posté le 07-06-2006 à 20:24:25
ben euh } finally { hein ...
mais pour vérifier en amont, je sais pas trop non plus, et même si de fait ça serait plus élégant, tu dois quand meme fermer ton stream et liberer les ressources qu'il fait dans ton block finally..
Marsh Posté le 07-06-2006 à 20:42:16
ReplyMarsh Posté le 07-06-2006 à 21:07:20
ReplyMarsh Posté le 07-06-2006 à 21:17:31
etheriel a écrit : |
ah ok
ben non, jvois pas non plus
Marsh Posté le 08-06-2006 à 09:32:09
Bon, ben j'ai rien trouvé sur le net non plus...
La soluce, c'est serialiser vers un tableau de byte, voir si ca se passe bien, et ensuite serialiser via le writeObject. Mais bonjour la perte de perf: 2 serialisations
Marsh Posté le 08-06-2006 à 10:32:28
C'est possible avec un chtit coup d'introspection
Code :
|
EDIT : ça ne vérifie que le 1er niveau, je prépare une version un peu plus "sioux" qui va tout vérifier
Marsh Posté le 08-06-2006 à 21:18:54
D'un autre côté, faire une classe sérialisable dont les membres ne le sont pas, c'est un peu maso...
Marsh Posté le 09-06-2006 à 12:48:10
ça fera pas avancer le smilbik, mais chui d'accord avec post_it...
si la classe est serializable, elle l'est, point.
c'est comme si on déclarait une classe Cloneable, avec une méthode clone non surchargée...
enfin, je crois...
Marsh Posté le 09-06-2006 à 14:40:24
finalement c'est ce que je dis depuis le début
Marsh Posté le 09-06-2006 à 20:15:59
post_it a écrit : D'un autre côté, faire une classe sérialisable dont les membres ne le sont pas, c'est un peu maso... |
bon, je precise: l'objet qui m'est passé, c'est pas moi qui le code !!! Je ne developpe que le composant de communication, et j'aurais voulu verifier que l'objet qui m'arrive est bien conforme aux specs (ie: Serializable, y compris ses attributs). Oui, je sais, si ca plante, c'est que le developpeur est une buse. Mais j'aimerais plutot afficher un message d'erreur que foirer l'ObjectOutputStream...
Marsh Posté le 09-06-2006 à 20:17:41
Bidem a écrit : C'est possible avec un chtit coup d'introspection
|
Oui, en effet, c'est une solution. Je vais m'en inspirer (un p'tit peu de recursivité dans tout ca, et ca devrait le faire
Merci !
Marsh Posté le 09-06-2006 à 20:20:41
etheriel a écrit : bon, je precise: l'objet qui m'est passé, c'est pas moi qui le code !!! Je ne developpe que le composant de communication, et j'aurais voulu verifier que l'objet qui m'arrive est bien conforme aux specs (ie: Serializable, y compris ses attributs). Oui, je sais, si ca plante, c'est que le developpeur est une buse. Mais j'aimerais plutot afficher un message d'erreur que foirer l'ObjectOutputStream... |
et les IOException renvoyées par les méthodes read/writeObject, elles servent à quoi
Marsh Posté le 09-06-2006 à 20:27:06
Harkonnen a écrit : Exception renvoyées |
Marsh Posté le 09-06-2006 à 20:47:22
oui bon on va pas jouer sur les mots hein, t'as parfaitement compris ce que j'ai voulu dire
edit: les exceptions lancées
Marsh Posté le 09-06-2006 à 21:02:12
ben oui, mais vu que t'as vaguement tendance à t'en servir comme d'une valeur de retour et pas comme d'une exception, justement, il vaut mieux jouer sur les mots plutot que de raconter des niaiseries
Marsh Posté le 11-06-2006 à 22:26:01
Harkonnen a écrit : et les IOException renvoyées par les méthodes read/writeObject, elles servent à quoi |
Bon, j'ai deja expliqué que c'etait pas possible:
... Exceptions are thrown for problems with the OutputStream and for classes that should not be serialized. All exceptions are fatal to the OutputStream, which is left in an indeterminate state ... |
en clair, quand une NotSerializableException arrive, ben je suis pas plus avancé: je suis au courant que l'objet n'est pas conforme, mais en // mon stream est aux fraises...
Marsh Posté le 12-06-2006 à 09:53:58
Citation : Oui, en effet, c'est une solution. Je vais m'en inspirer (un p'tit peu de recursivité dans tout ca, et ca devrait le faire |
SURTOUT PAS malheureux ! La récursivité, c'est comme croiser les flux : C'est mal !
(Cf. plus bas)
Citation : Oui, je sais, si ca plante, c'est que le developpeur est une buse. |
Ca m'arrive souvent de rajouter du code que je trouve inutile pour contrôler le manque de compétence des utilisateurs mais si c'est pour contrôler le manque de compétence d'un développeur qui suit pas les specs, c'est horrible .
PS : j'ai pas trop de temps pour faire la version complète mais voici les pistes pour ne pas faire de la récursivité
- dans une boucle, faire un parcourt en profondeur d'abord
- utiliser java.util.Stack
- mettre les classes déjà traitée dans une java.util.HashMap pour éviter de faire 2 fois le même travail
- EDIT :
Marsh Posté le 12-06-2006 à 17:21:52
etheriel a écrit : Bon, ben j'ai rien trouvé sur le net non plus... |
Je ne vois pas pourquoi tu as deux serialisations:
Il te suffit d'envoyer les donnees en deux temps:
- Serialization en memoire
- Ecriture du tableau de byte deja serialized dans le flux du socket
Marsh Posté le 07-06-2006 à 16:27:51
bonjour,
J'aurais besoin de savoir si un objet que l'on me passe en paramètre est Serializable ou pas.
Donc il existe bien le "instanceof", mais ca ne repond qu'à 50% de mon pb: en effet, si l'objet est serializable, mais contient d'autres objets qui ne le sont pas, ca n'en tient pas compte.
Quelqu'un aurait une idée pour savoir si un objet (et les objets qu'il contient) est Serializable (ie: etre sûr que ca plantera pas quand je ferai un writeObject par exemple) ?
---------------
"In the life of a man, there are times and there are seasons. There is a time to surf and there is a time to wax your board. And I'm not just talking about surfing" - Matthew Malone