This commit is contained in:
wentch
2016-01-08 10:39:23 +08:00
parent 47a89caf0c
commit 4309b7fdfb

View File

@@ -74,7 +74,7 @@
<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>
@@ -140,7 +140,7 @@
<span class="o">}</span>
</pre></div>
<br/>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convert 支持非空构造函数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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>
@@ -218,7 +218,7 @@
<span class="o">}</span>
</pre></div>
<br/>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Convert 支持自定义Decode、Encode。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&lt;</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">&gt;</span> <span class="kd">extends</span> <span class="n">SimpledCoder</span><span class="o">&lt;</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">&gt;</span> <span class="o">{</span>
@@ -258,14 +258,6 @@
<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="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="cm">/**</span>
<span class="cm"> * 该方法提供给Convert组件自动加载。</span>
<span class="cm"> * 1) 方法名可以随意。</span>
@@ -277,7 +269,7 @@
<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">&lt;</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">&gt;</span> <span class="nf">createConvertCoder</span><span class="o">(</span><span class="kd">final</span> <span class="n">org.redkale.convert.Factory</span> <span class="n">factory</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="n">SimpledCoder</span><span class="o">&lt;</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">&gt;</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">&lt;</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">&gt;()</span> <span class="o">{</span>
<span class="c1">//必须与EnMember[] 顺序一致</span>
@@ -293,43 +285,53 @@
<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">wirteClassName</span><span class="o">(</span><span class="kc">null</span><span class="o">);</span>
<span class="n">out</span><span class="o">.</span><span class="na">writeNull</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">enMembers</span><span class="o">.</span><span class="na">length</span><span class="o">,</span> <span class="n">value</span><span class="o">);</span>
<span class="kt">boolean</span> <span class="n">comma</span> <span class="o">=</span> <span class="kc">false</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">comma</span> <span class="o">=</span> <span class="n">member</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="n">out</span><span class="o">,</span> <span class="n">comma</span><span class="o">,</span> <span class="n">value</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="n">in</span><span class="o">.</span><span class="na">readClassName</span><span class="o">();</span> <span class="c1">//必须先读Class 用于BSON</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="o">==</span> <span class="n">Reader</span><span class="o">.</span><span class="na">SIGN_NULL</span><span class="o">)</span> <span class="k">return</span> <span class="kc">null</span><span class="o">;</span>
<span class="kd">final</span> <span class="n">AtomicInteger</span> <span class="n">index</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">AtomicInteger</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">readField</span><span class="o">(</span><span class="n">index</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">skipBlank</span><span class="o">();</span> <span class="c1">//跳过冒号:</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="na">get</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="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="n">index</span><span class="o">.</span><span class="na">incrementAndGet</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">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>
<br/>
<h3><a id="convert_bson_buffer" class="anchor" href="#" aria-hidden="true"><span class="octicon octicon-link"></span></a>BSON的协议格式</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSON类似Java自带的Serializable 其格式如下: <br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1). 基本数据类型: 直接转换成byte[] <br/>