Determiner si un objet est "serializable"

Determiner si un objet est "serializable" - Java - Programmation

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
Reply

Marsh Posté le 07-06-2006 à 16:27:51   

Reply

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 !

Reply

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 [:el g]
 
edit: le fourbe a supprimé son post [:mlc]


Message édité par Harkonnen le 07-06-2006 à 17:03:34
Reply

Marsh Posté le 07-06-2006 à 17:21:41    

je dis de la merde [:antigone]


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

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.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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.
je crois.


Ca c'est vrai par contre.


---------------
Posté depuis des chiottes, sales. Me gusta.
Reply

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)


---------------
"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
Reply

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..


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-06-2006 à 20:42:16    

the real moins moins a écrit :

ben euh } finally { hein ...


 
ou un mwinmwin.CloseableCloseable ? [:dawa]

Reply

Marsh Posté le 07-06-2006 à 21:07:20    

ouais google:CloseableCloser :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-06-2006 à 21:07:20   

Reply

Marsh Posté le 07-06-2006 à 21:17:31    

etheriel a écrit :


 
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)
 


ah ok
ben non, jvois pas non plus :/


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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 :(


---------------
"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
Reply

Marsh Posté le 08-06-2006 à 10:32:28    

C'est possible avec un chtit coup d'introspection
 

Code :
  1. private static boolean isSerializable(Class classe) {
  2.     if (!Serializable.class.isAssignableFrom(classe)) {
  3.       // la classe en parametre n'implémente pas Serializable
  4.       return false;
  5.     }
  6.     // récupération de la liste des attibuts de la classe
  7.     Field[] attributs = classe.getFields();
  8.     int i = 0;
  9.     while (i < attributs.length) {
  10.       Class classeAttribut = attributs[i].getClass();
  11.       if (!classeAttribut.isPrimitive()) {
  12.         // l'attribut n'est pas d'un type primitif (int, boolean, char...)
  13.         if (!Serializable.class.isAssignableFrom(classeAttribut)) {
  14.           return false;
  15.         }
  16.       }
  17.     }
  18.    
  19.     return true;
  20.   }


 
EDIT : ça ne vérifie que le 1er niveau, je prépare une version un peu plus "sioux" qui va tout vérifier

Message cité 1 fois
Message édité par Bidem le 08-06-2006 à 10:35:21
Reply

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...

Reply

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...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 09-06-2006 à 14:40:24    

finalement c'est ce que je dis depuis le début :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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...

Message cité 1 fois
Message édité par etheriel le 09-06-2006 à 20:16:33

---------------
"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
Reply

Marsh Posté le 09-06-2006 à 20:17:41    

Bidem a écrit :

C'est possible avec un chtit coup d'introspection
 

Code :
  1. private static boolean isSerializable(Class classe) {
  2.     if (!Serializable.class.isAssignableFrom(classe)) {
  3.       // la classe en parametre n'implémente pas Serializable
  4.       return false;
  5.     }
  6.     // récupération de la liste des attibuts de la classe
  7.     Field[] attributs = classe.getFields();
  8.     int i = 0;
  9.     while (i < attributs.length) {
  10.       Class classeAttribut = attributs[i].getClass();
  11.       if (!classeAttribut.isPrimitive()) {
  12.         // l'attribut n'est pas d'un type primitif (int, boolean, char...)
  13.         if (!Serializable.class.isAssignableFrom(classeAttribut)) {
  14.           return false;
  15.         }
  16.       }
  17.     }
  18.    
  19.     return true;
  20.   }


 
EDIT : ça ne vérifie que le 1er niveau, je prépare une version un peu plus "sioux" qui va tout vérifier


 
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 !


---------------
"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
Reply

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 [:petrus dei]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-06-2006 à 20:27:06    

Harkonnen a écrit :

Exception renvoyées


[:mlc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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 :o
 
edit: les exceptions lancées [:aloy]


Message édité par Harkonnen le 09-06-2006 à 20:47:46

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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 :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

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 [:petrus dei]


 
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...


Message édité par etheriel le 11-06-2006 à 22:27:24

---------------
"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
Reply

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 ;)
Merci !


 
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 :


Message édité par Bidem le 12-06-2006 à 17:27:18
Reply

Marsh Posté le 12-06-2006 à 17:21:52    

etheriel a écrit :

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 :(


 
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
 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed