java.io.WriteAbortedException: écriture avortée; java.io.Notserialisableexception

Qu'est-ce qui cause ce genre d'erreur dans Tomcat?

SEVERE: Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:
   bean.ProjectAreaBean
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
 at java.util.ArrayList.readObject(ArrayList.java:593)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(
    DelegatingMethodAccessorImpl.java:25)
15
demandé sur Eric Leschinski 2010-02-19 09:46:47

2 réponses

mettre en œuvre Serializable

si vous recevez un NotSerializableException comme suit,

java.io.NotSerializableException: bean.ProjectAreaBean

alors cela signifie simplement que la classe identifiée par le nom entièrement qualifié dans le message d'exception (qui est bean.ProjectAreaBean dans votre cas) ne met pas en œuvre l'interface Serializable alors qu'il est prévu par le code derrière. La fixation est relativement simple, il suffit de laisser la classe implémente l'interface Serializable .

package bean;

import java.io.Serializable;

public class ProjectAreaBean implements Serializable {
    private static final long serialVersionUID = 1L;

    // ...
}

le champ serialVersionUID n'est pas nécessaire, mais fortement recommandé car il maintient la compatibilité binaire entre les différentes versions de la classe et les représentations sérialisées de ses instances. Donc quand vous ajoutez plus tard un nouveau champ serialisable à la classe, alors vous devez changer le champ serialVersionUID (généralement juste incrémenter de 1 est suffisant) pour prévenir les problèmes pendant la désérialisation d'une instance d'une ancienne version de la classe. IDEs comme Eclipse offrent également une option pour (re)générer la valeur serialVersionUID qui est essentiellement un hachage calculé sur la base de tous les champs.

voir aussi:


Marque unserializable champs transient

si votre classe Serializable contient à son tour un champ / propriété faisant référence à une instance d'une autre classe qui ne peut absolument pas être faite Serializable , alors vous devez le marquer transient . De cette façon, il sera ignoré lors de la sérialisation de la classe.

private transient SomeObject thisWillNotBeSerialized;

vous devez comprendre qu'après la desérialisation ce champ deviendra toujours null . Notez que les blocs de construction et d'initialisation de la classe sont et non invoqués lors de la desérialisation. Si vous souhaitez avoir un contrôle plus fin sur la sérialisation et la desérialisation, alors outrepassez les méthodes readObject() et writeObject() . Vous vous trouverez des exemples concrets dans les liens ci-dessous:


pourquoi la sérialisation?

comme le pourquoi vous devez vous soucier de serialization, c'est parce que la plupart des conteneurs Java servlet comme Tomcat nécessitent des classes pour implémenter Serializable chaque fois que les instances de ces classes sont stockées comme un attribut de la HttpSession . Cela est dû au fait que le HttpSession peut avoir besoin d'être sauvegardé sur le système de fichiers Disque local ou même transféré sur le réseau lorsque le conteneur servlet doit être arrêté/redémarré ou est placé dans un groupe de serveurs où la session doit être synchronisée.

pour pouvoir sauvegarder des objets Java sur le système de fichiers Disque local ou les transférer sur le réseau, ils doivent d'abord être convertis en flux octet (essentiellement: un byte[] ou un InputStream ) et cela n'est possible que si la classe derrière l'objet implémente Serializable . L'interface Serializable elle-même ne fait pas grand chose, c'est simplement une interface marqueur .

voir aussi:

40
répondu BalusC 2017-05-23 12:26:25

vous devez rendre bean.ProjectAreaBean sérialisable.

3
répondu Thilo 2010-02-19 06:49:21