gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:03:52 25 4
gpt4 key购买 nike

我有一个基本的ObjectMapper,为我的对象中的属性配置了自定义序列化器和反序列化器。我想使用 Micrometer 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. Jackson custom serialization and deserialization
  2. @Valid when creating objects with jackson without controller
  3. Can Jackson check for duplicated properties in a case insensitive way?

关于java - 如何通过 ObjectMapper 捕获序列化和反序列化的延迟指标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57428473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com