有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java多映射与gson性能

我用的是葡萄籽和番石榴。我有一个我想序列化的类,它看起来像这样sscce

import com.google.common.collect.Multimap;
public class FooManager {
  private Multimap<String, Foo> managedFoos;
  // other stuff
}

Gson不知道如何序列化它。所以我这样做了:

public final class FoomapSerializer implements
                          JsonSerializer<Multimap<String, Foo>> {
  @SuppressWarnings("serial")
  private static final Type t =
          new TypeToken<Map<String, Collection<Foo>>>() {}.getType();

  @Override
  public JsonElement serialize(Multimap<String, Foo> arg0, Type arg1,
        JsonSerializationContext arg2) {
    return arg2.serialize(arg0.asMap(), t);
  }
}

然而,我担心反复调用.asMap()会很慢,即使底层的Map很少改变。(Foo对象的序列化将经常更改,但初始化后映射本身不会更改)。有更好的办法吗


共 (2) 个答案

  1. # 1 楼答案

    多重地图。asMap在O(1)时间内返回多映射的缓存视图。这不是一个昂贵的手术。(事实上,它非常便宜,最多需要一次分配。)

  2. # 2 楼答案

    下面是一个使用Guava的TypeToken的通用多重映射序列化程序的示例。如果需要的话,您可以在这方面做一些变化,比如为需要序列化的每个多映射类型创建序列化程序实例,这样您只需为每个类型解析一次asMap()的返回类型

    public enum MultimapSerializer implements JsonSerializer<Multimap<?, ?>> {
      INSTANCE;
    
      private static final Type asMapReturnType = getAsMapMethod()
          .getGenericReturnType();
    
      @Override
      public JsonElement serialize(Multimap<?, ?> multimap, Type multimapType,
          JsonSerializationContext context) {
        return context.serialize(multimap.asMap(), asMapType(multimapType));
      }
    
      private static Type asMapType(Type multimapType) {
        return TypeToken.of(multimapType).resolveType(asMapReturnType).getType();
      }
    
      private static Method getAsMapMethod() {
        try {
          return Multimap.class.getDeclaredMethod("asMap");
        } catch (NoSuchMethodException e) {
          throw new AssertionError(e);
        }
      }
    }