2017-10-12 64 views
0

我必須序列化Java類而不修改它們的源代碼。我正在使用GSON並獲得「類Person聲明多個名爲serialVersionUID的JSON字段」,因爲Person的超類也具有此字段。所以我想序列化,以避免這個錯誤時,排除命名的serialVersionUID領域(這是確定我的目的)添加以下代碼:爲什麼按名稱排除策略不會阻止「類聲明多個名爲XXX的JSON字段」錯誤?

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(); 
} 

但是,我仍然得到錯誤,無法理解超越它的原因。

下面是示例類層次結構:

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

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

是的用於滿足'Serializable'的'serialVersionUID'字段?該字段應該是「靜態」的,而Gson不處理「靜態」字段。請顯示您的類層次結構(重現此錯誤的必要部分)。 –

+0

我必須序列化靜態字段,所以我添加gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);.問題已更新。 – Guneli

回答

0

分析GSON的源代碼後,我能想出的解決方案自己。爲了排除字段,以便你沒有得到「Person類聲明瞭一個名爲serialVersionUID的多個JSON田」的錯誤,你還應該添加反序列化排除策略:

gsonBuilder.addDeserializationExclusionStrategy(excludePolicy); 

所以最後的代碼是:

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(); 
} 
相關問題