6
votes

En Java, est-il possible d'ajouter l'interface sérialisable à la classe qui ne l'a pas au moment de l'exécution?

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.

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.

Peut-être que je devrais utiliser une sorte d'écrivain de bytecode ou quelque chose?

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 marquée comme sérialisable, mais elle contient un objet qui n'est pas.

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?


0 commentaires

5 Réponses :


3
votes

Les champs peuvent être ignorés à l'aide du modificateur transitoire . Des données supplémentaires peuvent être ajoutées au flux en fournissant lishObject et WriteObject 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).


0 commentaires

5
votes

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

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.


2 commentaires

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.



0
votes

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.


0 commentaires

1
votes

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


2 commentaires

À 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à le troisième résultat de Google pour "Serialization Java tiers" 32 minutes après la question de la question.



0
votes

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

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.


1 commentaires

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?