From 624df2d837abb0ba2b476be46a499561d8d5cb43 Mon Sep 17 00:00:00 2001 From: wentch <22250530@qq.com> Date: Wed, 6 Jan 2016 16:03:13 +0800 Subject: [PATCH] --- convert.html | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/convert.html b/convert.html index bbe6aa4c5..891f8b22f 100644 --- a/convert.html +++ b/convert.html @@ -173,6 +173,92 @@ BsonFactory.root().register(java.io.File.class, FileSimpleCoder.instance); + +
public class InnerCoderEntity {
+
+    private final String val;
+
+    private final int id;
+
+    private InnerCoderEntity(int id, String value) {
+        this.id = id;
+        this.val = value;
+    }
+
+    public static InnerCoderEntity create(int id, String value) {
+        return new InnerCoderEntity(id, value);
+    }
+
+    /**
+     * 该方法提供给Convert组件自动加载。
+     * 1) 方法名可以随意。
+     * 2) 方法必须是static
+     * 3)方法的参数有且只能有一个, 且必须是org.redkale.convert.Factory。
+     * 4)方法的返回类型必须是org.redkale.convert.Decodeable/org.redkale.convert.Encodeable/org.redkale.convert.SimpledCoder
+     * 若返回类型不是org.redkale.convert.SimpledCoder, 就必须提供两个方法: 一个返回Decodeable 一个返回 Encodeable。
+     *
+     * @param factory
+     * @return
+     */
+    private static SimpledCoder<Reader, Writer, InnerCoderEntity> createConvertCoder(final Factory factory) {
+        return new SimpledCoder<Reader, Writer, InnerCoderEntity>() {
+
+            //必须与EnMember[] 顺序一致
+            private final DeMember[] deMembers = new DeMember[]{
+                DeMember.create(factory, InnerCoderEntity.class, "id"),
+                DeMember.create(factory, InnerCoderEntity.class, "val")};
+
+            //必须与DeMember[] 顺序一致
+            private final EnMember[] enMembers = new EnMember[]{
+                EnMember.create(factory, InnerCoderEntity.class, "id"),
+                EnMember.create(factory, InnerCoderEntity.class, "val")};
+
+            @Override
+            public void convertTo(Writer out, InnerCoderEntity value) {
+                if (value == null) {
+                    out.wirteClassName(null);
+                    out.writeNull();
+                    return;
+                }
+                out.writeObjectB(enMembers.length, value);
+                boolean comma = false;
+                for (EnMember member : enMembers) {
+                    comma = member.write(out, comma, value);
+                }
+                out.writeObjectE(value);
+            }
+
+            @Override
+            public InnerCoderEntity convertFrom(Reader in) {
+                in.readClassName(); //必须先读Class 用于BSON
+                if (in.readObjectB() == Reader.SIGN_NULL) return null;
+                final AtomicInteger index = new AtomicInteger();
+                final Object[] params = new Object[deMembers.length];
+                while (in.hasNext()) {
+                    DeMember member = in.readField(index, deMembers);
+                    in.skipBlank(); //跳过冒号:
+                    if (member == null) {
+                        in.skipValue(); //跳过该属性的值, 一般不会发生
+                    } else {
+                        params[index.get()] = member.read(in);
+                    }
+                    index.incrementAndGet();
+                }
+                in.readObjectE();
+                return InnerCoderEntity.create(params[0] == null ? 0 : (Integer) params[0], (String) params[1]);
+            }
+        };
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public String getVal() {
+        return val;
+    }
+}
+                

BSON的协议格式

      BSON类似Java自带的Serializable, 其格式如下: