如何通过 ObjectMapper 捕获序列化和反序列化的延迟指标?



>我有一个基本ObjectMapper,为我的对象中的属性配置了自定义序列化程序和反序列化程序。我想使用千分尺Timer米捕获整个对象的序列化和反序列化的延迟。

我可以在顶级对象级别添加自定义序列化程序和反序列化程序,而不仅仅是我拥有它的属性,并传入Timer以捕获指标。但是,这将需要显式解析整个对象,其唯一目的是捕获指标。我希望得到关于这是否是唯一的选择或是否有更好的方法来实现这一目标的反馈。

我正在使用的对象

public class Person {
String name;
int age;
Address address
}

我有自定义序列化程序和反序列化程序的属性

public class Address {
String addLineOne;
String addLineTwo;
int zipCode;
}

ObjectMapper配置

@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(Deserialization.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule module = new SimpleModule();
module.addDeserializer(Address.class, new AddressDeserializer());
module.addSerializer(Address.class, new AddressSerializer());
objectMapper.registerModule(module);
return objectMapper;
}

对于POJO反序列化Jackson默认情况下使用com.fasterxml.jackson.databind.deser.BeanDeserializer类。我们可以扩展它并使用com.fasterxml.jackson.databind.deser.BeanDeserializerModifier类进行注册。下面的示例显示了这个想法:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.BeanDeserializer;
import com.fasterxml.jackson.databind.deser.BeanDeserializerBase;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = objectMapper();
String json = mapper.writeValueAsString(new Person());
for (int i = 0; i < 10; i++) {
mapper.readValue(json, Person.class);
}
}
public static ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (deserializer instanceof BeanDeserializer && beanDesc.getBeanClass() == Person.class) {
return new TimerBeanDeserializer((BeanDeserializerBase) deserializer);
}
return super.modifyDeserializer(config, beanDesc, deserializer);
}
});
module.addDeserializer(Address.class, new AddressDeserializer());
module.addSerializer(Address.class, new AddressSerializer());
objectMapper.registerModule(module);
return objectMapper;
}
}
class TimerBeanDeserializer extends BeanDeserializer {
private Timer timer = new Timer();
protected TimerBeanDeserializer(BeanDeserializerBase src) {
super(src);
}
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
timer.start();
Object res = super.deserialize(p, ctxt);
System.out.println("Deserialization took: " + timer.end() + " nanos");
return res;
}
}
class Timer {
private long start;
public void start() {
this.start = System.nanoTime();
}
public long end() {
return System.nanoTime() - start;
}
}

上面的代码打印:

Deserialization took: 660853 nanos
Deserialization took: 48276 nanos
Deserialization took: 43741 nanos
Deserialization took: 44786 nanos
Deserialization took: 39230 nanos
Deserialization took: 39917 nanos
Deserialization took: 39745 nanos
Deserialization took: 38330 nanos
Deserialization took: 38994 nanos
Deserialization took: 38717 nanos

另请参阅:

  1. 杰克逊自定义序列化和反序列化
  2. 使用杰克逊创建对象而不带控制器时@Valid
  3. 杰克逊能否以不区分大小写的方式检查重复的属性?

最新更新