我需要在get请求期间跟踪json序列化的性能。实际上我使用jackson作为json序列化库。
查阅jackson文档,我尝试使用自定义序列化程序来跟踪序列化性能。
我实现了这样的功能:
public class CustomSerializer extends StdSerializer<Item> {
public CustomSerializer() {
this(null);
}
protected CustomSerializer(Class<Item> t) {
super(t);
}
@Override
public void serialize(Item item, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
long startTime = System.currentTimeMillis();
ObjectMapper mapper = new JsonMapper();
byte[] res = mapper.writeValueAsBytes(item);
jsonGenerator.writeBinary(res);
long endTime = System.currentTimeMillis();
System.out.println("SerializationTime: " + (endTime - startTime) + "millis");
}
}
我已将序列化程序注册到 Item
与…同班 @JsonSerialize
.
当我试图调用端点时,我得到一个 Internal Server Error
在服务器日志上具有以下堆栈跟踪:
java.lang.StackOverflowError
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3685)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:26)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:11)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4407)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3685)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:26)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:11)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4407)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3685)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:26)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:11)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4407)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3685)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:26)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:11)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4407)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3685)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:26)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:11)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4407)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3685)
at com.test.serialization.CustomSerializer.serialize(CustomSerializer.java:26)
其实我做错了什么。有没有一种方法可以在没有自定义序列化程序的情况下获得序列化性能?否则我在序列化程序实现上做错了什么?
暂无答案!
目前还没有任何答案,快来回答吧!