当前位置: 首页 > 知识库问答 >
问题:

为什么名称排除策略不能防止“类声明多个名为XXX的JSON字段”错误?

孔驰
2023-03-14

我必须在不修改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;
}

共有1个答案

古凌
2023-03-14

在分析了GSON的源代码后,我自己想出了解决方案。要排除字段以使您不会得到“class Person声明多个名为seralVersionUID的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();
}
 类似资料:
  • 问题内容: 编译错误: 解决办法? 问题答案: Java不允许您在函数局部内部类内定义非最终静态字段。只允许顶级类和静态嵌套类具有非最终静态字段。 如果您要在班级中添加一个字段,请将其放在班级级别,如下所示:

  • 问题内容: 我有一个类A,其中包含一些私有字段,而同一类扩展了另一个类B,它也具有一些在A类中的私有字段。 B班有一些私人课 现在,当我尝试从上述类A创建JSON字符串时,出现以下异常: 如何解决这个问题? 由于它们是私有字段,所以我猜创建json字符串时应该没有任何问题,但我不确定。 我创建如下的json字符串: 这里obj是A类的对象 问题答案: 由于它们是私有字段,因此在创建json字符串时

  • 我已经建立了一个字段声明列表,需要找出每个字段的名称: 我找不到任何检索字段名称的方法。 奇怪的是,其中一个构造函数确实接受一个字段参数,所以不确定为什么它没有getter。我需要从另一个节点获取它吗? FieldDeclaration(节点列表修饰符、类型、字符串名称)创建一个FieldDeclaration。https://www.javadoc.io/doc/com.github.javap

  • 问题内容: 我试图找到为什么不能将类创建为静态类的原因?喜欢: 问题答案: 在Java中,关键字通常将一个方法或字段标记为不存在,而不是每个类实例一次,而是一次。一个类一旦存在就已经存在,因此实际上,所有类都以这种方式是“静态的”,并且所有对象都是该类的实例。 确实对 内部 类具有含义,这是完全不同的:通常,内部类实例可以访问与其绑定的外部类实例的成员,但是如果内部类为,则它没有这样的引用并且可以

  • 首先,我假设一个后端来控制输入以防止XSS漏洞。 在这个回答中@Les Hazlewood解释了如何在客户端保护JWT。 假设所有通信都使用100%TLS,无论是在登录期间还是登录后的所有时间,通过基本身份验证使用用户名/密码进行身份验证并接收JWT作为交换是一个有效的用例。这几乎就是OAuth 2的一个流(“密码授权”)的工作原理。[...] 您只需设置授权头: 但是,也就是说,如果您的REST

  • 下面是一个多态字段: 其中是接口,是结构/类中其他位置的字段。 在这种情况下我怎么会有这种行为呢?

  • 问题内容: 在Python中(至少在CPython 2.7.2实现中)属性访问的语法受到限制: 我的问题是双重的: 是否有根本原因禁止使用Python关键字属性名称(如中所述)? 是否/在哪里记录了上述对属性名称的限制? 在我的一个程序中这样做是很有意义的,而我对无法做到这一点感到有点失望(可以工作,但看起来并不那么简单)。 PS :问题显然是,并且是Python关键字。问题是, 为什么 禁止使用

  • 我正在标准中寻找对这一事实的正式解释。我找到了3.9.1/9所说的,并试图用该部分给出解释。 第3.9.1/9节,N3797: void类型有一组空值。void类型是不完整的类型,无法完成。它用作不返回值的函数的返回类型。任何表达式都可以显式转换为cv void类型(5.4)。void类型的表达式只能用作表达式语句(6.2)、逗号表达式的操作数(5.18)以及?的第二个或第三个操作数:(5.16)