convert
This commit is contained in:
@@ -285,6 +285,37 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean isCollectionType(final Type type) {
|
||||||
|
if (type == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (type instanceof Class) {
|
||||||
|
return Collection.class.isAssignableFrom((Class) type);
|
||||||
|
}
|
||||||
|
ParameterizedType ptype = (ParameterizedType) type;
|
||||||
|
if (!(ptype.getRawType() instanceof Class)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Type[] ptargs = ptype.getActualTypeArguments();
|
||||||
|
if (ptargs == null || ptargs.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Class ownerType = (Class) ptype.getRawType();
|
||||||
|
return Collection.class.isAssignableFrom(ownerType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回null表示type不是Collection类型
|
||||||
|
protected Type getCollectionComponentType(final Type type) {
|
||||||
|
if (!isCollectionType(type)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (type instanceof Class) {
|
||||||
|
return Object.class;
|
||||||
|
}
|
||||||
|
ParameterizedType ptype = ((ParameterizedType) type);
|
||||||
|
return ptype.getActualTypeArguments()[0];
|
||||||
|
}
|
||||||
|
|
||||||
protected <E> Encodeable<W, E> createDyncEncoder(Type type) {
|
protected <E> Encodeable<W, E> createDyncEncoder(Type type) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,13 +36,17 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
|
|||||||
|
|
||||||
static final Encodeable objectEncoder = instance.loadEncoder(Object.class);
|
static final Encodeable objectEncoder = instance.loadEncoder(Object.class);
|
||||||
|
|
||||||
static final Decodeable arrayDecoder = new BsonArrayDecoder(instance, Object[].class);
|
// only for BsonRead.skipValue
|
||||||
|
static final Decodeable skipArrayDecoder = new BsonArrayDecoder(instance, Object[].class);
|
||||||
|
|
||||||
static final Decodeable collectionDecoder = new BsonCollectionDecoder(instance, Collection.class);
|
// only for BsonRead.skipValue
|
||||||
|
static final Decodeable skipCollectionDecoder = new BsonCollectionDecoder(instance, Collection.class);
|
||||||
|
|
||||||
static final Decodeable streamDecoder = new BsonStreamDecoder(instance, Stream.class);
|
// only for BsonRead.skipValue
|
||||||
|
static final Decodeable skipStreamDecoder = new BsonStreamDecoder(instance, Stream.class);
|
||||||
|
|
||||||
static final Decodeable mapDecoder = new BsonMapDecoder(instance, Map.class);
|
// only for BsonRead.skipValue
|
||||||
|
static final Decodeable skipMapDecoder = new BsonMapDecoder(instance, Map.class);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
instance.register(Serializable.class, objectDecoder);
|
instance.register(Serializable.class, objectDecoder);
|
||||||
@@ -154,55 +158,52 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected static byte typeEnum(final Type type) {
|
protected static byte typeEnum(final Type type) {
|
||||||
return typeEnum(TypeToken.typeToClass(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static byte typeEnum(final Class type) {
|
|
||||||
Objects.requireNonNull(type);
|
Objects.requireNonNull(type);
|
||||||
|
Class clazz = TypeToken.typeToClass(type);
|
||||||
byte typeval = 127; // 字段的类型值
|
byte typeval = 127; // 字段的类型值
|
||||||
if (type == boolean.class || type == Boolean.class) {
|
if (clazz == boolean.class || clazz == Boolean.class) {
|
||||||
typeval = 11;
|
typeval = 11;
|
||||||
} else if (type == byte.class || type == Byte.class) {
|
} else if (clazz == byte.class || clazz == Byte.class) {
|
||||||
typeval = 12;
|
typeval = 12;
|
||||||
} else if (type == short.class || type == Short.class) {
|
} else if (clazz == short.class || clazz == Short.class) {
|
||||||
typeval = 13;
|
typeval = 13;
|
||||||
} else if (type == char.class || type == Character.class) {
|
} else if (clazz == char.class || clazz == Character.class) {
|
||||||
typeval = 14;
|
typeval = 14;
|
||||||
} else if (type == int.class || type == Integer.class) {
|
} else if (clazz == int.class || clazz == Integer.class) {
|
||||||
typeval = 15;
|
typeval = 15;
|
||||||
} else if (type == long.class || type == Long.class) {
|
} else if (clazz == long.class || clazz == Long.class) {
|
||||||
typeval = 16;
|
typeval = 16;
|
||||||
} else if (type == float.class || type == Float.class) {
|
} else if (clazz == float.class || clazz == Float.class) {
|
||||||
typeval = 17;
|
typeval = 17;
|
||||||
} else if (type == double.class || type == Double.class) {
|
} else if (clazz == double.class || clazz == Double.class) {
|
||||||
typeval = 18;
|
typeval = 18;
|
||||||
} else if (type == String.class) {
|
} else if (clazz == String.class) {
|
||||||
typeval = 19;
|
typeval = 19;
|
||||||
} else if (type == boolean[].class || type == Boolean[].class) {
|
} else if (clazz == boolean[].class || clazz == Boolean[].class) {
|
||||||
typeval = 21;
|
typeval = 21;
|
||||||
} else if (type == byte[].class || type == Byte[].class) {
|
} else if (clazz == byte[].class || clazz == Byte[].class) {
|
||||||
typeval = 22;
|
typeval = 22;
|
||||||
} else if (type == short[].class || type == Short[].class) {
|
} else if (clazz == short[].class || clazz == Short[].class) {
|
||||||
typeval = 23;
|
typeval = 23;
|
||||||
} else if (type == char[].class || type == Character[].class) {
|
} else if (clazz == char[].class || clazz == Character[].class) {
|
||||||
typeval = 24;
|
typeval = 24;
|
||||||
} else if (type == int[].class || type == Integer[].class) {
|
} else if (clazz == int[].class || clazz == Integer[].class) {
|
||||||
typeval = 25;
|
typeval = 25;
|
||||||
} else if (type == long[].class || type == Long[].class) {
|
} else if (clazz == long[].class || clazz == Long[].class) {
|
||||||
typeval = 26;
|
typeval = 26;
|
||||||
} else if (type == float[].class || type == Float[].class) {
|
} else if (clazz == float[].class || clazz == Float[].class) {
|
||||||
typeval = 27;
|
typeval = 27;
|
||||||
} else if (type == double[].class || type == Double[].class) {
|
} else if (clazz == double[].class || clazz == Double[].class) {
|
||||||
typeval = 28;
|
typeval = 28;
|
||||||
} else if (type == String[].class) {
|
} else if (clazz == String[].class) {
|
||||||
typeval = 29;
|
typeval = 29;
|
||||||
} else if (type.isArray()) {
|
} else if (clazz.isArray()) {
|
||||||
typeval = 81;
|
typeval = 81;
|
||||||
} else if (Collection.class.isAssignableFrom(type)) {
|
} else if (Collection.class.isAssignableFrom(clazz)) {
|
||||||
typeval = 82;
|
typeval = 82;
|
||||||
} else if (Stream.class.isAssignableFrom(type)) {
|
} else if (Stream.class.isAssignableFrom(clazz)) {
|
||||||
typeval = 83;
|
typeval = 83;
|
||||||
} else if (Map.class.isAssignableFrom(type)) {
|
} else if (Map.class.isAssignableFrom(clazz)) {
|
||||||
typeval = 84;
|
typeval = 84;
|
||||||
}
|
}
|
||||||
return typeval;
|
return typeval;
|
||||||
@@ -247,15 +248,15 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
|
|||||||
case 29:
|
case 29:
|
||||||
return StringArraySimpledCoder.instance;
|
return StringArraySimpledCoder.instance;
|
||||||
case 81:
|
case 81:
|
||||||
return arrayDecoder;
|
return skipArrayDecoder;
|
||||||
case 82:
|
case 82:
|
||||||
return collectionDecoder;
|
return skipCollectionDecoder;
|
||||||
case 83:
|
case 83:
|
||||||
return streamDecoder;
|
return skipStreamDecoder;
|
||||||
case 84:
|
case 84:
|
||||||
return mapDecoder;
|
return skipMapDecoder;
|
||||||
case 127:
|
case 127:
|
||||||
return BsonFactory.objectDecoder;
|
return objectDecoder;
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,41 +104,8 @@ public class BsonReader extends Reader {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.fieldTypeEnum = 0;
|
this.fieldTypeEnum = 0;
|
||||||
switch (val) {
|
Decodeable decoder = BsonFactory.typeEnum(val);
|
||||||
case 11:
|
decoder.convertFrom(this);
|
||||||
readBoolean();
|
|
||||||
break;
|
|
||||||
case 12:
|
|
||||||
readByte();
|
|
||||||
break;
|
|
||||||
case 13:
|
|
||||||
readShort();
|
|
||||||
break;
|
|
||||||
case 14:
|
|
||||||
readChar();
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
readInt();
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
readLong();
|
|
||||||
break;
|
|
||||||
case 17:
|
|
||||||
readFloat();
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
readDouble();
|
|
||||||
break;
|
|
||||||
case 19:
|
|
||||||
readString();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Decodeable decoder = BsonFactory.typeEnum(val);
|
|
||||||
if (decoder != null) {
|
|
||||||
decoder.convertFrom(this);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
elementb.append(fieldName).append(',');
|
elementb.append(fieldName).append(',');
|
||||||
if (!ProtobufFactory.isSimpleType(fieldClass)
|
if (!ProtobufFactory.isSimpleType(fieldClass)
|
||||||
&& !fieldClass.isEnum()
|
&& !fieldClass.isEnum()
|
||||||
&& !ProtobufFactory.supportSimpleCollectionType(fieldType)) {
|
&& !factory.supportSimpleCollectionType(fieldType)) {
|
||||||
if ((member.getEncoder() instanceof SimpledCoder)) {
|
if ((member.getEncoder() instanceof SimpledCoder)) {
|
||||||
simpledCoders.put(fieldName, (SimpledCoder) member.getEncoder());
|
simpledCoders.put(fieldName, (SimpledCoder) member.getEncoder());
|
||||||
} else {
|
} else {
|
||||||
@@ -206,7 +206,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
||||||
}
|
}
|
||||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeFieldValue", "(ILjava/lang/Enum;)V", false);
|
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeFieldValue", "(ILjava/lang/Enum;)V", false);
|
||||||
} else if (ProtobufFactory.supportSimpleCollectionType(fieldType)) {
|
} else if (factory.supportSimpleCollectionType(fieldType)) {
|
||||||
mv.visitVarInsn(ALOAD, 3); // out
|
mv.visitVarInsn(ALOAD, 3); // out
|
||||||
Asms.visitInsn(mv, member.getTag()); // tag
|
Asms.visitInsn(mv, member.getTag()); // tag
|
||||||
mv.visitVarInsn(ALOAD, 2); // value
|
mv.visitVarInsn(ALOAD, 2); // value
|
||||||
@@ -220,7 +220,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
|||||||
String fdesc = org.redkale.asm.Type.getDescriptor(field.getType());
|
String fdesc = org.redkale.asm.Type.getDescriptor(field.getType());
|
||||||
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc);
|
||||||
}
|
}
|
||||||
Class componentType = ProtobufFactory.getSimpleCollectionComponentType(fieldType);
|
Class componentType = factory.getSimpleCollectionComponentType(fieldType);
|
||||||
String wmethodName = null;
|
String wmethodName = null;
|
||||||
if (componentType == Boolean.class) {
|
if (componentType == Boolean.class) {
|
||||||
wmethodName = "writeFieldBoolsValue";
|
wmethodName = "writeFieldBoolsValue";
|
||||||
|
|||||||
@@ -388,23 +388,8 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
|| fieldClass == String[].class;
|
|| fieldClass == String[].class;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static boolean supportSimpleCollectionType(Type type) {
|
protected boolean supportSimpleCollectionType(Type type) {
|
||||||
if (!(type instanceof ParameterizedType)) {
|
Type componentType = getCollectionComponentType(type);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ParameterizedType ptype = (ParameterizedType) type;
|
|
||||||
if (!(ptype.getRawType() instanceof Class)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Type[] ptargs = ptype.getActualTypeArguments();
|
|
||||||
if (ptargs == null || ptargs.length != 1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Class ownerType = (Class) ptype.getRawType();
|
|
||||||
if (!Collection.class.isAssignableFrom(ownerType)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Type componentType = ptargs[0];
|
|
||||||
return componentType == Boolean.class
|
return componentType == Boolean.class
|
||||||
|| componentType == Byte.class
|
|| componentType == Byte.class
|
||||||
|| componentType == Character.class
|
|| componentType == Character.class
|
||||||
@@ -494,10 +479,8 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
|
|||||||
return (n << 1) ^ (n >> 63);
|
return (n << 1) ^ (n >> 63);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Class getSimpleCollectionComponentType(Type type) {
|
protected Class getSimpleCollectionComponentType(Type type) {
|
||||||
return supportSimpleCollectionType(type)
|
return supportSimpleCollectionType(type) ? TypeToken.typeToClass(getCollectionComponentType(type)) : null;
|
||||||
? (Class) ((ParameterizedType) type).getActualTypeArguments()[0]
|
|
||||||
: null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {
|
public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {
|
||||||
|
|||||||
Reference in New Issue
Block a user