Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1279 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Determiner si un objet est "serializable"

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Determiner si un objet est "serializable"

n°1382985
etheriel
Posté le 07-06-2006 à 16:27:51  profilanswer
 

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
mood
Publicité
Posté le 07-06-2006 à 16:27:51  profilanswer
 

n°1383008
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2006 à 16:51:17  profilanswer
 

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 !

n°1383022
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2006 à 17:02:49  profilanswer
 

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
n°1383040
boulax
Inserer phrase hype en anglais
Posté le 07-06-2006 à 17:21:41  profilanswer
 

je dis de la merde [:antigone]


---------------
Posté depuis des chiottes, sales. Me gusta.
n°1383042
the real m​oins moins
Posté le 07-06-2006 à 17:24:34  profilanswer
 

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 ?
n°1383053
boulax
Inserer phrase hype en anglais
Posté le 07-06-2006 à 17:33:03  profilanswer
 

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.
n°1383152
etheriel
Posté le 07-06-2006 à 20:19:39  profilanswer
 

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
n°1383156
the real m​oins moins
Posté le 07-06-2006 à 20:24:25  profilanswer
 

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 ?
n°1383175
souk
Tourist
Posté le 07-06-2006 à 20:42:16  profilanswer
 

the real moins moins a écrit :

ben euh } finally { hein ...


 
ou un mwinmwin.CloseableCloseable ? [:dawa]

n°1383191
the real m​oins moins
Posté le 07-06-2006 à 21:07:20  profilanswer
 

ouais google:CloseableCloser :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le 07-06-2006 à 21:07:20  profilanswer
 

n°1383201
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2006 à 21:17:31  profilanswer
 

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)
n°1383437
etheriel
Posté le 08-06-2006 à 09:32:09  profilanswer
 

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
n°1383484
Bidem
Posté le 08-06-2006 à 10:32:28  profilanswer
 

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
n°1384101
post_it
Hmmmm!...
Posté le 08-06-2006 à 21:18:54  profilanswer
 

D'un autre côté, faire une classe sérialisable dont les membres ne le sont pas, c'est un peu maso...

n°1384431
brisssou
8-/
Posté le 09-06-2006 à 12:48:10  profilanswer
 

ç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
n°1384550
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-06-2006 à 14:40:24  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°1384836
etheriel
Posté le 09-06-2006 à 20:15:59  profilanswer
 

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
n°1384837
etheriel
Posté le 09-06-2006 à 20:17:41  profilanswer
 

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
n°1384838
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-06-2006 à 20:20:41  profilanswer
 

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)
n°1384844
the real m​oins moins
Posté le 09-06-2006 à 20:27:06  profilanswer
 

Harkonnen a écrit :

Exception renvoyées


[:mlc]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1384850
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-06-2006 à 20:47:22  profilanswer
 

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)
n°1384861
the real m​oins moins
Posté le 09-06-2006 à 21:02:12  profilanswer
 

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 ?
n°1385503
etheriel
Posté le 11-06-2006 à 22:26:01  profilanswer
 

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
n°1385613
Bidem
Posté le 12-06-2006 à 09:53:58  profilanswer
 

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
n°1385937
bartleby
Posté le 12-06-2006 à 17:21:52  profilanswer
 

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
 
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Determiner si un objet est "serializable"

 

Sujets relatifs
[java débutant] écrire dans une Jlist depuis un objet indépendant[C#] Les mystères de la représentation mémoire d'un objet Bitmap
[ASP.NET] Utiliser un objet comme propriété d'un WebControlc# Combobox d'objet qui cause problème
Déterminer le maxi d'une scrollbar par code VBAinstancier un objet a distance
Créer un objet à partir d'une chaîne de caractèresretrouver la largeur du "border style" d'un objet
traduire sous forme d'algorithme objet Idéplacer un objet de manière aléatoire
Plus de sujets relatifs à : Determiner si un objet est "serializable"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR