Questions et réponses de l'entretien sur la sérialisation Java [Pour les débutants et les expérimentés]
Publié: 2020-09-25Java est l'un des meilleurs langages de programmation au monde. Nous avons eu la chance de voir Java se développer au fil du temps et devenir le langage massivement populaire que nous connaissons aujourd'hui. Ces améliorations, qui ont été apportées en Java, ont conduit à l'inclusion de certaines fonctionnalités vraiment cruciales qui définissent la façon dont nous écrivons des programmes aujourd'hui. L'une de ces fonctionnalités est la sérialisation.
Dans son essence, la sérialisation n'est qu'un mécanisme utilisé pour stocker un objet dans la mémoire. Ainsi, lorsque nous disons que nous sérialisons un objet, nous voulons dire que nous convertissons l'objet en question de l'état qu'il était en un flux d'octets. Cette conversion de son état natif au flux d'octets facilite l'écriture de cet objet dans un fichier.
Ce fichier peut ensuite être transporté où nous le souhaitons, et pour accéder à l'objet et à ses fonctionnalités, il suffit de désérialiser l'objet. La désérialisation, comme son nom l'indique, est l'opposé de la sérialisation. Ici, nous convertissons le flux de l'octet dans l'état natif de l'objet pour utiliser l'objet.
La sérialisation permet aux développeurs d'écrire leur code avec un certain niveau de flexibilité. La possibilité de prendre l'objet et de l'utiliser avec sa propriété native ailleurs est cruciale dans le flux de travail d'aujourd'hui. Pas étonnant que les recruteurs veuillent que leurs employés potentiels en sachent plus sur la sérialisation d'objets en Java.
Que vous ayez utilisé ou non la sérialisation dans vos projets, vous ne pouvez pas simplement en laisser passer l'importance. Donc, pour vous aider dans vos efforts pour devenir un développeur Java professionnel, nous avons rassemblé quelques questions d'entretien fascinantes sur la sérialisation Java, que vous trouverez ci-dessous.
Questions d'entretien sur la sérialisation Java
Q1. Qu'entendez-vous par sérialisation dans le contexte du langage de programmation Java ?

Rép. La définition de la sérialisation est peut-être la plus basique mais l'une des questions les plus fréquemment posées dans le contexte de la sérialisation Java. Vous devrez répondre à cette question dans presque toutes les interviews. Par conséquent, vous devez avoir une bonne définition de la sérialisation Java instillée dans votre esprit. Ainsi, la sérialisation n'est rien d'autre que la façon dont un objet écrit en Java est converti en un flux d'octets.
L'objectif principal est de permettre le transfert de l'objet vers une autre machine ou de sauvegarder l'état de l'objet dans un fichier ou de sauvegarder l'état de l'objet dans une base de données. Une fois que l'objet est sérialisé avec succès, nous pouvons rapidement ramener l'objet dans son ancienne gloire en désérialisant simplement l'objet.
Q2. Comment pouvons-nous sérialiser un objet en Java ? Écrivez un programme pour sérialiser et désérialiser l'objet.
Rép. En entrevue, si vous êtes en mesure d'augmenter vos connaissances théoriques avec la capacité d'écrire un programme, les chances d'être sélectionné augmentent automatiquement. Il est également donné que dans tout entretien, vous serez chargé d'écrire un programme de base (au moins un programme de base), qui montre comment se produisent la sérialisation et la désérialisation. Avant d'écrire ce programme vous-même, vous devez vous rappeler une chose clé à propos de la sérialisation d'objets en Java.
Pour sérialiser un objet, vous devez écrire l'objet qui utilise l'interface de classe java.io.Serializable. Vous devez vous assurer que vous utilisez une interface Marker pour l'objet de la classe que vous souhaitez sérialiser. Cela signifie que la classe en question ne doit pas avoir de méthodes écrites dans la classe. Cette classe doit également indiquer à la machine virtuelle Java que l'objet suivant devra changer de forme et façonner un flux d'octets.
Le code de sérialisation est écrit ci-dessous.
OutputStream fout = new FileOutputStream("ser.txt");
ObjectOutput oout = new ObjectOutputStream(fout);
Système. out .println("Le processus de sérialisation a commencé, sérialisation des objets employés...");
oout.writeObject(object1);
Le code de désérialisation est écrit ci-dessous.
InputStream fin= nouveau FileInputStream("ser.txt");
ObjectInput oin= new ObjectInputStream(fin);
Système. out .println("Le processus de désérialisation a commencé, affichage des objets employés...");
Employé emp ;
emp=(Employé) oin.readObject();
Apprendre : Allocation de mémoire en Java : tout ce que vous devez savoir
Q3. Quelle est la différence entre les interfaces pour la sérialisation et externalisable ?
Rép. Cette question pourrait signifier la différence entre vous être sélectionné pour le poste ou non. Supposons que vous réussissiez à répondre à cette question de manière très complète. Dans ce cas, l'intervieweur sera forcément impressionné par vos connaissances sur ce sujet, et les chances de votre sélection pour le poste monteront automatiquement en flèche. Vous trouverez toutes les différences critiques dans le tableau ci-dessous :
Les propriétés sur lesquelles nous comparons ces deux méthodes. | SÉRIALISABLE | EXTERNALISABLE |
Méthodes présentes dans les classes de ces deux interfaces différentes | Il s'agit d'une interface de marqueur. Les interfaces de marqueur ne peuvent pas avoir de fonctions membres. Ils doivent être vides sauf qu'ils doivent contenir une instruction qui indique à la machine virtuelle Java que l'objet de cette classe doit être converti en un flux d'octets. | Ce n'est pas une interface de fabricant, ce qui signifie qu'il a des méthodes membres. Il a des méthodes appelées writeExternal () et readExternal () |
Quelle est leur méthode de sérialisation par défaut ? | Pour sérialisable, vous trouverez une manière par défaut de sérialiser les objets que vous écrivez. Tout ce que vous auriez à faire en tant que programmeur serait de trouver un moyen d'intégrer cette interface dans votre programme. | Vous ne trouverez pas de méthode par défaut pour implémenter la sérialisation. Vous devrez écrire vos propres méthodes ou remplacer celles qui existent déjà. |
Quelle est la manière dont ils mettent en œuvre le processus de sérialisation ? | Vous pouvez personnaliser la manière dont la sérialisation est implémentée dans cette interface. Cependant, vous ne pouvez pas remplacer les méthodes existantes. Vous devrez implémenter ces méthodes dans votre propre classe pour obtenir le degré de liberté que vous désirez. | Dans cette méthode, vous devrez remplacer les méthodes par défaut. Donc, si vous souhaitez implémenter une méthode personnalisée pour sérialiser l'objet, vous devez choisir cette interface plutôt que la méthode par défaut de Serializable. |
Quel est le degré de contrôle qu'ils offrent dans le processus de sérialisation, | Vous trouverez une petite marge de manœuvre lorsque vous utilisez cette interface. Vous devez également écrire les fonctions par défaut dans votre classe pour tirer le meilleur parti de cette méthode. Cependant, ce n'est pas obligatoire pour vous, ce qui signifie que vous pourrez toujours sérialiser des objets avec cette interface sans écrire les fonctions par défaut dans votre classe personnalisée. | Cette interface offre un excellent contrôle sur l'ensemble du processus. Pour cette seule raison, si vous utilisez cette interface, il vous sera obligatoire d'écrire les deux méthodes dans votre classe personnalisée. |
Quel est le constructeur utilisé lors de l'utilisation de la désérialisation, | Il n'y a pas de constructeur appelé pendant le processus de sérialisation. | Il y a un appel au prestataire lors de la sérialisation des objets à l'aide de cette interface. |
Q4. Écrivez un programme dans lequel vous implémentez le processus personnalisé de sérialisation et de désérialisation.

Rép. Voici la partie délicate. C'est la question à travers laquelle vous pouvez montrer toutes les connaissances de la question précédente à travers un scénario de cas d'utilisation pratique. La possibilité pour vous d'être en mesure d'écrire ces programmes démontrera clairement votre expertise et vous aidera à obtenir le travail que vous voulez.
Écrit ci-dessous, vous trouverez la manière personnalisée d'écrire la méthode writeObject().
private void writeObject(ObjectOutputStream os) {
Système. out .println("Dans, méthode writeObject().");
essayer {
os.writeInt( this .id);
os.writeObject( this .name);
} capture (Exception e) {
e.printStackTrace();
}
}
Écrit ci-dessous, vous trouverez l'implémentation personnalisée de la dé-serliasation.
private void readObject(ObjectInputStream ois) {
Système. out .println("Dans, méthode readObject().");
essayer {
id=ois.readInt();
name=(String)ois.readObject();
} capture (Exception e) {
e.printStackTrace();
}
}
Q5. Comment implémenterez-vous la sérialisation et la désérialisation à l'aide de l'interface externalisable ?
Rép. Pour implémenter la sérialisation et la désérialisation à l'aide de l'interface externalisable, vous devrez écrire vous-même les fonctions writeExternal() et readExternal(). Vous trouverez le code pour les deux écrit ci-dessous.
Personnalisation de la méthode writeExternal()
Publique annuler writeExternal (ObjectOutput oo) lance IOException {
Système. out .println("in writeExternal()");
oo.writeInt(id);
oo.writeObject(nom);
}
Personnalisation de la méthode readExternal()
Publique annuler readExternal (ObjectInput in) lève IOException, ClassNotFoundException {
Système. out .println("in readExternal()");
this .id=in.readInt();
this .name=(String)in.readObject();
}
Lisez à propos de : Python vs Java en 2020 : Lequel choisir ?
Q6. Supposons que vous ne souhaitiez pas qu'une variable spécifique soit sérialisée. Que ferez-vous pour empêcher que les variables membres que vous ne souhaitez pas soient sérialisées ?
Rép. C'est une question hautement conceptuelle. Vous devez connaître les variables statiques et non statiques pour pouvoir répondre rapidement à cette question. Supposons que vous souhaitiez qu'une variable particulière ne soit pas sérialisée. Dans ce cas, vous devrez les rendre statiques car la valeur de toute variable statique ne peut pas être modifiée, et donc pour cette raison, elles ne seront pas non plus sérialisées.
Q7. Que voulez-vous dire par serialVersionUID ?
Rép. Pour chaque classe que nous voulons sérialiser, un numéro de classe leur serait attribué. Ce numéro, qui est attribué à chaque classe à sérialiser, est appelé un serialVersionUID. Cet identifiant est essentiel car, au moment de récupérer l'objet dans sa forme native, la machine virtuelle Java recherche l'identifiant qui est associé à l'objet.
Ensuite, il se réfère rapidement à l'ID des classes qui étaient censées être sérialisées. Lorsqu'il trouve la classe correspondante à laquelle appartient cet objet, le processus de désérialisation commence.
Q8. Disons que nous avons oublié de mentionner ou de définir le serialVersionUID. Quel sera l'impact de cette action sur le programme que nous avons rédigé ?
Rép. Cette question est une autre question fondamentale. Vous auriez besoin d'un morceau de connaissances solides pour être en mesure de répondre correctement à cette question. La première chose que nous devons clarifier est que serialVersionUID est utilisé pour contrôler la version de l'objet dans la question. Disons qu'il n'y a pas d'ID défini pour la classe, de sorte que le compilateur Java ne saurait pas à quelle classe appartient l'objet. Au moment de l'exécution ou lorsque vous sérialisez l'objet, il n'y aura pas d'erreurs car il n'est pas nécessaire en soi de définir un ID.

Cependant, lorsque nous voulons que le flux de données soit converti en objet, le compilateur Java génère une erreur. Le compilateur ne saura pas à quelle classe appartient l'objet et ne pourra donc pas trouver et connecter toutes les fonctions membres et les variables associées à cet objet. Étant donné que le compilateur sera bloqué à cette étape, il générera une erreur de non-concordance de serialVersionUID (java.io.InvalidClassException).
Q9. Dans le cas où nous ne pouvons pas sérialiser, ou si la méthode de sérialisation n'est pas disponible, existe-t-il une autre méthode par laquelle nous pourrions transférer l'objet que nous avons écrit sur un réseau ?
Rép. Il existe quelques méthodes dans lesquelles nous pourrions transférer l'objet que nous avons écrit sur un réseau. Vous en trouverez quelques-uns ci-dessous.
- Vous pouvez essayer de convertir l'objet en un fichier JSON. Il n'est pas si difficile de convertir l'objet en une chaîne JSON, et lorsque vous avez écrit le fichier JSON, sa conversion en fichier de code n'est pas non plus très difficile. Ainsi, vous pouvez transférer la chaîne JSON, que vous avez écrite sur le réseau.
- Vous pouvez également utiliser l'outil Hibernate (il s'agit d'un outil ORM). Cet outil permet à l'objet de persister dans la base de données. Ensuite, l'objet qui est écrit peut également être très facilement lu plus tard.
- Vous pouvez également utiliser la technologie XML. Vous pouvez essayer de convertir l'objet en un fichier XML, puis vous pouvez rapidement transférer ce fichier via le réseau.
Doit lire: Les 24 meilleures questions et réponses d'entrevue Java
Emballer
Si vous souhaitez en savoir plus sur Java, les OOP et le développement de logiciels à pile complète, consultez le diplôme PG upGrad & IIIT-B en développement de logiciels à pile complète qui est conçu pour les professionnels et offre plus de 500 heures de formation rigoureuse, 9 + projets et affectations, statut d'ancien de l'IIIT-B, projets de synthèse pratiques et aide à l'emploi avec les meilleures entreprises.