Java 杰克逊';s对象映射器,序列化列表

Java 杰克逊';s对象映射器,序列化列表,java,list,jackson,Java,List,Jackson,我围绕Jackson的ObjectMapper编写了一个简单的包装器,它将列表转换为字符串: public static <T> String listToString(List<T> list) { if (list == null) { return null; } ObjectMapper mapper = new ObjectMapper(); try { return mapper.writeVal

我围绕Jackson的
ObjectMapper
编写了一个简单的包装器,它将
列表
转换为
字符串

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;
}
公共静态字符串listToString(列表){
if(list==null){
返回null;
}
ObjectMapper mapper=新的ObjectMapper();
试一试{
返回mapper.writeValueAsString(列表);
}捕获(JsonProcessingException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
但是,如果我在那里传递空的
ArrayList
mapper.writeValueAsString(list)
大约在2秒左右执行。我正在eclipse中进行调试测试。
为什么要执行这么长时间?我做错了什么?

Jackson
ObjectMapper
的创建成本相对较高,但一旦创建,就可以非常便宜地重复使用多次转换。您的基准测试存在缺陷,因为它在度量中包含了
ObjectMapper
创建时间。更好的基准测试方法是先创建一个
ObjectMapper
,然后使用同一个mapper执行数百或数千次转换,并计算每次转换的平均时间。如果你这样做,你会看到更多值得尊敬的数字

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

公共类X{
私有静态最终ObjectMapper MAPPER=新ObjectMapper();
公共静态字符串listToString(列表){
if(list==null)返回null;
否则返回MAPPER.writeValueAsString(列表);
}
}

原来问题出在调试器中。如果我在调试模式下执行此操作,则执行代码需要2-5秒。但是,如果我在没有调试器和日志执行时间的情况下执行相同的操作,它将在0,1-0,8毫秒内执行—速度足够快。

我尝试以这种方式重写代码,但没有帮助。后来发现,问题出在调试器中。
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);
  }
}