Interface sérialisable en Java avec des exemples

Publié: 2021-11-29

Java propose plusieurs packages, dont l'interface Serializable en fait partie. Il est présent dans le package Java java.io et est un type d'interface de marqueur. Lorsqu'il est défini comme une interface de marqueur, il n'y a pas de méthodes ou de champs présents dans l'interface. Ainsi, chaque fois que des classes implémentent l'interface, l'interface n'est pas obligée d'implémenter des méthodes. Les classes implémentent l'interface si une classe souhaite que ses instances soient sérialisées ou désérialisées.

Le mécanisme de sérialisation est utilisé pour la conversion d'un état d'objet en un flux d'octets. Ce mécanisme est exécuté en utilisant l'ObjectOutputStream. Le processus de désérialisation est tout le contraire du processus de sérialisation. Dans ce cas, le flux d'octets est reconverti en objet de Java. ObjectInputStream est utilisé pour la désérialisation.

Table des matières

Sérialisation

La conversion de l'état de n'importe quel objet en un flux d'octets est connue sous le nom de sérialisation. Et le contraire de la sérialisation est la désérialisation. Un objet de Java peut être converti en un flux d'octets statiques. Ce flux statique peut ensuite être enregistré sur une base de données, ou il peut également être transféré sur un autre réseau. Le processus de sérialisation dépend de l'instance. Cela signifie que la sérialisation des objets peut être effectuée sur une plate-forme, puis la désérialisation des objets peut être effectuée sur une autre plate-forme. Un type particulier d'interface de marqueur, "sérialisable", est mis en œuvre pour le processus de sérialisation. Ainsi, les classes éligibles à la sérialisation, c'est-à-dire la classe sérialisable en Java , doivent implémenter l'interface de marqueur.

Ce mécanisme d'écriture d'un état d'objet dans un flux d'octets est connu sous le nom de sérialisation. Le mécanisme est principalement utilisé dans les technologies JMS, EJB, JPA, RMI et Hibernate.

ObjectInputStream et ObjectOutputStream sont les formes de classes de haut niveau qui étendent java.io.InputStream et java.io.OutputStream. Les types primitifs et les graphiques d'objets peuvent être écrits dans OutputStream par ObjectOutputStream dans un octet

flux. Le flux résultant de la conversion peut être lu via ObjectInputStream. Ainsi, pour la sérialisation, la méthode writeObject() est appelée depuis ObjectOutputStream et pour la désérialisation, la méthode readObject() est appelée depuis la classe ObjectInputStream.

La méthode la plus importante dans ObjectOutputStream est :

La ligne de code ci-dessus est tirée de https://www.baeldung.com/java-serialization.

Dans la ligne de code ci-dessus, un objet qui est sérialisable est pris, puis il est converti en un flux ou un flux d'octets.

Dans le cas d'ObjectInputStream, la méthode la plus critique est :

La ligne de code ci-dessus est tirée de https://www.baeldung.com/java-serialization.

La ligne de code ci-dessus peut lire la séquence d'octets et convertir ce flux d'octets en un objet Java. L'objet d'origine peut être renvoyé à travers cela.

Une illustration du processus de sérialisation peut être décrite ci-dessous :

Une classe "Person" est considérée pour la sérialisation. Les champs statiques ne sont pas sérialisés et appartiennent à certaines classes. Les champs de classe peuvent être ignorés en utilisant le mot-clé "transient" dans le processus de sérialisation.

La source

L'objet du type de personne peut être enregistré dans un fichier local, puis la valeur est relue. Le code ci-dessous peut être utilisé à cette fin.

ObjectOutputStream a été utilisé pour enregistrer l'état de l'objet dans un fichier en utilisant FileOutputStream. Dans cet exemple, un fichier nommé "votrefichier.txt" a été créé dans le répertoire du projet. Grâce à l'utilisation de FileInputStream, le fichier créé est chargé. Ce flux est ensuite récupéré par ObjectInputStream et est converti en un nouvel objet portant le nom p2. L'état de l'objet chargé est finalement testé et il est mis en correspondance avec l'état de l'objet d'origine. L'objet qui est chargé doit être transtypé explicitement à la personne typique.

Mises en garde dans la sérialisation Java

1. Héritage et composition

Chaque fois qu'un utilisateur implémente l'interface java.io.Serializable, toutes les sous-classes de classe qui implémentent l'interface deviennent sérialisables. De plus, si un objet contient une référence à un objet différent, les objets référencés pour implémenter l'interface sont sérialisables séparément ; si ces objets n'implémentent pas l'interface, une exception sera levée. L'exception levée sera NotSerializableException. De plus, si supposons qu'un tableau d'objets soit stocké dans un objet sérialisable, tous les objets du tableau doivent être sérialisés. Si aucune sérialisation des objets ne se produit, l'exception "NotSerializableException" sera levée.

2. UID de la version série

Pour chaque classe qui implémente l'interface Serializable, un numéro est associé à chacune des classes. Le numéro est associé à la machine virtuelle Java. Ceci est principalement fait pour vérifier que les objets qui sont chargés et enregistrés ont les attributs exacts. Ce n'est que si les attributs sont identiques que les objets seront compatibles lors de la sérialisation. Les IDE génèrent ces numéros automatiquement et sont principalement basés sur les noms de la classe, ses attributs et les modificateurs d'accès qui lui sont associés. Une exception, « InvalidClassException », sera levée si un nombre différent résulte des modifications.

Si un serialVersionUID n'est pas déclaré par une classe sérialisable, la JVM le générera automatiquement lors de l'exécution. Bien qu'il y ait une génération automatique du numéro, il est toujours recommandé que les classes déclarent un serialVersionUID. En effet, le serialVersionUID, qui sera généré automatiquement, dépendra du compilateur et peut parfois lancer des InvalidClassExceptions inattendues.

3. Sérialisation personnalisée

Une méthode par défaut a été définie en Java pour la sérialisation des objets. Java peut remplacer ce comportement par défaut. Il existe un moyen de sérialisation personnalisée. Il est particulièrement utile dans les cas où l'objet ayant des attributs non sérialisables est tenté d'être sérialisé. La sérialisation de tels objets peut être effectuée via deux méthodes au sein d'une classe que l'utilisateur souhaite sérialiser. Ces deux méthodes sont :

Les deux méthodes ci-dessus peuvent être utilisées pour sérialiser les attributs dans n'importe quelle forme pouvant être sérialisée, qui était auparavant non sérialisable.

Avantages de la sérialisation en Java

L'un des avantages de la sérialisation en Java est que l'état d'un objet peut être parcouru sur un réseau.

L'interface Java java.io.Serializable

java.io.Serializable est une interface de marqueur, ce qui signifie qu'il n'y a pas de méthodes et d'objets dans l'interface. La fonction principale de l'interface du marqueur est de marquer le

classes de Java pour donner une capacité particulière à tous les objets des classes. Des exemples d'interfaces de marqueur sont Remote et Cloneable.

L'interface doit être implémentée par toute classe qui utilise l'interface pour sérialiser ses objets. Par défaut, les classes telles que les classes wrapper et la classe String implémentent l'interface java.io.Serializable.

Un exemple java sérialisable est présenté ci-dessous.

Dans le code ci-dessus, on peut observer que la classe Student implémente l'interface Serializable. Par conséquent, une fois que la classe implémente l'interface Serializable, les objets de la classe peuvent être convertis en octets de flux.

  • Classe ObjectOutputStreamObjectOutputStream class

Cette classe est utilisée pour écrire les types primitifs de données et les objets Java dans OutputStream. L'objet qui prend en charge l'interface java.io.Serializable peut être utilisé pour être écrit dans des flux.

  • Classe ObjectInputStreamObjectInputStream class

Toutes les données primitives qui ont été écrites à l'aide de ObjectOutputStream sont désérialisées à l'aide de ObjectInputStream.

Un exemple d'interface sérialisable en Java est présenté ci-dessous.

Dans cet exemple, la classe Student va être sérialisée. La méthode writeObject() de la classe ObjectOutputStream fournit toutes les fonctionnalités de sérialisation des objets. L'état de l'objet est enregistré dans un fichier nommé f.txt.

conclusion

L'article abordait le concept de sérialisation en Java. Il énumérait les interfaces et les autres méthodes importantes requises pour sérialiser les objets d'une classe. Le processus de sérialisation est toujours associé à un identifiant ou un numéro à chaque classe sérialisable. Ce numéro est appelé SerialVersionUID. L'utilisation principale de SerialVersionUID est de vérifier l'expéditeur et le destinataire de l'objet à sérialiser. En effet, l'expéditeur et le destinataire doivent être identiques.

C'est une caractéristique importante du langage de programmation Java. Si vous souhaitez en savoir plus sur ces fonctionnalités et concepts importants de Java et maîtriser vos compétences en langage de programmation, vous pouvez consulter les cours de génie logiciel proposés par upGrad. Si vous êtes un professionnel en activité, le cours est le mieux adapté pour vous. Pour toute forme de questions, notre équipe d'assistance peut être contactée. Vous pouvez également parcourir notre site Web pour le cours spécifique et obtenir des informations détaillées.

Qu'est-ce qu'une interface sérialisable en Java ?

L'interface sérialisable est une interface de marqueur. L'interface de marqueur fournit un indice au runtime Java que la classe d'implémentation se permet d'être sérialisée. Le runtime profitera de cette interface pour sérialiser l'objet. L'interface sérialisable en Java est une interface spéciale à implémenter par les classes de données en Java. Lorsqu'une classe implémente cette interface, elle peut être conservée dans une base de données. Cette interface est déclarée dans le package java.io. L'interface sérialisable a deux méthodes, readResolve() et writeReplace() , qui sont utilisées pour lire et écrire un objet dans la base de données.

Que se passe-t-il si nous implémentons l'interface sérialisable en Java ?

L'implémentation de l'interface sérialisable en Java signifie avoir un objet qui peut être sérialisé et désérialisé dans n'importe quel système ayant une interface sérialisable. L'implémentation d'une telle interface serait efficace lorsque la classe est sérialisée en externe par des bibliothèques tierces (JSON, XML, etc.) ou par des protocoles réseau. Lorsqu'une variable est déclarée comme sérialisable, chaque instance de la variable sera sérialisée et désérialisée si elle est passée en paramètre à une méthode ou lorsqu'elle est renvoyée par une méthode. La sérialisation est effectuée par programmation afin que l'état d'un objet puisse être conservé pour plus tard, lorsqu'il doit être désérialisé et présenté à l'utilisateur de l'objet.

Pouvons-nous transférer un objet sérialisé via le réseau ?

Un objet sérialisé est un objet qui contient un flux d'octets. Le constructeur de l'objet ou les méthodes writeObject() / readObject() sont utilisées pour placer le flux d'octets dans l'objet. Les données stockées peuvent être du texte, de l'audio, de la vidéo ou toute donnée d'application personnalisée. Les données de ces objets peuvent être stockées dans un fichier ou sur un serveur distant. Pour transférer des objets sérialisés via le réseau, il faut utiliser le protocole RMI (Remote Method Invocation). RMI est un bon protocole pour créer des applications distribuées. Il permet au client de communiquer avec des méthodes sur des objets dans une application Java s'exécutant sur un serveur. Le protocole RMI est un mécanisme d'appel de procédure distante ( RPC ).