bimap< uuid,string>被gson反序列化为bimap< string,string>

lx0bsm1f  于 2021-07-04  发布在  Java
关注(0)|答案(1)|浏览(338)
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,string>这样的类型将其键反序列化为字符串。我知道这一点,因为每当我尝试使用uuid访问一个值时,我都会得到一个classcastexception。我还添加了自己的uuid类型适配器,但它仍然存在。

rks48beu

rks48beu1#

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));
            }
        };
    }
}

我想我发现了问题,是这样的:

TypeAdapter<Map<K, V>> mapTypeAdapter = gson.getAdapter(new TypeToken<Map<K, V>>() {});

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

相关问题