This commit is contained in:
@@ -9,8 +9,10 @@ import java.lang.reflect.Type;
|
||||
|
||||
/**
|
||||
* 对不明类型的对象进行序列化; BSON序列化时将对象的类名写入Writer,JSON则不写入。
|
||||
* <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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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; //字段的类型值
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user