diff --git a/convert.html b/convert.html index 9a50cf078..8e0a62754 100644 --- a/convert.html +++ b/convert.html @@ -36,17 +36,17 @@ public String convertTo(final Type type, Object value); - public void convertTo(final JsonWriter out, Object value); + public void convertTo(final OutputStream out, Object value); - public void convertTo(final JsonWriter out, final Type type, Object value); + public void convertTo(final OutputStream out, final Type type, Object value); - public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, final Type type, Object value); + public ByteBuffer[] convertTo(final java.util.function.Supplier<ByteBuffer> supplier, Object value); - public ByteBuffer[] convertTo(final Charset charset, final Supplier<ByteBuffer> supplier, final Type type, Object value); + public ByteBuffer[] convertTo(final java.util.function.Supplier<ByteBuffer> supplier, final Type type, Object value); - public ByteBuffer[] convertTo(final Supplier<ByteBuffer> supplier, Object value); + public void convertTo(final JsonWriter writer, Object value); - public ByteBuffer[] convertTo(final Charset charset, final Supplier<ByteBuffer> supplier, Object value); + public void convertTo(final JsonWriter writer, final Type type, Object value);

      JsonConvert 反解析decode方法:

    public <T> T convertFrom(final Type type, final String text);
@@ -55,7 +55,11 @@
 
     public <T> T convertFrom(final Type type, final char[] text, int start, int len);
 
-    public <T> T convertFrom(final Type type, final ByteBuffer... buffers);
+ public <T> T convertFrom(final Type type, final ByteBuffer... buffers); + + public <T> T convertFrom(final Type type, final InputStream in); + + public <T> T convertFrom(final Type type, final JsonReader reader);

      Convert 与 ByteBuffer 的结合

      从以上的方法可以看出,与其他JSON框架相比Convert多了与ByteBuffer结合的方法。特别是convertTo方法加了Supplier<ByteBuffer>方法,这么做是为了提高数据传输的性能。在大部分情况下JSON序列化得到的数据流是为了传输出去,常见的场景就是HTTP+JSON接口。Convert提供ByteBuffer接口会大量减少中间临时数据的产生。大部分输出JSON数据的方法如下: @@ -65,7 +69,7 @@ resp.setContentType("text/json; charset=UTF-8"); resp.getOutputStream().write(json.getBytes("UTF-8")); } -

      几乎所有的JSON框架提供的接口以String作为返回结果为主,其内在都是以char[]作为JsonWriter的载体。以Gson为例,Gson拼接JSON默认使用的是StringWriter,StringWriter的扩容策略是翻倍。为了方便计算,假设一个对象转换成JSON字符串大小为了10K。Gson在转换过程中产生的临时的char[]的大小: 16 + 32 + 64 + 128 + 256 + 512 + 1K + 2K + 4K + 8K + 16K = 32K, char[]转换成最终的String结果又会产生10K的char[], 最后在response输出时又回产生10K的byte[](方便计算不考虑双字节),也就是说整个对象输出过程中会产生52K的临时数据。而且常见的HTTP服务器(如实现java-servlet规范的服务器)不会把底层的ByteBuffer对象池暴露给上层。所以目前所有使用其他JSON框架输出数据都会产生5倍于数据体积大小(其他低于1倍扩容策略的框架会产生更多)的垃圾数据。
+

      几乎所有的JSON框架提供的接口以String作为返回结果为主,其内在都是以char[]作为JsonWriter的载体。以Gson为例,Gson拼接JSON默认使用的是StringWriter,StringWriter的扩容策略是翻倍。为了方便计算,假设一个对象转换成JSON字符串大小为了10K。Gson在转换过程中产生的临时的char[]的大小: 16 + 32 + 64 + 128 + 256 + 512 + 1K + 2K + 4K + 8K + 16K = 32K, char[]转换成最终的String结果又会产生10K的char[], 最后在response输出时又回产生10K的byte[](方便计算不考虑双字节),也就是说整个对象输出过程中会产生52K的临时数据。而且常见的HTTP服务器(如实现java-servlet规范的服务器)不会把底层的ByteBuffer对象池暴露给上层。所以目前所有使用其他JSON框架输出String数据都会产生5倍于数据体积大小(其他低于1倍扩容策略的框架会产生更多)的垃圾数据。
      RedKale框架的HTTP服务内置了Convert的JSON接口,避免了这么大量的垃圾数据产生。finishJson方法将HTTP服务的ByteBuffer对象池传给Convert, 使Convert在序列化过程中直接以UTF-8编码方式输出到ByteBuffer里。

    protected void execute(HttpRequest req, HttpResponse resp) throws IOException {
         resp.finishJson(record);