gson 错误:类声明了多个名为serialVersionUid的JSON字段

yptwkmov  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(174)

我有一个类A,它扩展了类B,实现了Serializable。
当我尝试使用GSONlib将其转换为JSON时,它说“类声明了多个名为serialVersionUid的JSON字段”。
只要我知道,如果我不显式声明serialVersionUid,它将由GSON生成。
我还尝试静态地放置serialVersionUid,但不起作用。
我可以通过在类A中实现序列化来修复这个错误,但是我有很多扩展B的类,我不认为从它们中排除B将是一个好主意。
有人知道为什么会出现此错误吗?

Class A extends B {
    private c;
    private d;
    private e;
}

Class B extends Serializable{
    private f;
    private g;
}
vsnjm48y

vsnjm48y1#

已编辑

我们在这里修改了代码,将GSON与一个自定义的GsonBuilder类一起使用。代码看起来有点像这样:

...
private static final Set<String> EXCLUDED_FIELDS = Set.of("serialVersionUID", "CREATOR");
....
Gson gson = new GsonBuilder()
            .excludeFieldsWithModifiers(Modifier.TRANSIENT)
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    boolean exclude = false;
                    try {
                        exclude = EXCLUDED_FIELDS .contains(f.getName());
                    } catch (Exception ignore) {
                    }
                    return exclude;
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            })
            .create();
return gson.toJson(object);

在本例中,我们在jsonize它时忽略了serialVersionUIDCREATOR字段。

几秒钟前我遇到了同样的问题。我已经解决了这个问题,方法是使用transient修饰符. to by superclass添加serialVersionUUID,如下所示:

private transient static final long serialVersionUID = 1L;

希望对你也有帮助。

相关问题