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类型适配器,但它仍然存在。
1条答案
按热度按时间rks48beu1#
我想我发现了问题,是这样的:
以上是更新后的代码。欢迎任何意见/改进。