Java 杰克逊';s对象映射器,序列化列表
我围绕Jackson的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
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);
}
}