diff --git a/src/main/java/org/redkale/convert/ConvertFactory.java b/src/main/java/org/redkale/convert/ConvertFactory.java index 57db3450c..74c5fcdd6 100644 --- a/src/main/java/org/redkale/convert/ConvertFactory.java +++ b/src/main/java/org/redkale/convert/ConvertFactory.java @@ -285,6 +285,37 @@ public abstract class ConvertFactory { 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 Encodeable createDyncEncoder(Type type) { return null; } diff --git a/src/main/java/org/redkale/convert/bson/BsonFactory.java b/src/main/java/org/redkale/convert/bson/BsonFactory.java index f55e75d7c..c74e1db09 100644 --- a/src/main/java/org/redkale/convert/bson/BsonFactory.java +++ b/src/main/java/org/redkale/convert/bson/BsonFactory.java @@ -36,13 +36,17 @@ public final class BsonFactory extends ConvertFactory { 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 { instance.register(Serializable.class, objectDecoder); @@ -154,55 +158,52 @@ public final class BsonFactory extends ConvertFactory { } protected static byte typeEnum(final Type type) { - return typeEnum(TypeToken.typeToClass(type)); - } - - protected static byte typeEnum(final Class type) { Objects.requireNonNull(type); + Class clazz = TypeToken.typeToClass(type); byte typeval = 127; // 字段的类型值 - if (type == boolean.class || type == Boolean.class) { + if (clazz == boolean.class || clazz == Boolean.class) { typeval = 11; - } else if (type == byte.class || type == Byte.class) { + } else if (clazz == byte.class || clazz == Byte.class) { typeval = 12; - } else if (type == short.class || type == Short.class) { + } else if (clazz == short.class || clazz == Short.class) { typeval = 13; - } else if (type == char.class || type == Character.class) { + } else if (clazz == char.class || clazz == Character.class) { typeval = 14; - } else if (type == int.class || type == Integer.class) { + } else if (clazz == int.class || clazz == Integer.class) { typeval = 15; - } else if (type == long.class || type == Long.class) { + } else if (clazz == long.class || clazz == Long.class) { typeval = 16; - } else if (type == float.class || type == Float.class) { + } else if (clazz == float.class || clazz == Float.class) { typeval = 17; - } else if (type == double.class || type == Double.class) { + } else if (clazz == double.class || clazz == Double.class) { typeval = 18; - } else if (type == String.class) { + } else if (clazz == String.class) { typeval = 19; - } else if (type == boolean[].class || type == Boolean[].class) { + } else if (clazz == boolean[].class || clazz == Boolean[].class) { typeval = 21; - } else if (type == byte[].class || type == Byte[].class) { + } else if (clazz == byte[].class || clazz == Byte[].class) { typeval = 22; - } else if (type == short[].class || type == Short[].class) { + } else if (clazz == short[].class || clazz == Short[].class) { typeval = 23; - } else if (type == char[].class || type == Character[].class) { + } else if (clazz == char[].class || clazz == Character[].class) { typeval = 24; - } else if (type == int[].class || type == Integer[].class) { + } else if (clazz == int[].class || clazz == Integer[].class) { typeval = 25; - } else if (type == long[].class || type == Long[].class) { + } else if (clazz == long[].class || clazz == Long[].class) { typeval = 26; - } else if (type == float[].class || type == Float[].class) { + } else if (clazz == float[].class || clazz == Float[].class) { typeval = 27; - } else if (type == double[].class || type == Double[].class) { + } else if (clazz == double[].class || clazz == Double[].class) { typeval = 28; - } else if (type == String[].class) { + } else if (clazz == String[].class) { typeval = 29; - } else if (type.isArray()) { + } else if (clazz.isArray()) { typeval = 81; - } else if (Collection.class.isAssignableFrom(type)) { + } else if (Collection.class.isAssignableFrom(clazz)) { typeval = 82; - } else if (Stream.class.isAssignableFrom(type)) { + } else if (Stream.class.isAssignableFrom(clazz)) { typeval = 83; - } else if (Map.class.isAssignableFrom(type)) { + } else if (Map.class.isAssignableFrom(clazz)) { typeval = 84; } return typeval; @@ -247,15 +248,15 @@ public final class BsonFactory extends ConvertFactory { case 29: return StringArraySimpledCoder.instance; case 81: - return arrayDecoder; + return skipArrayDecoder; case 82: - return collectionDecoder; + return skipCollectionDecoder; case 83: - return streamDecoder; + return skipStreamDecoder; case 84: - return mapDecoder; + return skipMapDecoder; case 127: - return BsonFactory.objectDecoder; + return objectDecoder; default: return null; } diff --git a/src/main/java/org/redkale/convert/bson/BsonReader.java b/src/main/java/org/redkale/convert/bson/BsonReader.java index b5bd4a507..878fa6684 100644 --- a/src/main/java/org/redkale/convert/bson/BsonReader.java +++ b/src/main/java/org/redkale/convert/bson/BsonReader.java @@ -104,41 +104,8 @@ public class BsonReader extends Reader { return; } this.fieldTypeEnum = 0; - switch (val) { - case 11: - 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; - } + Decodeable decoder = BsonFactory.typeEnum(val); + decoder.convertFrom(this); } @Override diff --git a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java index 4f02e59c1..88e12fa75 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java @@ -60,7 +60,7 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { elementb.append(fieldName).append(','); if (!ProtobufFactory.isSimpleType(fieldClass) && !fieldClass.isEnum() - && !ProtobufFactory.supportSimpleCollectionType(fieldType)) { + && !factory.supportSimpleCollectionType(fieldType)) { if ((member.getEncoder() instanceof SimpledCoder)) { simpledCoders.put(fieldName, (SimpledCoder) member.getEncoder()); } else { @@ -206,7 +206,7 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc); } 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 Asms.visitInsn(mv, member.getTag()); // tag mv.visitVarInsn(ALOAD, 2); // value @@ -220,7 +220,7 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { String fdesc = org.redkale.asm.Type.getDescriptor(field.getType()); mv.visitFieldInsn(GETFIELD, valtypeName, fname, fdesc); } - Class componentType = ProtobufFactory.getSimpleCollectionComponentType(fieldType); + Class componentType = factory.getSimpleCollectionComponentType(fieldType); String wmethodName = null; if (componentType == Boolean.class) { wmethodName = "writeFieldBoolsValue"; diff --git a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java index 58159c3bb..a52a846a5 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java @@ -388,23 +388,8 @@ public class ProtobufFactory extends ConvertFactory> 63); } - public static Class getSimpleCollectionComponentType(Type type) { - return supportSimpleCollectionType(type) - ? (Class) ((ParameterizedType) type).getActualTypeArguments()[0] - : null; + protected Class getSimpleCollectionComponentType(Type type) { + return supportSimpleCollectionType(type) ? TypeToken.typeToClass(getCollectionComponentType(type)) : null; } public static int getTag(String fieldName, Type fieldType, int fieldPos, boolean enumtostring) {