diff --git a/src/org/redkale/convert/bson/BsonFactory.java b/src/org/redkale/convert/bson/BsonFactory.java index 6ecb253d2..4585f106f 100644 --- a/src/org/redkale/convert/bson/BsonFactory.java +++ b/src/org/redkale/convert/bson/BsonFactory.java @@ -6,8 +6,9 @@ package org.redkale.convert.bson; import java.io.Serializable; +import java.util.*; import org.redkale.convert.*; -import org.redkale.util.AnyValue; +import org.redkale.util.*; /** * BSON的ConvertFactory @@ -26,6 +27,24 @@ public final class BsonFactory extends ConvertFactory { static final Encodeable objectEncoder = instance.loadEncoder(Object.class); + static final Decodeable collectionIntegerDecoder = instance.loadDecoder(new TypeToken>() { + }.getType()); + + static final Decodeable collectionLongDecoder = instance.loadDecoder(new TypeToken>() { + }.getType()); + + static final Decodeable collectionStringDecoder = instance.loadDecoder(new TypeToken>() { + }.getType()); + + static final Decodeable mapStringIntegerDecoder = instance.loadDecoder(new TypeToken>() { + }.getType()); + + static final Decodeable mapStringLongDecoder = instance.loadDecoder(new TypeToken>() { + }.getType()); + + static final Decodeable mapStringStringDecoder = instance.loadDecoder(new TypeToken>() { + }.getType()); + static { instance.register(Serializable.class, objectDecoder); instance.register(Serializable.class, objectEncoder); diff --git a/src/org/redkale/convert/bson/BsonReader.java b/src/org/redkale/convert/bson/BsonReader.java index 609a77f6d..df69fb74f 100644 --- a/src/org/redkale/convert/bson/BsonReader.java +++ b/src/org/redkale/convert/bson/BsonReader.java @@ -111,6 +111,24 @@ public class BsonReader extends Reader { break; case 9: readString(); break; + case 25: + BsonFactory.collectionIntegerDecoder.convertFrom(this); + break; + case 26: + BsonFactory.collectionLongDecoder.convertFrom(this); + break; + case 29: + BsonFactory.collectionStringDecoder.convertFrom(this); + break; + case 45: + BsonFactory.mapStringIntegerDecoder.convertFrom(this); + break; + case 46: + BsonFactory.mapStringLongDecoder.convertFrom(this); + break; + case 49: + BsonFactory.mapStringStringDecoder.convertFrom(this); + break; case 101: BoolArraySimpledCoder.instance.convertFrom(this); break; diff --git a/src/org/redkale/convert/bson/BsonWriter.java b/src/org/redkale/convert/bson/BsonWriter.java index 47f064bdc..16633c7c1 100644 --- a/src/org/redkale/convert/bson/BsonWriter.java +++ b/src/org/redkale/convert/bson/BsonWriter.java @@ -240,6 +240,27 @@ public class BsonWriter extends Writer { } else if (type == String[].class) { typeval = 109; } + if (typeval == 127 && member.getEncoder() instanceof CollectionEncoder) { + java.lang.reflect.Type comType = ((CollectionEncoder) member.getEncoder()).getEncoder().getType(); + if (comType == Integer.class) { + typeval = 25; + } else if (comType == Long.class) { + typeval = 26; + } else if (comType == String.class) { + typeval = 29; + } + } + if (typeval == 127 && member.getEncoder() instanceof MapEncoder) { + java.lang.reflect.Type keyType = ((MapEncoder) member.getEncoder()).getKeyencoder().getType(); + java.lang.reflect.Type valType = ((MapEncoder) member.getEncoder()).getValencoder().getType(); + if (keyType == String.class && valType == Integer.class) { + typeval = 45; + } else if (keyType == String.class && valType == Long.class) { + typeval = 46; + } else if (keyType == String.class && valType == String.class) { + typeval = 49; + } + } writeByte(typeval); }