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则不写入。
* <p>
* <p>
* 详情见: http://redkale.org
*
* <p> 详情见: http://redkale.org
* @author zhangjx
* @param <T> 序列化的泛型类型
*/
@@ -26,10 +28,10 @@ public final class AnyEncoder<T> implements Encodeable<Writer, T> {
@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);
}
}

View File

@@ -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) 。
*
* <p> 详情见: http://redkale.org
* @author zhangjx

View File

@@ -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<R extends Reader, W extends Writer> {
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<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
*

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) {
final String clazz = in.readObjectB(typeClass);
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) {
synchronized (lock) {
try {

View File

@@ -5,7 +5,6 @@
*/
package org.redkale.convert;
import org.redkale.util.Attribute;
import java.lang.reflect.*;
import java.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) {
final Class clz = value.getClass();
out.wirteClassName(factory.getEntity(clz));
if (out.needWriteClassName()) out.writeClassName(factory.getEntityAlias(clz));
factory.loadEncoder(clz).convertTo(out, value);
return;
}

View File

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

View File

@@ -5,8 +5,8 @@
*/
package org.redkale.convert.bson;
import java.nio.*;
import java.util.function.*;
import java.nio.ByteBuffer;
import java.util.function.Predicate;
import org.redkale.convert.*;
import org.redkale.util.*;
@@ -154,7 +154,7 @@ public class BsonWriter extends Writer {
@Override
public final void writeLong(long value) {
writeTo((byte) (value >> 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; //字段的类型值

View File

@@ -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系列的方法输出的字符不能含特殊字符
*
* <p>
* <p>
* 详情见: 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