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,但它仍然存在。
发布于 2020-09-06 04:27:06
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>>() {});以上是更新后的代码。欢迎任何意见/改进。
https://stackoverflow.com/questions/63757897
复制相似问题