java.io.InvalidClassException: classe locale incompatibles:
J'ai créé client et le serveur, puis l'ajout d'une classe à côté client pour la sérialisation des fins, puis il suffit juste allé dans le dossier du client dans mon disque dur et copier coller sur le serveur concernées emplacement, à la fois classname.class
et classname.java
respectivement.
Il a bien fonctionné dans mon portable mais quand j'ai voulu continuer mon travail sur d'autres système , quand j'ai ouvert les projets de dossiers et après que le client tente de se connecter au serveur, le message d'erreur suivant apparaît:
Exception in thread "main" java.io.InvalidClassException: projectname.clasname; local class incompatible: stream classdesc serialVersionUID = -6009442170907349114, local class serialVersionUID = 6529685098267757690
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
Ce qui se passe? Est-ce parce que j'ai couru le programme avec une ancienne version de l'IDE?
MODIFIER
import java.io.Serializable;
import java.net.URL;
public class KeyAdr implements Serializable {
private static final long serialVersionUID = 6529685098267757690L;
public URL adr;
public String key;
}
Vous devez vous connecter pour publier un commentaire.
Si une classe ne définit pas explicitement un
private static final long serialVersionUID
dans le code, il sera généré automatiquement, et il n'ya aucune garantie que les différentes machines de générer le même id; on dirait que c'est exactement ce qui s'est passé.Aussi, si les classes sont différentes, en quelque sorte (à l'aide de différentes versions de la classe) le générés automatiquement
serialVersionUID
s seront également différentes.De la
Serializable
de l'interface docs:Vous devez définir un
serialVersionUID
dans la définition de classe, par exemple:.class
les fichiers générés lors de la compilation) et de reconstruction (recompiler) les projets.-6009442170907349114L
, l'un à partir du flux.Une chose qui puisse arriver:
Par conséquent, au moment de la compilation de la version X, la JVM va générer une première Série d'identité (pour la version X) et il en fera de même avec l'autre version de Y (une autre Série ID).
Lorsque votre programme essaie de dé-sérialiser les données, il ne peut pas parce que les deux classes n'ont pas la même Série ID et votre programme n'ont aucune garantie que les deux objets Sérialisés correspondent à la même catégorie de format.
En supposant que vous avez changé votre constructeur dans le temps, et cela devrait faire sens pour vous.
Je crois que cela se passe parce que vous utilisez les différentes versions de la même classe sur le client et le serveur.
Il peut être différents champs de données ou de méthodes
Le message dit clairement que les versions de classe, ce qui permettrait d'inclure la classe meta données, ainsi, a changé au fil du temps. En d'autres termes, la structure de classe au cours de la sérialisation n'est pas le même que lors de la sérialisation. C'est ce qui est le plus probablement "en cours".
De la sérialisation en java n'est pas à long terme la persistance ou de format de transport - il est trop fragile pour cela. Avec la moindre différence dans le bytecode de la classe et de la JVM, vos données n'est pas lisible, plus. Utiliser des fichiers XML ou JSON de liaison de données pour votre tâche (XStream est rapide et facile à utiliser, et il ya une tonne de solutions de rechange)
serialVersionUID
s'.