Il y a une classe que je veux sérialiser, et elle implémente sérialisable, mais l'un des objets qu'il contient ne met pas en œuvre sérialisable. P>
Y a-t-il un moyen de modifier la classe au moment de l'exécution pour le faire implémenter l'interface sérialisable afin que je puisse le sérialiser? Je ne peux pas le changer lors de la compilation, car sa bibliothèque tierce partie. P>
Peut-être que je devrais utiliser une sorte d'écrivain de bytecode ou quelque chose? P>
Edit: La classe contenant et la classe contenue se trouve dans la bibliothèque tierce de la 3ème partie, donc je ne pense pas pouvoir marquer quelque chose comme transitoire. La classe contenant est em> marquée comme sérialisable, mais elle contient un objet qui n'est pas. P>
Je vais bien avec la rédaction d'une méthode de sérialisation personnalisée pour la classe, je ne sais pas comment je ferais cela, est-ce que je devrais utiliser la réflexion pour obtenir les valeurs des variables privées? P>
5 Réponses :
Les champs peuvent être ignorés à l'aide du modificateur transitoire code>. Des données supplémentaires peuvent être ajoutées au flux en fournissant
lishObject code> et
WriteObject code> méthodes. Les classes peuvent être sous-classées pour les rendre sérialisables (bien que vous devrez gérer les données de superclasse) ou utiliser un proxy série (voir Java efficace). P>
lire le Javadoc pour Serializable, je vois:
cours qui nécessitent une manipulation spéciale pendant la sérialisation et Le processus de désérialisation doit mettre en œuvre méthodes spéciales avec ces Signatures: p> blockQuote>
xxx pré> que vous pouvez utiliser pour sérialiser manuellement les champs non coopératifs. Vous pouvez rechercher à l'aide de l'ASM, mais il semble difficile de croire qu'il s'agit d'une solution maintenable. P> p>
Utilisez une interface externalisable Java.sun.com/j2se/1.3 /docs/api/java/io/externalisable.html
La classe contenant est également dans la bibliothèque tierce, donc je ne pense pas pouvoir y ajouter ces méthodes.
Si une classe n'est pas marquée comme sérialisable qui pourrait être de bonnes raisons (prendre des connexions de base de données à titre d'exemple). Donc, tout d'abord, vous vous efforcez de préciser si vous avez vraiment besoin de sérialiser cet objet aussi. Si vous avez juste besoin de sérialiser l'objet environnant, vous pouvez envisager de marquer l'objet contenu comme transitoire. p>
Tout d'abord, êtes-vous vraiment em> besoin de faire cela? Peut-être que la classe dans la bibliothèque tiers n'est pas sérialisable par design. Même si c'est juste une omission plutôt qu'une décision délibérée, il est suffisamment facile d'écrire une méthode de sérialisation personnalisée dans une classe d'assistance. Si vous avez em> pour le faire (comme je l'ai dû, pour quelque chose de similaire). Jetez un coup d'œil à Javassist . Vous pouvez faire quelque chose comme ceci: ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("mypackage.MyClass");
cc.addInterface(pool.get("java.io.Serializable"))
À propos de l'écriture de la méthode de sérialisation personnalisée dans une classe d'assistance: Comment ferais-je cela? Dois-je utiliser la réflexion pour obtenir les valeurs variables privées?
MDR. Cette réponse est déjà i> le troisième résultat de Google pour "Serialization Java tiers" 32 minutes après la question de la question.
Vous pouvez utiliser java.lang.reflect.proxy pour ajouter l'interface sérialisable aux instances d'objet sur lesquelles vous n'avez pas de contrôle de cycle de vie (c'est-à-dire que vous ne pouvez pas les subcallasser) et les obtenir sérialisées de cette manière. Mais alors vous ne seriez toujours pas en mesure de les lire sans un autre hack (c'est-à-dire introduire une classe de substitution). P>
Je recommanderais de rechercher une alternative au mécanisme sérialisable Java en général. Il est à peu près brisé par design de plusieurs manières. P>
Il est étrange que tant de développeurs sont tout à fait bien avec la sérialisation de Java de Java. Rouler votre propre sérialisation est une solution horrible - tant de bibliothèques / frameworks Java standard utilisent sérialisable - êtes-vous censé programmer une solution de contournement pour chacun d'entre eux?