Comment sérialiser un non sérialisable en Java?
Comment puis-je sérialiser un objet qui n'implémente pas Serializable? Je ne peux pas le marquer sérialisable car la classe provient d'une bibliothèque tierce.
5 réponses
Vous ne pouvez pas sérialiser une classe qui n'implémente pas Serializable
, mais vous pouvez l'envelopper dans une classe qui le fait. Pour ce faire, vous devez implémenter readObject
et writeObject
sur votre classe wrapper afin que vous puissiez sérialiser ses objets de manière personnalisée.
- Tout d'abord, créez votre champ non sérialisable
transient
. - dans
writeObject
, appelez d'aborddefaultWriteObject
sur le flux pour stocker tous les champs non transitoires, puis appelez d'autres méthodes pour sérialiser les propriétés individuelles de votre objet non sérialisable. - dans
readObject
, appelez d'aborddefaultReadObject
sur le flux pour lire tous les champs non transitoires, puis appelez d'autres méthodes (correspondant à celles que vous avez ajoutées àwriteObject
) pour désérialiser votre objet non sérialisable.
J'espère que cela a du sens. :-)
Enveloppez la classe non sérialisable dans une classe qui implémente Serializable
. Dans la méthode writeObject
de votre classe, faites tout ce qui est nécessaire pour sérialiser suffisamment d'informations sur l'objet non sérialisable afin que la méthode readObject
de votre classe puisse la reconstruire.
Sinon, contactez le développeur de la classe non sérialisable et dites-lui de la réparer. :-)
Si votre classe implémente déjà L'interface sérialisable (requise pour la sérialisation), tout ce que vous devez faire est de déclarer le champ que vous ne voulez pas sérialiser avec transient:
public transient String description;
Vous pouvez utiliser Kryo. Cela fonctionne sur des classes non sérialisées mais les classes doivent être enregistrées à l'avance.
Si la classe n'est pas FINALE, Vous pouvez créer votre propre classe qui l'étend et implémente Serializable. Il y a beaucoup d'autres façons de sérialiser en plus du mécanisme intégré de Java.