From 2b2d53e515a3e0e8ee03c286e54276278305069c Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 19 Nov 2018 15:14:48 +0800 Subject: [PATCH] =?UTF-8?q?Bson=E7=9A=84skipValue=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=83=A8=E5=88=86=E5=B8=B8=E8=A7=84Collectio?= =?UTF-8?q?n=E3=80=81Map=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/bson/BsonFactory.java | 21 ++++++++++++++++++- src/org/redkale/convert/bson/BsonReader.java | 18 ++++++++++++++++ src/org/redkale/convert/bson/BsonWriter.java | 21 +++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) 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); }