Jackson的ObjectMapper,序列化列表

时间:2014-08-26 17:34:30

标签: java list jackson

我在杰克逊ObjectMapper周围写了一个简单的包装器,它会将List<?>转换为String

public static <T> String listToString(List<T> list) {
    if (list == null) {
        return null;
    }
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writeValueAsString(list);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

但是,如果我在那里传递空ArrayListmapper.writeValueAsString(list)执行大约2秒。我在eclipse中进行调试测试。 为什么这么长时间执行?我做错了什么?

2 个答案:

答案 0 :(得分:2)

杰克逊ObjectMapper创建起来相对昂贵,但一旦创建,它可以非常便宜地重复用于许多转换。您的基准测试存在缺陷,因为它包含测量中的ObjectMapper创建时间。更好的基准测试会预先创建一个 ObjectMapper,然后使用相同的映射器执行数百或数千次转换,并计算每次转换的平均时间。如果你这样做,你会看到更多可敬的数字。

ObjectMapper实例在完全配置后是线程安全的,因此可以安全地执行以下操作(为清晰起见,忽略了异常处理代码)

public class X {
  private static final ObjectMapper MAPPER = new ObjectMapper();

  public static <T> String listToString(List<T> list) {
    if(list == null) return null;
    else return MAPPER.writeValueAsString(list);
  }
}

答案 1 :(得分:0)

事实证明问题出在调试器中。如果我在调试模式下执行此操作,则执行代码需要2-5秒。但是如果我在没有调试器和日志执行时间的情况下做同样的事情,它会在0,1-0,8毫秒内执行 - 足够快。