【问题标题】:Why Exclusion Strategy by name does not prevent "class declares multiple JSON fields named XXX" error?为什么按名称排除策略不能防止“类声明多个名为 XXX 的 JSON 字段”错误?
【发布时间】:2017-10-12 15:36:33
【问题描述】:

我必须在不修改源代码的情况下序列化 Java 类。我正在使用 GSON 并获取“类 Person 声明了多个名为 serialVersionUID 的 JSON 字段”,因为 Person 的超类也有这个字段。所以我想在序列化过程中排除名为 serialVersionUID 的字段以避免这个错误(这对我来说是可以的)添加下面的代码:

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

【问题讨论】:

  • serialVersionUID 字段是否满足Serializable?该字段应该是 static 并且 Gson 不处理 static 字段。请显示您的类层次结构(重现此错误的必要部分)。
  • 我还必须序列化静态字段,所以我添加了 gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);。问题已更新。

标签: java json gson


【解决方案1】:

在分析了 GSON 的源代码后,我自己想出了解决方案。要排除字段以免出现“class Person declarations multiple JSON fields named serialVersionUID”错误,还应添加反序列化排除策略:

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

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 2019-08-23
    • 2021-02-13
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多