diff --git a/convert.html b/convert.html index 6a004ed9a..ecd46a181 100644 --- a/convert.html +++ b/convert.html @@ -26,11 +26,11 @@

Convert 组件介绍

-

       Convert 是一个比较独立的组件,仅依赖于util包。提供Java对象的序列化与反解析功能。支持JSON(JavaScript Object Notation)、BSON(Binary Stream Object Notation)两种格式化。 两种格式使用方式完全一样,其性能都大幅度超过其他JSON框架。同时JSON内置于HTTP协议中,BSON也是SNCP协议数据序列化的基础。

+

         Convert 是一个比较独立的组件,仅依赖于util包。提供Java对象的序列化与反解析功能。支持JSON(JavaScript Object Notation)、BSON(Binary Stream Object Notation)两种格式化。 两种格式使用方式完全一样,其性能都大幅度超过其他JSON框架。同时JSON内置于HTTP协议中,BSON也是SNCP协议数据序列化的基础。

Convert 快速上手

-

      本介绍仅以JSON为例(BSON与JSON使用方式雷同)。其操作类主要是JsonConvert,配置类主要是JsonFactory、ConvertColumn。JsonFactory采用同ClassLoader类似的双亲委托方式设计。

-

      JsonConvert 序列化encode方法:

+

        本介绍仅以JSON为例(BSON与JSON使用方式雷同)。其操作类主要是JsonConvert,配置类主要是JsonFactory、ConvertColumn。JsonFactory采用同ClassLoader类似的双亲委托方式设计。

+

        JsonConvert 序列化encode方法:

    public String convertTo(final Object value);
 
@@ -48,7 +48,7 @@
 
     public void convertTo(final JsonWriter writer, final Type type, final Object value);
-

      JsonConvert 反解析decode方法:

+

        JsonConvert 反解析decode方法:

    public <T> T convertFrom(final Type type, final String text);
 
     public <T> T convertFrom(final Type type, final char[] text);
@@ -61,22 +61,22 @@
 
     public <T> T convertFrom(final Type type, final JsonReader reader);
-

      Convert 与 ByteBuffer 的结合

-

      从以上的方法可以看出,与其他JSON框架相比Convert多了与ByteBuffer结合的方法。特别是convertTo方法加了Supplier<ByteBuffer>方法,这么做是为了提高数据传输的性能。在大部分情况下JSON序列化得到的数据流是为了传输出去,常见的场景就是HTTP+JSON接口。Convert提供ByteBuffer接口会大量减少中间临时数据的产生。大部分输出JSON数据的方法如下: +

        Convert 与 ByteBuffer 的结合

+

        从以上的方法可以看出,与其他JSON框架相比Convert多了与ByteBuffer结合的方法。特别是convertTo方法加了Supplier<ByteBuffer>方法,这么做是为了提高数据传输的性能。在大部分情况下JSON序列化得到的数据流是为了传输出去,常见的场景就是HTTP+JSON接口。Convert提供ByteBuffer接口会大量减少中间临时数据的产生。大部分输出JSON数据的方法如下:

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         String json = new Gson().toJson(record);
         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对象池暴露给上层。所以以String为输出结果的JSON方法都会产生5倍于数据体积大小(其他低于1倍扩容策略的框架会产生更多)的垃圾数据。
-       RedKale框架的HTTP服务内置了Convert的JSON接口,避免了大量的垃圾数据产生。RedKale的HTTP是基于AIO(NIO.2)实现且存在ByteBuffer对象池,response的finishJson系列方法将HTTP服务的ByteBuffer对象池传给Convert, 使Convert在序列化过程中直接以UTF-8编码方式输出到ByteBuffer里,输出结束后将ByteBuffer交给对象池回收,从而减少大量构建bye[]、char[]所产生的临时数据。

+

        几乎所有的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对象池暴露给上层。所以以String为输出结果的JSON方法都会产生5倍于数据体积大小(其他低于1倍扩容策略的框架会产生更多)的垃圾数据。
+         RedKale框架的HTTP服务内置了Convert的JSON接口,避免了大量的垃圾数据产生。RedKale的HTTP是基于AIO(NIO.2)实现且存在ByteBuffer对象池,response的finishJson系列方法将HTTP服务的ByteBuffer对象池传给Convert, 使Convert在序列化过程中直接以UTF-8编码方式输出到ByteBuffer里,输出结束后将ByteBuffer交给对象池回收,从而减少大量构建bye[]、char[]所产生的临时数据。

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

-

      Convert 基本用法:

+

        Convert 基本用法:

    public class UserRecord {
 
         private int userid;
@@ -120,7 +120,7 @@
         user2 = childConvert.convertFrom(UserRecord.class, json);
         System.out.println(childConvert.convertTo(user2)); //应该也是 {"userid":100,"username":"redkalename"}
     }
-

      在RedKale里存在默认的JsonConvert、BsonConvert对象。 只需在所有Service、Servlet中增加依赖注入资源。

+

        在RedKale里存在默认的JsonConvert、BsonConvert对象。 只需在所有Service、Servlet中增加依赖注入资源。

public class XXXService implements Service {
 
     @Resource
@@ -140,7 +140,7 @@
     
 }
                 
-

      同一类型数据通过设置新的JsonFactory可以有不同的输出。

+

        同一类型数据通过设置新的JsonFactory可以有不同的输出。

public class UserSimpleInfo {
 
     private int userid;
@@ -227,8 +227,8 @@
                 

-

      Convert 支持非空构造函数。

-

       1. public 的非空构造函数加上 @java.beans.ConstructorProperties 注解:

+

        Convert 支持非空构造函数。

+

         1. public 的非空构造函数加上 @java.beans.ConstructorProperties 注解:

public class UserRecord {
 
     private int userid;
@@ -256,7 +256,7 @@
         return password;
     }
 }
-

       2. 非public 的非空构造函数类自定义Creator:

+

         2. 非public 的非空构造函数类自定义Creator:

public class UserRecord {
 
     private int userid;
@@ -305,8 +305,8 @@
                 

-

      Convert 支持自定义Decode、Encode。

-

      1. 通过Factory显式的注册:

+

        Convert 支持自定义Decode、Encode。

+

        1. 通过Factory显式的注册:

public class FileSimpleCoder<R extends Reader, W extends Writer> extends SimpledCoder<R, W, File> {
 
     public static final FileSimpleCoder instance = new FileSimpleCoder();
@@ -328,7 +328,7 @@
 BsonFactory.root().register(java.io.File.class, FileSimpleCoder.instance);
                 
-

      2. 通过JavaBean类自定义静态方法自动加载:

+

        2. 通过JavaBean类自定义静态方法自动加载:

public class InnerCoderEntity {
 
     private final String val;
@@ -422,22 +422,22 @@
             

BSON的协议格式

-

      BSON类似Java自带的Serializable, 其格式如下:
-             1). 基本数据类型: 直接转换成byte[]
-             2). SmallString(无特殊字符且长度小于256的字符串): length(1 byte) + byte[](utf8); 通常用于类名、字段名、枚举。
-             3). String: length(4 bytes) + byte[](utf8);
-             4). 数组: length(4 bytes) + byte[]...
-             5). Object:
-                   1. realclass (SmallString) (如果指定格式化的class与实体对象的class不一致才会有该值, 该值可以使用@ConvertEntity给其取个别名)
-                   2. 空字符串(SmallString)
-                   3. SIGN_OBJECTB 标记位,值固定为0xBB (short)
-                   4. 循环字段值:
-                         4.1 SIGN_HASNEXT 标记位,值固定为1 (byte)
-                         4.2 字段类型; 1-9为基本类型&字符串; 101-109为基本类型&字符串的数组; 127为Object
-                         4.3 字段名 (SmallString)
-                         4.4 字段的值Object
-                   5. SIGN_NONEXT 标记位,值固定为0 (byte)
-                   6. SIGN_OBJECTE 标记位,值固定为0xEE (short)
+

        BSON类似Java自带的Serializable, 其格式如下:
+                 1). 基本数据类型: 直接转换成byte[]
+                 2). SmallString(无特殊字符且长度小于256的字符串): length(1 byte) + byte[](utf8); 通常用于类名、字段名、枚举。
+                 3). String: length(4 bytes) + byte[](utf8);
+                 4). 数组: length(4 bytes) + byte[]...
+                 5). Object:
+                         1. realclass (SmallString) (如果指定格式化的class与实体对象的class不一致才会有该值, 该值可以使用@ConvertEntity给其取个别名)
+                         2. 空字符串(SmallString)
+                         3. SIGN_OBJECTB 标记位,值固定为0xBB (short)
+                         4. 循环字段值:
+                                 4.1 SIGN_HASNEXT 标记位,值固定为1 (byte)
+                                 4.2 字段类型; 1-9为基本类型&字符串; 101-109为基本类型&字符串的数组; 127为Object
+                                 4.3 字段名 (SmallString)
+                                 4.4 字段的值Object
+                         5. SIGN_NONEXT 标记位,值固定为0 (byte)
+                         6. SIGN_OBJECTE 标记位,值固定为0xEE (short)