2017-10-12 58 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(); 
} 
相关问题