3

背景:我的应用程序是一个基于 Web 的应用程序,使用:

  • 春季 3.1.0 发布
  • 杰克逊 1.9.2

详细信息:
我有一个简单的类(我们称之为 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 层)填充了存储在数据库中的二进制内容(想象一个小文本文件内容),效果很好。IOW,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[] 一切正常:快速回答。检查下面的序列化器。

   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());

总结一下:考虑到 myObj 存储一个字节数组,我正在寻找的是对 getMyObj 调用的快速(更快)响应。

有什么想法/建议吗?

谢谢你。

4

1 回答 1

1

如果您不受 Jackson1 的限制,我建议:

  1. 杰克逊 2
  2. 杰克逊加力模块

Jackson 还具有可以切换的序列化功能:具体来说,FLUSH_AFTER_WRITE_VALUE可能会有所帮助。

于 2014-08-01T19:33:18.147 回答