425 lines
58 KiB
HTML
425 lines
58 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-us">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>RedKale - 全新的Java微服务框架</title>
|
||
<meta name="keywords" content="RedKale,redkale,java,微服务,架构"/>
|
||
<meta name="description" content="RedKale是一个全新的基于Java 8的微服务框架"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/github-light.css" media="screen">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/highlight.css" media="screen">
|
||
</head>
|
||
<body>
|
||
<section class="page-header">
|
||
<a href="index.html" class="project-name">RedKale</a>
|
||
<h2 class="project-tagline"></h2>
|
||
<a href="redkale.html" class="btn">RedKale 入门</a>
|
||
<a href="convert.html" class="btn">Convert 组件</a>
|
||
<a href="service.html" class="btn">Service 组件</a>
|
||
<a href="source.html" class="btn">Source 组件</a>
|
||
<a href="net.html" class="btn">Net 组件</a>
|
||
<a href="watch.html" class="btn" style="display: none;">Watch 组件</a>
|
||
<a href="javadoc/index.html" target="_blank" class="btn">Javadoc API</a>
|
||
<a href="https://github.com/redkale/redkale" target="_blank" class="btn">Github 源码</a>
|
||
</section>
|
||
|
||
<section class="main-content">
|
||
<h3><a id="convert_intro" class="anchor" href="#" aria-hidden="true"></a>Convert 组件介绍</h3>
|
||
|
||
<p> Convert 是一个比较独立的组件,仅依赖于util包。提供Java对象的序列化与反序列化功能。支持JSON(JavaScript Object Notation)、BSON(Binary Stream Object Notation)两种格式化。 两种格式使用方式完全一样,其性能都大幅度超过其他JSON框架。同时JSON内置于HTTP服务中,BSON也是SNCP协议数据序列化的基础。<br/></p>
|
||
|
||
<h3><a id="convert_study" class="anchor" href="#" aria-hidden="true"></a>Convert 快速上手</h3>
|
||
<p> 本介绍仅以JSON为例(BSON与JSON使用方式雷同)。其操作类主要是JsonConvert,配置类主要是JsonFactory、ConvertColumn。JsonFactory采用同ClassLoader类似的双亲委托方式设计。</br></p>
|
||
<p> JsonConvert 序列化encode方法:</p>
|
||
|
||
<div class="highlight"><pre> <span class="kd">public</span> <span class="n">String</span> <span class="nf">convertTo</span><span class="o">(<span class="kd">final</span> </span><span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n">OutputStream</span> <span class="n">out</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n">OutputStream</span> <span class="n">out</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="n">ByteBuffer</span><span class="o">[]</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n"><b>java.util.function.Supplier</b></span><span class="o"><</span><span class="n">ByteBuffer</span><span class="o">></span> <span class="n">supplier</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="n">ByteBuffer</span><span class="o">[]</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n"><b>java.util.function.Supplier</b></span><span class="o"><</span><span class="n">ByteBuffer</span><span class="o">></span> <span class="n">supplier</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n">JsonWriter</span> <span class="n">writer</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">convertTo</span><span class="o">(</span><span class="kd">final</span> <span class="n">JsonWriter</span> <span class="n">writer</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">Object</span> <span class="n">value</span><span class="o">);</span></pre></div>
|
||
|
||
<p> JsonConvert 反序列化decode方法:</p>
|
||
<div class="highlight"><pre> <span class="kd">public</span> <span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">T</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">text</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">T</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="kt">char</span><span class="o">[]</span> <span class="n">text</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">T</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="kt">char</span><span class="o">[]</span> <span class="n">text</span><span class="o">,</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">start</span><span class="o">,</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">len</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">T</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">InputStream</span> <span class="n">in</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">T</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">ByteBuffer</span><span class="o">...</span> <span class="n">buffers</span><span class="o">);</span>
|
||
|
||
<span class="kd">public</span> <span class="o"><</span><span class="n">T</span><span class="o">></span> <span class="n">T</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="kd">final</span> <span class="n">Type</span> <span class="n">type</span><span class="o">,</span> <span class="kd">final</span> <span class="n">JsonReader</span> <span class="n">reader</span><span class="o">);</span></pre></div>
|
||
|
||
<p> Convert 与 ByteBuffer 的结合 </p>
|
||
<p id="json_net_bytebuffer"> 从以上的方法可以看出,与其他JSON框架相比Convert多了与ByteBuffer结合的方法。特别是convertTo方法加了Supplier<ByteBuffer>方法,这么做是为了提高数据传输的性能。在大部分情况下JSON序列化得到的数据流是为了传输出去,常见的场景就是HTTP+JSON接口。Convert提供ByteBuffer接口会大量减少中间临时数据的产生。大部分输出JSON数据的方法如下:
|
||
</p>
|
||
<div class="highlight"><pre> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">doPost</span><span class="o">(</span><span class="n">HttpServletRequest</span> <span class="n">req</span><span class="o">,</span> <span class="n">HttpServletResponse</span> <span class="n">resp</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">ServletException</span><span class="o">,</span> <span class="n">IOException</span> <span class="o">{</span>
|
||
<span class="n">String</span> <span class="n">json</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Gson()</span><span class="o">.</span><span class="na">toJson</span><span class="o">(record);</span>
|
||
<span class="n">resp</span><span class="o">.</span><span class="na">setContentType</span><span class="o">(</span><span class="s">"text/json; charset=UTF-8"</span><span class="o">);</span>
|
||
<span class="n">resp</span><span class="o">.</span><span class="na">getOutputStream</span><span class="o">().</span><span class="na">write</span><span class="o">(</span><span class="n">json</span><span class="o">.</span><span class="na">getBytes</span><span class="o">(</span><span class="s">"UTF-8"</span><span class="o">));</span>
|
||
<span class="o">}</span></pre></div>
|
||
<p> 几乎所有的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倍扩容策略的框架会产生更多)的垃圾数据。<br/>
|
||
RedKale框架的HTTP服务内置了Convert的JSON接口,避免了大量的垃圾数据产生。RedKale的HTTP是基于AIO(NIO.2)实现且存在ByteBuffer对象池,response的finishJson系列方法将HTTP服务的ByteBuffer对象池传给Convert, 使Convert在序列化过程中直接以UTF-8编码方式输出到ByteBuffer里,输出结束后将ByteBuffer交给对象池回收,从而减少大量构建bye[]、char[]所产生的临时数据。</p>
|
||
<div class="highlight"><pre> <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">execute</span><span class="o">(</span><span class="n">HttpRequest</span> <span class="n">req</span><span class="o">,</span> <span class="n">HttpResponse</span> <span class="n">resp</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
|
||
<span class="n">resp</span><span class="o">.</span><span class="na">finishJson</span><span class="o">(</span><span class="n">record</span><span class="o">);</span>
|
||
<span class="o">}</span></pre></div>
|
||
<br/>
|
||
|
||
<p> Convert 基本用法:</p>
|
||
<div class="highlight"><pre> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserRecord</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">username</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">password</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="kd">public</span> <span class="nf">UserRecord</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="o">/**</span> <span class="n">以下省略getter</span> <span class="n">setter方法</span> <span class="o">*/</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
|
||
<span class="n">UserRecord</span> <span class="n">user</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">UserRecord</span><span class="o">();</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="na">setUserid</span><span class="o">(</span><span class="mi">100</span><span class="o">);</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="na">setUsername</span><span class="o">(</span><span class="s">"redkalename"</span><span class="o">);</span>
|
||
<span class="n">user</span><span class="o">.</span><span class="na">setPassword</span><span class="o">(</span><span class="s">"123456"</span><span class="o">);</span>
|
||
<span class="kd">final</span> <span class="n">JsonConvert</span> <span class="n">convert</span> <span class="o">=</span> <span class="n">JsonConvert</span><span class="o">.</span><span class="na">root</span><span class="o">();</span>
|
||
<span class="n">String</span> <span class="n">json</span> <span class="o">=</span> <span class="n">convert</span><span class="o">.</span><span class="na">convertTo</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
|
||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">json</span><span class="o">);</span> <span class="c1">//应该是 {"password":"123456","userid":100,"username":"redkalename"}</span>
|
||
<span class="n">UserRecord</span> <span class="n">user2</span> <span class="o">=</span> <span class="n">convert</span><span class="o">.</span><span class="na">convertFrom</span><span class="o">(</span><span class="n">UserRecord</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="n">json</span><span class="o">);</span>
|
||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">convert</span><span class="o">.</span><span class="na">convertTo</span><span class="o">(</span><span class="n">user2</span><span class="o">));</span> <span class="c1">//应该也是 {"password":"123456","userid":100,"username":"redkalename"}</span>
|
||
|
||
<span class="cm">/**</span>
|
||
<span class="cm"> * 以下功能是为了屏蔽password字段。</span>
|
||
<span class="cm"> * 等价于 public String getPassword() 加上 @ConvertColumn :</span>
|
||
<span class="cm"> *</span>
|
||
<span class="cm"> * @ConvertColumn(ignore = true, type = ConvertType.JSON)</span>
|
||
<span class="cm"> * public String getPassword() {</span>
|
||
<span class="cm"> * return password;</span>
|
||
<span class="cm"> * }</span>
|
||
<span class="cm"> **/</span>
|
||
<span class="kd">final</span> <span class="n">JsonFactory</span> <span class="n">childFactory</span> <span class="o">=</span> <span class="n">JsonFactory</span><span class="o">.</span><span class="na">root</span><span class="o">().</span><span class="na">createChild</span><span class="o">();</span>
|
||
<span class="n">childFactory</span><span class="o">.</span><span class="na">register</span><span class="o">(</span><span class="n">UserRecord</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="kc">true</span><span class="o">,</span> <span class="s">"password"</span><span class="o">);</span> <span class="c1">//屏蔽掉password字段使其不输出</span>
|
||
<span class="n">childFactory</span><span class="o">.</span><span class="na">reloadCoder</span><span class="o">(</span><span class="n">UserRecord</span><span class="o">.</span><span class="k">class</span><span class="o">);</span> <span class="c1">//重新加载Coder使之覆盖父Factory的配置</span>
|
||
<span class="kd">final</span> <span class="n">JsonConvert</span> <span class="n">childConvert</span> <span class="o">=</span> <span class="n">childFactory</span><span class="o">.</span><span class="na">getConvert</span><span class="o">();</span>
|
||
<span class="n">json</span> <span class="o">=</span> <span class="n">childConvert</span><span class="o">.</span><span class="na">convertTo</span><span class="o">(</span><span class="n">user</span><span class="o">);</span>
|
||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">json</span><span class="o">);</span> <span class="c1">//应该是 {"userid":100,"username":"redkalename"}</span>
|
||
<span class="n">user2</span> <span class="o">=</span> <span class="n">childConvert</span><span class="o">.</span><span class="na">convertFrom</span><span class="o">(</span><span class="n">UserRecord</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="n">json</span><span class="o">);</span>
|
||
<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">childConvert</span><span class="o">.</span><span class="na">convertTo</span><span class="o">(</span><span class="n">user2</span><span class="o">));</span> <span class="c1">//应该也是 {"userid":100,"username":"redkalename"}</span>
|
||
<span class="o">}</span></pre></div>
|
||
<p> 在RedKale里存在默认的JsonConvert、BsonConvert对象。 只需在所有Service、Servlet中增加依赖注入资源。</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">XXXService</span> <span class="kd">implements</span> <span class="n">Service</span> <span class="o">{</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">JsonConvert</span> <span class="n">jsonConvert</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">BsonConvert</span> <span class="n">bsonConvert</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">XXXServlet</span> <span class="kd">extends</span> <span class="n">HttpServlet</span> <span class="o">{</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">JsonConvert</span> <span class="n">jsonConvert</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">BsonConvert</span> <span class="n">bsonConvert</span><span class="o">;</span>
|
||
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<p id="convert_diffout"> 同一类型数据通过设置新的JsonFactory可以有不同的输出。</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserSimpleInfo</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">username</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="nd">@ConvertColumn</span><span class="o">(</span><span class="n">ignore</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">type</span> <span class="o">=</span> <span class="n">ConvertType</span><span class="o">.</span><span class="na">JSON</span><span class="o">)</span>
|
||
<span class="kd">private</span> <span class="kt">long</span> <span class="n">regtime</span><span class="o">;</span> <span class="c1">//注册时间</span>
|
||
|
||
<span class="nd">@ConvertColumn</span><span class="o">(</span><span class="n">ignore</span> <span class="o">=</span> <span class="kc">true</span><span class="o">,</span> <span class="n">type</span> <span class="o">=</span> <span class="n">ConvertType</span><span class="o">.</span><span class="na">JSON</span><span class="o">)</span>
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">regaddr</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span> <span class="c1">//注册IP</span>
|
||
|
||
<span class="o">/**</span> <span class="n">以下省略getter</span> <span class="n">setter方法</span> <span class="o">*/</span>
|
||
<span class="o">}</span>
|
||
|
||
|
||
|
||
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserInfoServlet</span> <span class="kd">extends</span> <span class="n">BasedHttpServlet</span> <span class="o">{</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">UserSerice</span> <span class="n">service</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">JsonFactory</span> <span class="n">jsonRootFactory</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Resource</span>
|
||
<span class="kd">private</span> <span class="n">JsonConvert</span> <span class="n">detailConvert</span><span class="o">;</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">(</span><span class="n">HttpContext</span> <span class="n">context</span><span class="o">,</span> <span class="n">AnyValue</span> <span class="n">config</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="kd">final</span> <span class="n">JsonFactory</span> <span class="n">childFactory</span> <span class="o">=</span> <span class="n">jsonRootFactory</span><span class="o">.</span><span class="na">createChild</span><span class="o">();</span>
|
||
<span class="n">childFactory</span><span class="o">.</span><span class="na">register</span><span class="o">(</span><span class="n">UserSimpleInfo</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="kc">false</span><span class="o">,</span> <span class="s">"regtime"</span><span class="o">,</span> <span class="s">"regaddr"</span><span class="o">);</span> <span class="c1">//允许输出注册时间与注册地址</span>
|
||
<span class="n">childFactory</span><span class="o">.</span><span class="na">reloadCoder</span><span class="o">(</span><span class="n">UserSimpleInfo</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="c1">//重新加载Coder使之覆盖父Factory的配置</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">detailConvert</span> <span class="o">=</span> <span class="n">childFactory</span><span class="o">.</span><span class="na">getConvert</span><span class="o">();</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="c1">// 获取他人基本信息</span>
|
||
<span class="nd">@AuthIgnore</span>
|
||
<span class="nd">@WebAction</span><span class="o">(</span><span class="n">url</span> <span class="o">=</span> <span class="s">"/user/info/"</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">info</span><span class="o">(</span><span class="n">HttpRequest</span> <span class="n">req</span><span class="o">,</span> <span class="n">HttpResponse</span> <span class="n">resp</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
|
||
<span class="kt">int</span> <span class="n">userid</span> <span class="o">=</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">req</span><span class="o">.</span><span class="na">getRequstURILastPath</span><span class="o">());</span>
|
||
<span class="n">UserSimpleInfo</span> <span class="n">user</span> <span class="o">=</span> <span class="n">service</span><span class="o">.</span><span class="na">findUserInfo</span><span class="o">(</span><span class="n">userid</span><span class="o">);</span>
|
||
<span class="n">resp</span><span class="o">.</span><span class="na">finishJson</span><span class="o">(</span><span class="n">user</span><span class="o">);</span> <span class="c1">// 不包含用户的注册时间和注册地址字段信息</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="c1">//获取用户自己的信息</span>
|
||
<span class="nd">@WebAction</span><span class="o">(</span><span class="n">url</span> <span class="o">=</span> <span class="s">"/user/myinfo"</span><span class="o">)</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">mydetail</span><span class="o">(</span><span class="n">HttpRequest</span> <span class="n">req</span><span class="o">,</span> <span class="n">HttpResponse</span> <span class="n">resp</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">IOException</span> <span class="o">{</span>
|
||
<span class="kt">int</span> <span class="n">userid</span> <span class="o">=</span> <span class="n">currentUser</span><span class="o">(</span><span class="n">req</span><span class="o">).</span><span class="na">getUserid</span><span class="o">();</span> <span class="c1">//获取当前用户ID</span>
|
||
<span class="n">UserSimpleInfo</span> <span class="n">user</span> <span class="o">=</span> <span class="n">service</span><span class="o">.</span><span class="na">findUserInfo</span><span class="o">(</span><span class="n">userid</span><span class="o">);</span>
|
||
<span class="n">resp</span><span class="o">.</span><span class="na">finishJson</span><span class="o">(</span><span class="n">detailConvert</span><span class="o">,</span> <span class="n">user</span><span class="o">);</span> <span class="c1">// 包含用户的注册时间和注册地址字段信息</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<br/>
|
||
|
||
<p> Convert 支持带参数构造函数。</p>
|
||
<p> 1. <b>public</b> 带参数的构造函数加上 @java.beans.ConstructorProperties 注解:</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserRecord</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">username</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">password</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="nd">@java.beans.ConstructorProperties</span><span class="o">({</span><span class="s">"userid"</span><span class="o">,</span> <span class="s">"username"</span><span class="o">,</span> <span class="s">"password"</span><span class="o">})</span>
|
||
<span class="kd">public</span> <span class="nf">UserRecord</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">,</span> <span class="n">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">userid</span> <span class="o">=</span> <span class="n">userid</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">username</span> <span class="o">=</span> <span class="n">username</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">password</span> <span class="o">=</span> <span class="n">password</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getUserid</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">userid</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getUsername</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">username</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getPassword</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">password</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span></pre></div>
|
||
<p> 2. 自定义Creator:</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserRecord</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">username</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">password</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
|
||
|
||
<span class="n">UserRecord</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">,</span> <span class="n">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">userid</span> <span class="o">=</span> <span class="n">userid</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">username</span> <span class="o">=</span> <span class="n">username</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">password</span> <span class="o">=</span> <span class="n">password</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getUserid</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">userid</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getUsername</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">username</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getPassword</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">password</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="cm">/**</span>
|
||
<span class="cm"> * 自定义Creator方法。</span>
|
||
<span class="cm"> * 1) 方法名可以随意。</span>
|
||
<span class="cm"> * 2) 方法必须是static。</span>
|
||
<span class="cm"> * 3)方法的参数必须为空。</span>
|
||
<span class="cm"> * 4)方法的返回类型必须是Creator。</span>
|
||
<span class="cm"> *</span>
|
||
<span class="cm"> * @return</span>
|
||
<span class="cm"> */</span>
|
||
<span class="kd">private</span> <span class="kd">static</span> <span class="n">Creator</span><span class="o"><</span><span class="n">UserRecord</span><span class="o">></span> <span class="nf">creator</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="n">Creator</span><span class="o"><</span><span class="n">UserRecord</span><span class="o">>()</span> <span class="o">{</span>
|
||
<span class="nd">@Override</span>
|
||
<span class="nd">@Creator.ConstructorParameters</span><span class="o">({</span><span class="s">"userid"</span><span class="o">,</span> <span class="s">"username"</span><span class="o">,</span> <span class="s">"password"</span><span class="o">})</span> <span class="c1">//带参数的构造函数必须有ConstructorParameters注解</span>
|
||
<span class="kd">public</span> <span class="n">UserRecord</span> <span class="nf">create</span><span class="o">(</span><span class="n">Object</span><span class="o">...</span> <span class="n">params</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="nf">UserRecord</span><span class="o">((</span><span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="o">(</span><span class="n">Integer</span><span class="o">)</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">]),</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">params</span><span class="o">[</span><span class="mi">1</span><span class="o">],</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">params</span><span class="o">[</span><span class="mi">2</span><span class="o">]);</span>
|
||
<span class="o">}</span>
|
||
<span class="o">};</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<p> 通常JavaBean类默认有个public空参数的构造函数,因此大部分情况下不要自定义Creator,其实只要不是private的空参数构造函数Convert都能自动支持(其他的框架都仅支持public的构造函数),只有仅含private的构造函数才需要自定义Creator。带参数的构造函数就需要标记@java.beans.ConstructorProperties,常见于Immutable Object。<br/>
|
||
<b>[小技巧]</b>: 若使用Java 8编译项的新特性,带上 -parameters 编译项进行编译的类,带参数的构造函数可以省去@ConstructorProperties注解,Convert会自动匹配参数名动态生成Creator。</p>
|
||
<br/>
|
||
|
||
<p> Convert 支持自定义Decode、Encode。</p>
|
||
<p> 1. 通过Factory显式的注册:</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">FileSimpleCoder</span><span class="o"><</span><span class="n">R</span> <span class="kd">extends</span> <span class="n">Reader</span><span class="o">,</span> <span class="n">W</span> <span class="kd">extends</span> <span class="n">Writer</span><span class="o">></span> <span class="kd">extends</span> <span class="n">SimpledCoder</span><span class="o"><</span><span class="n">R</span><span class="o">,</span> <span class="n">W</span><span class="o">,</span> <span class="n">File</span><span class="o">></span> <span class="o">{</span>
|
||
|
||
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">FileSimpleCoder</span> <span class="n">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">FileSimpleCoder</span><span class="o">();</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">convertTo</span><span class="o">(</span><span class="n">W</span> <span class="n">out</span><span class="o">,</span> <span class="n">File</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">out</span><span class="o">.</span><span class="na">writeString</span><span class="o">(</span><span class="n">value</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="n">value</span><span class="o">.</span><span class="na">getPath</span><span class="o">());</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">File</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="n">R</span> <span class="n">in</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">String</span> <span class="n">path</span> <span class="o">=</span> <span class="n">in</span><span class="o">.</span><span class="na">readString</span><span class="o">();</span>
|
||
<span class="k">return</span> <span class="n">path</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="k">new</span> <span class="nf">File</span><span class="o">(</span><span class="n">path</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="n">JsonFactory</span><span class="o">.</span><span class="na">root</span><span class="o">().</span><span class="na">register</span><span class="o">(</span><span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="o">.</span><span class="kd">class</span><span class="o">,</span> <span class="n">FileSimpleCoder</span><span class="o">.</span><span class="na">instance</span><span class="o">);</span>
|
||
|
||
<span class="n">BsonFactory</span><span class="o">.</span><span class="na">root</span><span class="o">().</span><span class="na">register</span><span class="o">(</span><span class="n">java</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">File</span><span class="o">.</span><span class="kd">class</span><span class="o">,</span> <span class="n">FileSimpleCoder</span><span class="o">.</span><span class="na">instance</span><span class="o">);</span>
|
||
</pre></div>
|
||
|
||
<p> 2. 通过JavaBean类自定义静态方法自动加载:</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">InnerCoderEntity</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kd">final</span> <span class="n">String</span> <span class="n">val</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="kd">final</span> <span class="kt">int</span> <span class="n">id</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="nf">InnerCoderEntity</span><span class="o">(</span><span class="kt">int</span> <span class="n">id</span><span class="o">,</span> <span class="n">String</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">id</span> <span class="o">=</span> <span class="n">id</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">val</span> <span class="o">=</span> <span class="n">value</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="kd">static</span> <span class="n">InnerCoderEntity</span> <span class="nf">create</span><span class="o">(</span><span class="kt">int</span> <span class="n">id</span><span class="o">,</span> <span class="n">String</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="nf">InnerCoderEntity</span><span class="o">(</span><span class="n">id</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="cm">/**</span>
|
||
<span class="cm"> * 该方法提供给Convert组件自动加载。</span>
|
||
<span class="cm"> * 1) 方法名可以随意。</span>
|
||
<span class="cm"> * 2) 方法必须是static</span>
|
||
<span class="cm"> * 3)方法的参数有且只能有一个, 且必须是org.redkale.convert.Factory或子类。</span>
|
||
<span class="cm"> * —3.1) 参数类型为org.redkale.convert.Factory 表示适合JSON和BSON。</span>
|
||
<span class="cm"> * —3.2) 参数类型为org.redkale.convert.json.JsonFactory 表示仅适合JSON。</span>
|
||
<span class="cm"> * —3.3) 参数类型为org.redkale.convert.bson.BsonFactory 表示仅适合BSON。</span>
|
||
<span class="cm"> * 4)方法的返回类型必须是org.redkale.convert.Decodeable/org.redkale.convert.Encodeable/org.redkale.convert.SimpledCoder</span>
|
||
<span class="cm"> * 若返回类型不是org.redkale.convert.SimpledCoder, 就必须提供两个方法: 一个返回Decodeable 一个返回 Encodeable。</span>
|
||
<span class="cm"> *</span>
|
||
<span class="cm"> * @param factory</span>
|
||
<span class="cm"> * @return</span>
|
||
<span class="cm"> */</span>
|
||
<span class="kd">private</span> <span class="kd">static</span> <span class="n">SimpledCoder</span><span class="o"><</span><span class="n">Reader</span><span class="o">,</span> <span class="n">Writer</span><span class="o">,</span> <span class="n">InnerCoderEntity</span><span class="o">></span> <span class="nf">createConvertCoder</span><span class="o">(</span><span class="kd">final</span> <span class="n">org</span><span class="o">.</span><span class="na">redkale</span><span class="o">.</span><span class="na">convert</span><span class="o">.</span><span class="na">Factory</span> <span class="n">factory</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="n">SimpledCoder</span><span class="o"><</span><span class="n">Reader</span><span class="o">,</span> <span class="n">Writer</span><span class="o">,</span> <span class="n">InnerCoderEntity</span><span class="o">>()</span> <span class="o">{</span>
|
||
|
||
<span class="c1">//必须与EnMember[] 顺序一致</span>
|
||
<span class="kd">private</span> <span class="kd">final</span> <span class="n">DeMember</span><span class="o">[]</span> <span class="n">deMembers</span> <span class="o">=</span> <span class="k">new</span> <span class="n">DeMember</span><span class="o">[]{</span>
|
||
<span class="n">DeMember</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">factory</span><span class="o">,</span> <span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="s">"id"</span><span class="o">),</span>
|
||
<span class="n">DeMember</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">factory</span><span class="o">,</span> <span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="s">"val"</span><span class="o">)};</span>
|
||
|
||
<span class="c1">//必须与DeMember[] 顺序一致</span>
|
||
<span class="kd">private</span> <span class="kd">final</span> <span class="n">EnMember</span><span class="o">[]</span> <span class="n">enMembers</span> <span class="o">=</span> <span class="k">new</span> <span class="n">EnMember</span><span class="o">[]{</span>
|
||
<span class="n">EnMember</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">factory</span><span class="o">,</span> <span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="s">"id"</span><span class="o">),</span>
|
||
<span class="n">EnMember</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">factory</span><span class="o">,</span> <span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="s">"val"</span><span class="o">)};</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">convertTo</span><span class="o">(</span><span class="n">Writer</span> <span class="n">out</span><span class="o">,</span> <span class="n">InnerCoderEntity</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">value</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">out</span><span class="o">.</span><span class="na">writeObjectNull</span><span class="o">(</span><span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">);</span>
|
||
<span class="k">return</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
<span class="n">out</span><span class="o">.</span><span class="na">writeObjectB</span><span class="o">(</span><span class="n">value</span><span class="o">);</span>
|
||
<span class="k">for</span> <span class="o">(</span><span class="n">EnMember</span> <span class="n">member</span> <span class="o">:</span> <span class="n">enMembers</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">out</span><span class="o">.</span><span class="na">writeObjectField</span><span class="o">(</span><span class="n">member</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
<span class="n">out</span><span class="o">.</span><span class="na">writeObjectE</span><span class="o">(</span><span class="n">value</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">InnerCoderEntity</span> <span class="nf">convertFrom</span><span class="o">(</span><span class="n">Reader</span> <span class="n">in</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">in</span><span class="o">.</span><span class="na">readObjectB</span><span class="o">(</span><span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">)</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
|
||
<span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
|
||
<span class="kd">final</span> <span class="n">Object</span><span class="o">[]</span> <span class="n">params</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Object</span><span class="o">[</span><span class="n">deMembers</span><span class="o">.</span><span class="na">length</span><span class="o">];</span>
|
||
<span class="k">while</span> <span class="o">(</span><span class="n">in</span><span class="o">.</span><span class="na">hasNext</span><span class="o">())</span> <span class="o">{</span>
|
||
<span class="n">DeMember</span> <span class="n">member</span> <span class="o">=</span> <span class="n">in</span><span class="o">.</span><span class="na">readFieldName</span><span class="o">(</span><span class="n">deMembers</span><span class="o">);</span> <span class="c1">//读取字段名</span>
|
||
<span class="n">in</span><span class="o">.</span><span class="na">readBlank</span><span class="o">();</span> <span class="c1">//读取字段名与字段值之间的间隔符,JSON则是跳过冒号:</span>
|
||
<span class="k">if</span> <span class="o">(</span><span class="n">member</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">in</span><span class="o">.</span><span class="na">skipValue</span><span class="o">();</span> <span class="c1">//跳过不存在的字段的值, 一般不会发生</span>
|
||
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
|
||
<span class="n">params</span><span class="o">[</span><span class="n">index</span><span class="o">++]</span> <span class="o">=</span> <span class="n">member</span><span class="o">.</span><span class="na">read</span><span class="o">(</span><span class="n">in</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span>
|
||
<span class="n">in</span><span class="o">.</span><span class="na">readObjectE</span><span class="o">(</span><span class="n">InnerCoderEntity</span><span class="o">.</span><span class="k">class</span><span class="o">);</span>
|
||
<span class="k">return</span> <span class="n">InnerCoderEntity</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="o">(</span><span class="n">Integer</span><span class="o">)</span> <span class="n">params</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">params</span><span class="o">[</span><span class="mi">1</span><span class="o">]);</span>
|
||
<span class="o">}</span>
|
||
<span class="o">};</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getId</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">id</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getVal</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">val</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="nd">@Override</span>
|
||
<span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">()</span> <span class="o">{</span>
|
||
<span class="k">return</span> <span class="n">JsonConvert</span><span class="o">.</span><span class="na">root</span><span class="o">().</span><span class="na">convertTo</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
<p> 由上可以看出,Convert的自定义配置完全符合面向对象思想,提倡在JavaBean内部去自定义非常规的构造函数或Decode、Encode方法,通过Factory显式配置的方式通常用于非自己定义的数据类(如 java.io.File)。</p>
|
||
<br/>
|
||
|
||
<h3><a id="convert_bson_struct" class="anchor" href="#" aria-hidden="true"></a>BSON的协议格式</h3>
|
||
<p> BSON类似Java自带的Serializable, 其格式如下: <br/>
|
||
1). 基本数据类型: 直接转换成byte[] <br/>
|
||
2). SmallString(无特殊字符且长度小于256的字符串): length(1 byte) + byte[](utf8); 通常用于类名、字段名、枚举。 <br/>
|
||
3). String: length(4 bytes) + byte[](utf8); <br/>
|
||
4). 数组: length(4 bytes) + byte[]... <br/>
|
||
5). Object: <br/>
|
||
1. realclass (SmallString) (如果指定格式化的class与实体对象的class不一致才会有该值, 该值可以使用@ConvertEntity给其取个别名) <br/>
|
||
2. 空字符串(SmallString) <br/>
|
||
3. SIGN_OBJECTB 标记位,值固定为0xBB (short)<br/>
|
||
4. 循环字段值:<br/>
|
||
4.1 SIGN_HASNEXT 标记位,值固定为1 (byte) <br/>
|
||
4.2 字段类型; 1-9为基本类型&字符串; 101-109为基本类型&字符串的数组; 127为Object <br/>
|
||
4.3 字段名 (SmallString) <br/>
|
||
4.4 字段的值Object <br/>
|
||
5. SIGN_NONEXT 标记位,值固定为0 (byte)<br/>
|
||
6. SIGN_OBJECTE 标记位,值固定为0xEE (short)<br/>
|
||
</p>
|
||
<footer class="site-footer">
|
||
<span class="site-footer-owner"><a href="https://github.com/redkale/redkale">RedKale</a> © 欢迎加入RedKale技术交流QQ群: 527523235</span>
|
||
</footer>
|
||
|
||
</section>
|
||
|
||
</body>
|
||
</html>
|