Pourquoi est-il nécessaire de marquer une classe comme sérialisable?

Si une question similaire est déjà postée sur stackoverflow, veuillez simplement poster le lien.

Quel est le besoin d’implémenter une interface sérialisable (sans méthodes) pour les objects à sérialiser? L’API Java dit: – Si ce n’est pas implémenté, il lancera une exception java.io.NotSerializableException.

C’est à cause du code suivant dans ObjectOutputStream.java

............................ writeObject0(Object obj, boolean unshared){ ............. } else if (cl.isArray()) { writeArray(obj, desc, unshared); } else if (obj instanceof Serializable) { writeOrdinaryObject(obj, desc, unshared); } else { throw new NotSerializableException(cl.getName()); } ................ 

Mais ma question est de savoir pourquoi il est nécessaire d’implémenter Serializable et d’informer ou de dire à Java / JVM qu’une classe peut être sérialisée. (Est-ce seulement pour éviter l’exception?).

Dans ce cas, si nous écrivons une fonctionnalité similaire qui écrit des objects dans des stream sans vérifier si la classe d’une instanceOf Serializable, les objects d’une classe ne mettant pas en oeuvre Serializable sérialisé?

Toute aide est appréciée.

C’est une bonne question. Serializable est connu comme une interface de marqueur et peut être vu comme une balise sur une classe pour l’identifier comme ayant des capacités ou des comportements. Par exemple, vous pouvez l’utiliser pour identifier les classes que vous souhaitez sérialiser et pour lesquelles aucun serialVersionUid n’a été défini (ce qui peut être une erreur).

Notez que la bibliothèque de sérialisation couramment utilisée, XStream (et autres), ne nécessite pas la définition de Serializable.

Il est nécessaire pour que la machine virtuelle Java puisse savoir si une classe peut être sérialisée en toute sécurité. Certaines choses (connexions de firebase database par exemple) contiennent des états ou des connexions à des ressources externes qui ne peuvent pas vraiment être sérialisées.

En outre, vous devrez vous assurer que vous insérez un membre serialVersionUID dans chaque classe sérialisable afin de vous assurer que les objects sérialisés peuvent être désérialisés après un changement de code ou une recompilation:

 // Set to some arbitrary number. // Change if the definition/structure of the class changes. private static final long serialVersionUID = 1; 

La sérialisation vous permet de sauvegarder des objects directement dans des fichiers binarys sans avoir à les parsingr en texte, écrire la chaîne, puis créer un nouvel object, et parsingr les entrées de chaîne lors de la lecture. L’objective principal est de vous permettre de sauvegarder des objects. avec toutes leurs données dans un fichier binary. Je l’ai trouvé extrêmement utile lorsque je devais travailler avec des listes chaînées contenant de nombreux objects du même type et j’avais besoin de les enregistrer et de les ouvrir.

La raison en est que toutes les classes ne peuvent pas être sérialisées. Exemples:

  • Contenu I / O: InputStream, connexions HTTP, canaux. Ils dépendent d’objects créés en dehors du domaine de la machine virtuelle Java et il n’existe pas de moyen simple de les restaurer.

  • Ressources du système d’exploitation telles que fenêtres, images, etc.