首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BiMap<UUID,String>被Gson反序列化为BiMap<String,String>

BiMap<UUID,String>被Gson反序列化为BiMap<String,String>
EN

Stack Overflow用户
提问于 2020-09-06 03:47:48
回答 1查看 63关注 0票数 0
代码语言:javascript
复制
public class BiMapTypeAdapterFactory implements TypeAdapterFactory {
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
        Type type = typeToken.getType();
        if (typeToken.getRawType() != BiMap.class
                || !(type instanceof ParameterizedType)) {
            return null;
        }
        return (TypeAdapter<T>) newBiMapAdapter(gson);
    }

    private <K, V> TypeAdapter<BiMap<K, V>> newBiMapAdapter(Gson gson) {
        TypeAdapter<Map<K, V>> mapTypeAdapter = gson.getAdapter(new TypeToken<Map<K, V>>() {});
        return new TypeAdapter<BiMap<K, V>>() {
            public void write(JsonWriter out, BiMap<K, V> value) throws IOException {
                mapTypeAdapter.write(out, value);
            }

            public BiMap<K, V> read(JsonReader in) throws IOException {
                return HashBiMap.create(mapTypeAdapter.read(in));
            }
        };
    }
}

这是我尝试用于Guava的BiMap类的TypeAdapterFactory。我本质上是在委托Gson的MapTypeAdapterFactory。但是,对于像BiMap将其键反序列化为字符串。我知道这一点,因为每当我尝试访问带有UUID的值时,都会得到一个ClassCastException。我还添加了自己的UUID TypeAdapter,但它仍然存在。

EN

回答 1

Stack Overflow用户

发布于 2020-09-06 04:27:06

代码语言:javascript
复制
public class BiMapTypeAdapterFactory implements TypeAdapterFactory {
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
        Type type = typeToken.getType();
        if (typeToken.getRawType() != BiMap.class
                || !(type instanceof ParameterizedType)) {
            return null;
        }

        TypeToken<?> mapType = TypeToken.getParameterized(
                Map.class, ((ParameterizedType) type).getActualTypeArguments());
        TypeAdapter mapTypeAdapter = gson.getAdapter(mapType);
        return (TypeAdapter<T>) newBiMapAdapter(mapTypeAdapter);
    }

    private <K, V> TypeAdapter<BiMap<K, V>> newBiMapAdapter(TypeAdapter<Map<K, V>> mapTypeAdapter) {
        return new TypeAdapter<BiMap<K, V>>() {
            public void write(JsonWriter out, BiMap<K, V> value) throws IOException {
                mapTypeAdapter.write(out, value);
            }

            public BiMap<K, V> read(JsonReader in) throws IOException {
                return HashBiMap.create(mapTypeAdapter.read(in));
            }
        };
    }
}

我相信我找到了问题所在,就是这一行:

代码语言:javascript
复制
TypeAdapter<Map<K, V>> mapTypeAdapter = gson.getAdapter(new TypeToken<Map<K, V>>() {});

以上是更新后的代码。欢迎任何意见/改进。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63757897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档