背景:我的应用程序是一个基于Web的应用程序,使用:
详情:
我有一个简单的类(让我们称之为MyClass)存储,类似于int,String和byte []。
我做一个HTTP调用,调用下面的方法:
@RequestMapping(value = "/getMyObj", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
@ResponseBody
public MyClass getMyObj(@RequestBody String id {
try{
MyClass myObj=myService.getMyClassObject(id);
return myObj;
} catch (Exception e){
return ErrorResult(APIError.ERROR,e.getMessage());
}
}
字节数组(由我的服务层通过我的dao层)填充,二进制内容存储在数据库中(想象一个小的文本文件内容),工作正常。如果,myObj构造得很好。 问题是在浏览器中获取结果需要很长时间。 示例:500 KB - 16分钟。
如果我直接传输文件(下面的代码),它真的很快(比如1秒)。 当然,我希望第一种方法更慢......但不是这个差异。
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
@ResponseBody
public void getFile(@PathVariable("id") String id, HttpServletResponse response) {
try {
response.reset();
myService.get(id, new MyHttpConsumer (response));
} catch (Exception e) {
s.printStackTrace();
}
}
private class MyHttpConsumer implements MyConsumer {
private HttpServletResponse response;
public MyHttpConsumer (HttpServletResponse response) {
this.response = response;
}
public void setContentType(String contentType) {
response.setContentType(contentType);
}
public OutputStream getOutputStream() throws IOException {
return response.getOutputStream();
}
}
我试图以某种方式使用自定义ObjectMapper改进序列化。
<bean id="myObjectMapper" class="com.*.*.MyObjectMapper"/>
<mvc:annotation-driven validator="validator">
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="myObjectMapper" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
没运气...
或许,如果我序列化myObj(类型为MyClass)忽略byte [],这是值得的。
一切正常:快速回答。检查下面的Serializer。
class MySerializer extends JsonSerializer<MyClass>
{
@Override
public void serialize(MyClass value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
// TODO Auto-generated method stub
jgen.writeStartObject();
byte[] b= values.getContent();
jgen.writeBinaryField("content", b);
//jgen.writeFieldName("id");
//jgen.writeNumber(value.getId());
jgen.writeEndObject();
}
}
我正在注册我的序列化程序
module.addSerializer(MyClass.class, new MySerializer());
总结一下:我正在寻找的是对getMyObj调用的快速(更快)响应,考虑到myObj存储一个字节数组。
有任何想法/建议吗?
谢谢。
答案 0 :(得分:1)
如果你不受Jackson1的限制,我建议:
杰克逊还有可以切换的序列化功能:具体而言,FLUSH_AFTER_WRITE_VALUE可能有所帮助。