对货币对象使用ReflectTypeAdapter

eqoofvh9  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(340)

在较早版本的gson(<2.5.0)中,反射类型适配器用于反序列化java.util.currency对象。所以我在数据库中保存了类似“{”currencycode:“usd”}”的内容。
现在,我想将gson升级到一个更高的版本(它引入了一个新的currencytypeadapterfactory,它不再能够从我的数据库中反序列化对象)。
是否有任何方法可以强制gson为currency类使用相同的反射类型适配器?

zbq4xfa0

zbq4xfa01#

可以使用类似的方式为所需类提供特定类型适配器绑定:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Currency.class, getCurrencyTypeAdapter());
gson = builder.create();

TypeAdapter<Currency> getCurrencyTypeAdapter() {
    ConstructorConstructor constructorConstructor = new ConstructorConstructor(Collections.emptyMap());
    JsonAdapterAnnotationTypeAdapterFactory jsonAdapterFactory = new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor);
    ReflectiveTypeAdapterFactory reflectiveTypeAdapterFactory = new ReflectiveTypeAdapterFactory(
        constructorConstructor, FieldNamingPolicy.IDENTITY, Excluder.DEFAULT, jsonAdapterFactory);
    return reflectiveTypeAdapterFactory.create(new Gson(), new TypeToken<Currency>() {});
}

这是一个变通办法。理想情况下,您应该修复currency类的用法,并使用内部使用的默认类型适配器:currency.getinstance()

相关问题