This commit is contained in:
RedKale
2016-04-18 10:46:31 +08:00
parent bf81697d17
commit f5b219dfdb
8 changed files with 62 additions and 41 deletions

View File

@@ -9,8 +9,10 @@ import java.lang.reflect.Type;
/** /**
* 对不明类型的对象进行序列化; BSON序列化时将对象的类名写入WriterJSON则不写入。 * 对不明类型的对象进行序列化; BSON序列化时将对象的类名写入WriterJSON则不写入。
* <p>
* <p>
* 详情见: http://redkale.org
* *
* <p> 详情见: http://redkale.org
* @author zhangjx * @author zhangjx
* @param <T> 序列化的泛型类型 * @param <T> 序列化的泛型类型
*/ */
@@ -26,10 +28,10 @@ public final class AnyEncoder<T> implements Encodeable<Writer, T> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void convertTo(final Writer out, final T value) { public void convertTo(final Writer out, final T value) {
if (value == null) { if (value == null) {
out.wirteClassName(null); out.writeClassName(null);
out.writeNull(); out.writeNull();
} else { } else {
out.wirteClassName(factory.getEntity(value.getClass())); if (out.needWriteClassName()) out.writeClassName(factory.getEntityAlias(value.getClass()));
factory.loadEncoder(value.getClass()).convertTo(out, value); factory.loadEncoder(value.getClass()).convertTo(out, value);
} }
} }

View File

@@ -5,14 +5,14 @@
*/ */
package org.redkale.convert; package org.redkale.convert;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.*;
/** /**
* 用于类名的别名, 类似javax.persistence.Table * 用于类名的别名, 类似javax.persistence.Table
* 该值必须是全局唯一 * 该值必须是全局唯一
* 使用场景: 当BSON序列化为了不指定class可以使用@ConvertEntity来取个别名。关联方法: Reader.readClassName() 和 Writer.wirteClassName(String value) 。 * 使用场景: 当BSON序列化为了不指定class可以使用@ConvertEntity来取个别名。关联方法: Reader.readClassName() 和 Writer.writeClassName(String value) 。
* *
* <p> 详情见: http://redkale.org * <p> 详情见: http://redkale.org
* @author zhangjx * @author zhangjx

View File

@@ -5,17 +5,14 @@
*/ */
package org.redkale.convert; package org.redkale.convert;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Map;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.math.BigInteger; import java.math.BigInteger;
import java.net.*; import java.net.*;
import java.nio.channels.*; import java.nio.channels.CompletionHandler;
import static org.redkale.convert.ext.InetAddressSimpledCoder.*;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.*; import java.util.regex.Pattern;
import org.redkale.convert.ext.InetAddressSimpledCoder.InetSocketAddressSimpledCoder;
import org.redkale.convert.ext.*; import org.redkale.convert.ext.*;
import org.redkale.util.*; import org.redkale.util.*;
@@ -175,19 +172,14 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
return fname; return fname;
} }
final String getEntity(Class clazz) { final String getEntityAlias(Class clazz) {
ConvertEntity ce = (ConvertEntity) clazz.getAnnotation(ConvertEntity.class); 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(); return ce == null ? clazz.getName() : ce.value();
} }
private Class findEntity(String name) { final Class getEntityAlias(String name) {
Class clazz = entitys.get(name); Class clazz = findEntityAlias(name);
return parent == null ? clazz : parent.findEntity(name);
}
final Class getEntity(String name) {
Class clazz = findEntity(name);
try { try {
return clazz == null ? Class.forName(name) : clazz; return clazz == null ? Class.forName(name) : clazz;
} catch (Exception ex) { } catch (Exception ex) {
@@ -195,6 +187,11 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
} }
} }
private Class findEntityAlias(String name) {
Class clazz = entitys.get(name);
return parent == null ? clazz : parent.findEntityAlias(name);
}
/** /**
* 使所有类的所有被声明为ConvertColumn.ignore = true 的字段或方法变为ConvertColumn.ignore = false * 使所有类的所有被声明为ConvertColumn.ignore = true 的字段或方法变为ConvertColumn.ignore = false
* *

View File

@@ -167,7 +167,7 @@ public final class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T
public final T convertFrom(final R in) { public final T convertFrom(final R in) {
final String clazz = in.readObjectB(typeClass); final String clazz = in.readObjectB(typeClass);
if (clazz == null) return null; if (clazz == null) return null;
if (!clazz.isEmpty()) return (T) factory.loadDecoder(factory.getEntity(clazz)).convertFrom(in); if (!clazz.isEmpty()) return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(in);
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {

View File

@@ -5,7 +5,6 @@
*/ */
package org.redkale.convert; package org.redkale.convert;
import org.redkale.util.Attribute;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*; import java.util.*;
import org.redkale.util.*; import org.redkale.util.*;
@@ -124,7 +123,7 @@ public final class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T
} }
if (value != null && value.getClass() != this.typeClass) { if (value != null && value.getClass() != this.typeClass) {
final Class clz = value.getClass(); final Class clz = value.getClass();
out.wirteClassName(factory.getEntity(clz)); if (out.needWriteClassName()) out.writeClassName(factory.getEntityAlias(clz));
factory.loadEncoder(clz).convertTo(out, value); factory.loadEncoder(clz).convertTo(out, value);
return; return;
} }

View File

@@ -31,12 +31,19 @@ public abstract class Writer {
*/ */
public abstract void writeNull(); public abstract void writeNull();
/**
* 是否需要写入类名, BSON需要 JSON不需要
*
* @return boolean
*/
public abstract boolean needWriteClassName();
/** /**
* 写入类名 * 写入类名
* *
* @param clazz 类名 * @param clazz 类名
*/ */
public abstract void wirteClassName(String clazz); public abstract void writeClassName(String clazz);
/** /**
* 输出一个对象前的操作 * 输出一个对象前的操作
@@ -54,7 +61,7 @@ public abstract class Writer {
* @param clazz 对象的类名 * @param clazz 对象的类名
*/ */
public final void writeObjectNull(final Class clazz) { public final void writeObjectNull(final Class clazz) {
wirteClassName(null); writeClassName(null);
writeNull(); writeNull();
} }

View File

@@ -5,8 +5,8 @@
*/ */
package org.redkale.convert.bson; package org.redkale.convert.bson;
import java.nio.*; import java.nio.ByteBuffer;
import java.util.function.*; import java.util.function.Predicate;
import org.redkale.convert.*; import org.redkale.convert.*;
import org.redkale.util.*; import org.redkale.util.*;
@@ -168,7 +168,12 @@ public class BsonWriter extends Writer {
} }
@Override @Override
public final void wirteClassName(String clazz) { public final boolean needWriteClassName() {
return true;
}
@Override
public final void writeClassName(String clazz) {
writeSmallString(clazz == null ? "" : clazz); writeSmallString(clazz == null ? "" : clazz);
} }
@@ -186,7 +191,7 @@ public class BsonWriter extends Writer {
} }
@Override @Override
public final void writeFieldName( Attribute attribute) { public final void writeFieldName(Attribute attribute) {
writeByte(BsonReader.SIGN_HASNEXT); writeByte(BsonReader.SIGN_HASNEXT);
writeSmallString(attribute.field()); writeSmallString(attribute.field());
byte typeval = 127; //字段的类型值 byte typeval = 127; //字段的类型值

View File

@@ -5,14 +5,14 @@
*/ */
package org.redkale.convert.json; package org.redkale.convert.json;
import java.nio.*; import java.nio.ByteBuffer;
import org.redkale.convert.*; import org.redkale.convert.Writer;
import org.redkale.util.*; import org.redkale.util.*;
/** /**
* *
* writeTo系列的方法输出的字符不能含特殊字符 * writeTo系列的方法输出的字符不能含特殊字符
* * <p>
* <p> * <p>
* 详情见: http://redkale.org * 详情见: http://redkale.org
* *
@@ -123,22 +123,28 @@ public class JsonWriter extends Writer {
content[count++] = '"'; content[count++] = '"';
for (char ch : Utility.charArray(value)) { for (char ch : Utility.charArray(value)) {
switch (ch) { switch (ch) {
case '\n': content[count++] = '\\'; case '\n':
content[count++] = '\\';
content[count++] = 'n'; content[count++] = 'n';
break; break;
case '\r': content[count++] = '\\'; case '\r':
content[count++] = '\\';
content[count++] = 'r'; content[count++] = 'r';
break; break;
case '\t': content[count++] = '\\'; case '\t':
content[count++] = '\\';
content[count++] = 't'; content[count++] = 't';
break; break;
case '\\': content[count++] = '\\'; case '\\':
content[count++] = '\\';
content[count++] = ch; content[count++] = ch;
break; break;
case '"': content[count++] = '\\'; case '"':
content[count++] = '\\';
content[count++] = ch; content[count++] = ch;
break; break;
default: content[count++] = ch; default:
content[count++] = ch;
break; break;
} }
} }
@@ -293,7 +299,12 @@ public class JsonWriter extends Writer {
} }
@Override @Override
public final void wirteClassName(String clazz) { public final boolean needWriteClassName() {
return false;
}
@Override
public final void writeClassName(String clazz) {
} }
@Override @Override