2011-04-29 2 views
0

J'ai un problème lors de l'enregistrement de la sérialisation d'objets puis de le charger à nouveau ..Problèmes avec les objets sérialisation

première fois que je classe à l'origine du « C », « B » chaîne « A » après je l'ai enregistré avec quelques données à classer ...

Plus tard, j'ai modifié la classe de sorte qu'il a une chaîne de plus "D". Après avoir chargé le fichier que j'ai enregistré avant de modifier l'application ne sait pas sur la nouvelle chaîne "D" ...

Quel est le meilleur mécanisme pour gérer un tel problème ... Il sera très long à copier les données de l'ancien objet à la nouvelle ... Je veux faire l'objet sauvé savoir qu'il y avait des changements de structure ...

... Toute aide s'il vous plaît

Répondre

3

Utilisez un autre serialVersionUID à dites au système qu'il existe une version différente.

Des JavaDoc on Serializable:

Les associés d'exécution de sérialisation avec chaque classe sérialisable un numéro de version, appelée serialVersionUID, qui est utilisé lors de la désérialisation pour vérifier que l'expéditeur et le destinataire d'un objet sérialisé ont les classes chargées pour cette objets compatibles avec la sérialisation. Si le récepteur a chargé une classe pour l'objet dont le numéro de série est différent de celui de la classe de l'expéditeur correspondant, la désérialisation entraîne une exception InvalidClassException. Une classe sérialisable peut déclarer son propre serialVersionUID explicitement en déclarant un champ nommé "serialVersionUID" qui doit être statique, final, et de type long:

ANY-ACCESS-MODIFIER statique final long serialVersionUID = 42L;

(Markup par moi)

Edit:

Comme alternative, vous pouvez simplement utiliser un autre champ pour stocker la version et désérialiser malgré les changements de classe. Dans ce cas, la nouvelle chaîne doit être initialisée à null. Vous pourriez alors vérifier la version pour voir si la chaîne était présente dans la version précédente et juste était nulle lors de l'enregistrement ou s'il y avait un changement structurel entre les deux.

Exemple:

class MyObject { 
    private static final versionUid = 1; 
    private final int version; 

    private String a, b, c, d; //plus getters/setters; 

    public MyObject() { 
    version = versionUid ; //needed if you want to load objects of different backward compatible versions and still know the version after deserialization 
    } 

    public int getVersion() { 
    return version; 
    } 
} 


MyObject readObjectOfVersion2 = ... ;//deserialize an object of version 1 
if(readObjectOfVersion2.getVersion() > 1) {//assuming version 1 only has a,b,c and version 2+ has d as well  
    String d = readObjectOfVersion2.getD(); 
} 
+0

Je suis désolé, je viens d'apprendre sur la sérialisation .. Pouvez-vous être plus précis? Pouvez-vous me donner un exemple de code? Donc, je peux toujours charger mon ancien fichier .. Parce que je reçois cette erreur lorsque je tente de charger mon ancien fichier en utilisant la nouvelle structure -> java.io.InvalidClassException: com.joymaster.hypereditor.data.TreeScriptContent; classe locale incompatible: stream classdesc serialVersionUID = -3425667071755815337, classe locale serialVersionUID = -916187445672973996 – user430926

+0

Je mettrai à jour ma réponse. – Thomas

Questions connexes