web-dev-qa-db-fra.com

Java: Qu'est-ce qui peut et ne peut pas être sérialisé?

Si la Serializable interface est simplement un Marker-Interface qui est utilisé pour transmettre une sorte de méta-donnée sur les classes en Java - je suis un peu confus:

Après avoir lu le processus de l'algorithme de sérialisation de Java (métadonnées de bas en haut, puis données d'instance réelles de haut en bas), je ne comprends pas vraiment quelles données ne peut pas soient traitées via cet algorithme.

En bref et formel:

  1. Quelles données peuvent provoquer la NotSerializableException?
  2. Comment savoir si je ne suis pas supposé ajouter la clause implements Serializable à ma classe?
21
MordechayS

Lorsque vous parlez de NotSerializableException, il est lancé lorsque vous souhaitez sérialiser un objet, qui n'a pas été marqué comme étant Serializable - c'est tout, même si vous étendez une classe non sérialisable et ajoutez une interface Serializable, elle convient parfaitement.

Il n'y a pas de données qui ne peuvent pas être sérialisées.

8
Michal Borek

Tout d'abord, si vous n'envisagez jamais de sérialiser une instance de votre classe, vous n'avez même pas besoin de penser à la sérialiser. N'implémentez que ce dont vous avez besoin et n'essayez pas de rendre votre classe sérialisable juste pour le plaisir de le faire.

Si votre objet a une référence (transitive ou directe) à un objet non sérialisable et que cette référence n'est pas marquée avec le mot clé transient, votre objet ne sera pas sérialisable.

Généralement, cela n'a aucun sens de sérialiser des objets qui ne peuvent pas être réutilisés lors d'une désérialisation ultérieure ou ailleurs. Cela peut être dû au fait que l'état de l'objet n'a de sens qu'ici et maintenant (s'il contient une référence à un thread en cours d'exécution, par exemple), ou s'il utilise des ressources telles qu'un socket, une connexion à une base de données ou quelque chose du genre. Un grand nombre d'objets ne représentent pas de données et ne devraient pas être sérialisables. 

12
JB Nizet

Tout ce que votre classe Serializable contient et qui n'est pas Serializable lève cette exception. Vous pouvez l'éviter en utilisant le mot clé transient

Les composants Swing et les threads sont des exemples courants de choses que vous ne pouvez pas sérialiser. Si vous y réfléchissez, cela a du sens car vous ne pourriez jamais les désérialiser et en avoir le sens. 

5
Daniel Kaplan

Tous les types de données primitifs et les classes s’étendent soit Serializable directement,

class MyClass extends Serializable{
}

ou indirectement,

class MyClass extends SomeClass{
}

SomeClass implémente Serializable.

peut être sérialisé. Tous les champs d'une classe sérialisable sont sérialisés à l'exception des champs marqués transient. Si une classe sérialisable contient un champ qui n'est pas sérialisable (pas primitif et ne s'étend pas de l'interface sérialisable), alors NotSerializableException sera levé.

Réponse à la deuxième question: Comme l'a dit @JB Nizet. Si vous voulez écrire l'instance d'une classe dans un flux, puis ne la marquez que comme étant Serializable, sinon ne marquez jamais une classe Serializable.

4
Sachin Gorade

Vous devez gérer la sérialisation de vos propres objets.

Java gérera les types de données primitifs pour vous.

Plus d'infos: http://www.tutorialspoint.com/Java/java_serialization.htm

3
Shane

Une exception NotSerialisable est émise lorsque quelque chose dans votre sérialisable est marqué comme sérialisable. Un tel cas peut être:

class Super{}
class Sub implements Serializable
{
Super super;

Ici, super n'est pas mentionné comme sérialisable, donc jette NotSerializableException.

2
Jain

Après avoir lu le processus de l'algorithme de sérialisation de Java (métadonnées de bas en haut, puis données d'instance réelles de haut en bas), je ne comprends pas vraiment quelles données ne peuvent pas être traitées via cet algorithme.

La réponse à cela est que certaines classes au niveau du système, telles que Thread, OutputStream et ses sous-classes, ne sont pas sérialisables. Très bien expliqué sur les documents Oracle: http://www.Oracle.com/technetwork/articles/Java/javaserial-1536170.html

Ci-dessous, le résumé:

D'autre part, certaines classes de niveau système telles que Thread, OutputStream et ses sous-classes et Socket ne sont pas sérialisables. En effet, cela n'aurait aucun sens s'ils l'étaient. Par exemple, les threads en cours d'exécution sur ma machine virtuelle utilisent la mémoire de mon système. La persister et essayer de l'exécuter dans votre machine virtuelle n'aurait aucun sens. 

1
Vishu Gupta

De manière plus pratique, aucun objet ne peut être sérialisé (via le mécanisme Intégré à Java) à moins que sa classe implémente l'interface Serializable . Le fait d'être une instance d'une telle classe n'est pas une condition suffisante, cependant. Pour que l'objet soit sérialisé correctement, il doit également indiquer true que toutes les références non transitoires qu'il contient doivent être nulles ou faire référence à des objets sérialisables. (Notez que ceci est une condition récursive.) Les valeurs primitives, les valeurs NULL et les variables transitoires ne posent pas de problème . Les variables statiques n'appartiennent pas à des objets individuels, elles ne le font donc pas. problème non plus.

Certaines classes courantes sont sûres pour la sérialisation. Les chaînes sont Probablement les plus remarquables ici, mais toutes les classes d'emballage pour les types primitifs Sont également sûres. Les tableaux de primitives sont sérialisables de manière fiable . Les tableaux de types de référence peuvent être sérialisés si tous leurs éléments peuvent être Sérialisés.

0
Pavan Kumar K

Quelles données peuvent provoquer la NotSerializableException?

En Java, nous sérialisons l'objet (l'instance d'une classe Java qui a déjà implémenté l'interface Serializable ). Il est donc très clair que si une classe n'a pas implémenté l'interface Serializable , elle ne peut pas être sérialisée (dans ce cas, NotSerializableException sera levé).

L’interface Serializable n’est qu’une interface marker-interface. En un sens, il s’agit d’un tampon sur une classe et indique à la JVM que cette classe peut être sérialisée.

Comment devrais-je savoir que je ne suis pas censé ajouter les outils Clause sérialisable pour ma classe?

Tout dépend de vos besoins.

  1. Si vous voulez stocker le Object dans une base de données, vous pouvez sérialisez-le en une séquence d'octet et pouvez le stocker dans le fichier base de données en tant que données persistantes.

  2. Vous pouvez sérialiser votre Object pour qu’il soit utilisé par une autre machine virtuelle qui fonctionne Sur une autre machine. 

0