From f5b219dfdb3421fe42c3caabdc54f1bb6526740b Mon Sep 17 00:00:00 2001 From: RedKale <22250530@qq.com> Date: Mon, 18 Apr 2016 10:46:31 +0800 Subject: [PATCH] --- src/org/redkale/convert/AnyEncoder.java | 8 +++-- src/org/redkale/convert/ConvertEntity.java | 4 +-- src/org/redkale/convert/ConvertFactory.java | 29 ++++++++---------- src/org/redkale/convert/ObjectDecoder.java | 2 +- src/org/redkale/convert/ObjectEncoder.java | 3 +- src/org/redkale/convert/Writer.java | 11 +++++-- src/org/redkale/convert/bson/BsonWriter.java | 15 ++++++---- src/org/redkale/convert/json/JsonWriter.java | 31 +++++++++++++------- 8 files changed, 62 insertions(+), 41 deletions(-) diff --git a/src/org/redkale/convert/AnyEncoder.java b/src/org/redkale/convert/AnyEncoder.java index 344e232e0..1bba9b1b4 100644 --- a/src/org/redkale/convert/AnyEncoder.java +++ b/src/org/redkale/convert/AnyEncoder.java @@ -9,8 +9,10 @@ import java.lang.reflect.Type; /** * 对不明类型的对象进行序列化; BSON序列化时将对象的类名写入Writer,JSON则不写入。 + *

+ *

+ * 详情见: http://redkale.org * - *

详情见: http://redkale.org * @author zhangjx * @param 序列化的泛型类型 */ @@ -26,10 +28,10 @@ public final class AnyEncoder implements Encodeable { @SuppressWarnings("unchecked") public void convertTo(final Writer out, final T value) { if (value == null) { - out.wirteClassName(null); + out.writeClassName(null); out.writeNull(); } else { - out.wirteClassName(factory.getEntity(value.getClass())); + if (out.needWriteClassName()) out.writeClassName(factory.getEntityAlias(value.getClass())); factory.loadEncoder(value.getClass()).convertTo(out, value); } } diff --git a/src/org/redkale/convert/ConvertEntity.java b/src/org/redkale/convert/ConvertEntity.java index 51ba2cf3a..cc0f2bc85 100644 --- a/src/org/redkale/convert/ConvertEntity.java +++ b/src/org/redkale/convert/ConvertEntity.java @@ -5,14 +5,14 @@ */ package org.redkale.convert; -import java.lang.annotation.*; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.*; /** * 用于类名的别名, 类似javax.persistence.Table * 该值必须是全局唯一 - * 使用场景: 当BSON序列化为了不指定class可以使用@ConvertEntity来取个别名。关联方法: Reader.readClassName() 和 Writer.wirteClassName(String value) 。 + * 使用场景: 当BSON序列化为了不指定class可以使用@ConvertEntity来取个别名。关联方法: Reader.readClassName() 和 Writer.writeClassName(String value) 。 * *

详情见: http://redkale.org * @author zhangjx diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index c83ebb163..dc55dea10 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -5,17 +5,14 @@ */ package org.redkale.convert; -import java.lang.reflect.Type; -import java.util.Collection; -import java.util.Map; import java.lang.reflect.*; import java.math.BigInteger; import java.net.*; -import java.nio.channels.*; -import static org.redkale.convert.ext.InetAddressSimpledCoder.*; +import java.nio.channels.CompletionHandler; import java.util.*; -import java.util.concurrent.*; -import java.util.regex.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Pattern; +import org.redkale.convert.ext.InetAddressSimpledCoder.InetSocketAddressSimpledCoder; import org.redkale.convert.ext.*; import org.redkale.util.*; @@ -175,19 +172,14 @@ public abstract class ConvertFactory { return fname; } - final String getEntity(Class clazz) { + final String getEntityAlias(Class clazz) { ConvertEntity ce = (ConvertEntity) clazz.getAnnotation(ConvertEntity.class); - if (ce != null && findEntity(ce.value()) == null) entitys.put(ce.value(), clazz); + if (ce != null && findEntityAlias(ce.value()) == null) entitys.put(ce.value(), clazz); return ce == null ? clazz.getName() : ce.value(); } - private Class findEntity(String name) { - Class clazz = entitys.get(name); - return parent == null ? clazz : parent.findEntity(name); - } - - final Class getEntity(String name) { - Class clazz = findEntity(name); + final Class getEntityAlias(String name) { + Class clazz = findEntityAlias(name); try { return clazz == null ? Class.forName(name) : clazz; } catch (Exception ex) { @@ -195,6 +187,11 @@ public abstract class ConvertFactory { } } + private Class findEntityAlias(String name) { + Class clazz = entitys.get(name); + return parent == null ? clazz : parent.findEntityAlias(name); + } + /** * 使所有类的所有被声明为ConvertColumn.ignore = true 的字段或方法变为ConvertColumn.ignore = false * diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index a550a4998..baf98ccb9 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -167,7 +167,7 @@ public final class ObjectDecoder implements Decodeable implements Encodeable> 56), (byte) (value >> 48), (byte) (value >> 40), (byte) (value >> 32), - (byte) (value >> 24), (byte) (value >> 16), (byte) (value >> 8), (byte) value); + (byte) (value >> 24), (byte) (value >> 16), (byte) (value >> 8), (byte) value); } @Override @@ -168,7 +168,12 @@ public class BsonWriter extends Writer { } @Override - public final void wirteClassName(String clazz) { + public final boolean needWriteClassName() { + return true; + } + + @Override + public final void writeClassName(String clazz) { writeSmallString(clazz == null ? "" : clazz); } @@ -186,7 +191,7 @@ public class BsonWriter extends Writer { } @Override - public final void writeFieldName( Attribute attribute) { + public final void writeFieldName(Attribute attribute) { writeByte(BsonReader.SIGN_HASNEXT); writeSmallString(attribute.field()); byte typeval = 127; //字段的类型值 diff --git a/src/org/redkale/convert/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index 957531db2..6fda666e4 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -5,14 +5,14 @@ */ package org.redkale.convert.json; -import java.nio.*; -import org.redkale.convert.*; +import java.nio.ByteBuffer; +import org.redkale.convert.Writer; import org.redkale.util.*; /** * * writeTo系列的方法输出的字符不能含特殊字符 - * + *

*

* 详情见: http://redkale.org * @@ -123,22 +123,28 @@ public class JsonWriter extends Writer { content[count++] = '"'; for (char ch : Utility.charArray(value)) { switch (ch) { - case '\n': content[count++] = '\\'; + case '\n': + content[count++] = '\\'; content[count++] = 'n'; break; - case '\r': content[count++] = '\\'; + case '\r': + content[count++] = '\\'; content[count++] = 'r'; break; - case '\t': content[count++] = '\\'; + case '\t': + content[count++] = '\\'; content[count++] = 't'; break; - case '\\': content[count++] = '\\'; + case '\\': + content[count++] = '\\'; content[count++] = ch; break; - case '"': content[count++] = '\\'; + case '"': + content[count++] = '\\'; content[count++] = ch; break; - default: content[count++] = ch; + default: + content[count++] = ch; break; } } @@ -293,7 +299,12 @@ public class JsonWriter extends Writer { } @Override - public final void wirteClassName(String clazz) { + public final boolean needWriteClassName() { + return false; + } + + @Override + public final void writeClassName(String clazz) { } @Override