2017-10-12 3 views
0

Je dois sérialiser les classes Java sans modifier leur code source. J'utilise GSON et j'obtiens "la classe Person déclare plusieurs champs JSON nommés serialVersionUID", car la superclasse de Person a aussi ce champ. Donc, je veux exclure les champs nommés serialVersionUID pendant la sérialisation pour éviter cette erreur (il est ok pour mes besoins) en ajoutant le code ci-dessous:Pourquoi la stratégie d'exclusion par nom n'empêche pas l'erreur "classe déclare plusieurs champs JSON nommés XXX"?

GsonBuilder gsonBuilder = new GsonBuilder(); 

ExclusionStrategy excludePolicy = new ExclusionStrategy() { 

    @Override 
    public boolean shouldSkipField(FieldAttributes arg0) { 
     return arg0.getName().contains("serialVersionUID"); 
    } 

    @Override 
    public boolean shouldSkipClass(Class<?> arg0) { 
     return false; 
    } 
}; 

gsonBuilder.addSerializationExclusionStrategy(excludePolicy); 
gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT); 

Gson gson = gsonBuilder.create(); 

Writer writer; 
try { 
    writer = new FileWriter("fileLoc"); 
    gson.toJson(personList, writer); 
    writer.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Cependant, je reçois toujours l'erreur et ne peut pas comprendre la raison au-delà.

Voici la hiérarchie de classe par exemple:

public class Person extends SuperPerson { 
    private static final long serialVersionUID = 1L; 
} 

public class SuperPerson { 
    private static final long serialVersionUID = 1L; 
} 
+0

Est-ce le Le champ 'serialVersionUID' pour satisfaire' Serializable'? Ce champ doit être 'static' et Gson ne gère pas les champs' static'. Veuillez montrer votre hiérarchie de classe (les parties nécessaires pour reproduire cette erreur). –

+0

Je dois également sérialiser les champs statiques, donc j'ajoute gsonBuilder.excludeFieldsWithModifiers (java.lang.reflect.Modifier.TRANSIENT) ;. Les questions sont mises à jour. – Guneli

Répondre

0

Après avoir analysé le code source de GSON, j'ai pu trouver la solution moi-même. Pour exclure le terrain afin que vous ne recevez pas « Personne de classe déclare plusieurs champs JSON nommés serialVersionUID » erreur, vous devez également ajouter une stratégie d'exclusion désérialisation:

gsonBuilder.addDeserializationExclusionStrategy(excludePolicy); 

Ainsi, le code final est:

GsonBuilder gsonBuilder = new GsonBuilder(); 

ExclusionStrategy excludePolicy = new ExclusionStrategy() { 

    @Override 
    public boolean shouldSkipField(FieldAttributes arg0) { 
     return arg0.getName().contains("serialVersionUID"); 
    } 

    @Override 
    public boolean shouldSkipClass(Class<?> arg0) { 
     return false; 
    } 
}; 

gsonBuilder.addSerializationExclusionStrategy(excludePolicy); 
gsonBuilder.addDeserializationExclusionStrategy(excludePolicy); 
gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT); 

Gson gson = gsonBuilder.create(); 

Writer writer; 
try { 
    writer = new FileWriter("fileLoc"); 
    gson.toJson(personList, writer); 
    writer.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
}