【问题标题】:Jackson's ObjectMapper, serialize listJackson的ObjectMapper,序列化列表
【发布时间】:2014-08-26 17:34:30
【问题描述】:

我在 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;
}

但是,如果我在那里传递空的ArrayList,mapper.writeValueAsString(list) 将在 2 秒左右执行。我正在eclipse中的调试中进行测试。 为什么要执行这么长时间?我做错了什么?

【问题讨论】:

    标签: java list jackson


    【解决方案1】:

    Jackson 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);
      }
    }
    

    【讨论】:

    • 我试图以这种方式重写代码,但这没有帮助。后来发现,问题出在调试器上。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2018-10-12
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      相关资源
      最近更新 更多