使用GSON在自定义类中添加序列化方法

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

我使用Google Gson将Java对象序列化为JSON。现在,我使用registerTypeAdapter方法为一些类添加自定义序列化。通过使用此方法,我需要将所有要序列化的类导入到项目中。
因为我正在处理一个对象可以附加自定义类的项目,所以我正在寻找一个解决方案,在该解决方案中,我创建一个特定的方法(例如,toJson),并告诉Gson在以默认模式序列化之前搜索该方法。

public class Banana {

    ...

    public JsonObject toJson() {
        // do stuff here
    }
}

当Gson发现这个方法存在时,它就使用它,否则它就继续使用默认的序列化。
这是正确的方法吗?有没有其他方法可以将序列化代码包含到类中?

g0czyy6m

g0czyy6m1#

我认为您应该使用TypeAdapterFactory
让具有自订序列化的类别实作某个界面,例如:

interface CustomSerializable {
    JsonObject toJson();
}

然后执行类似以下的操作:

public class CustomTypeAdapterFactory implements TypeAdapterFactory {
    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        // if given type implements CustomSerializable return your TypeAdapter 
        // that is designed to use above mentioned interface
        // so it uses method toJson() appropriately

        // else return null for default serialization   
        return null;
    }
}

那么就只注册一次自定义工厂,例如:

Gson gson = new GsonBuilder()
    .registerTypeAdapterFactory(new CustomTypeAdapterFactory())
    .create();

如果你不能改变类来实现CustomSerializable,你也可以使用反射来确定inf是否有一个toJson()方法,但是如果有这样的方法而不是你添加的话,这可能会有很糟糕的副作用。

相关问题