为什么按名称排除策略不会阻止“类声明多个名为XXX的JSON字段”错误?
问题描述:
我必须序列化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;
}
答
分析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();
}
是的用于满足'Serializable'的'serialVersionUID'字段?该字段应该是“静态”的,而Gson不处理“静态”字段。请显示您的类层次结构(重现此错误的必要部分)。 –
我必须序列化静态字段,所以我添加gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);.问题已更新。 – Guneli