Bson的skipValue方法支持部分常规Collection<JavaBean>、Map<String, JavaBean>字段类型

This commit is contained in:
Redkale
2018-11-19 15:32:24 +08:00
parent 2b2d53e515
commit 7c901731bc
4 changed files with 22 additions and 2 deletions

View File

@@ -61,7 +61,10 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
public void init(final ConvertFactory factory) {
this.factory = factory;
try {
if (type == Object.class) return;
if (type == Object.class) {
this.creatorConstructorMembers = null;
return;
}
Class clazz = null;
if (type instanceof ParameterizedType) {
@@ -229,7 +232,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
}
}
if (this.creatorConstructorMembers == null) { //空构造函数
final T result = this.creator.create();
final T result = this.creator == null ? null : this.creator.create();
boolean first = true;
while (hasNext(in, first)) {
DeMember member = in.readFieldName(members);
@@ -270,6 +273,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
first = false;
}
in.readObjectE(typeClass);
if (this.creator == null) return null;
final T result = this.creator.create(constructorParams);
for (int i = 0; i < oc; i++) {
((Attribute) otherParams[i][0]).set(result, otherParams[i][1]);

View File

@@ -36,6 +36,9 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
static final Decodeable collectionStringDecoder = instance.loadDecoder(new TypeToken<Collection<String>>() {
}.getType());
static final Decodeable collectionObjectDecoder = instance.loadDecoder(new TypeToken<Collection<Object>>() {
}.getType());
static final Decodeable mapStringIntegerDecoder = instance.loadDecoder(new TypeToken<Map<String, Integer>>() {
}.getType());
@@ -45,6 +48,9 @@ public final class BsonFactory extends ConvertFactory<BsonReader, BsonWriter> {
static final Decodeable mapStringStringDecoder = instance.loadDecoder(new TypeToken<Map<String, String>>() {
}.getType());
static final Decodeable mapStringObjectDecoder = instance.loadDecoder(new TypeToken<Map<String, Object>>() {
}.getType());
static {
instance.register(Serializable.class, objectDecoder);
instance.register(Serializable.class, objectEncoder);

View File

@@ -120,6 +120,9 @@ public class BsonReader extends Reader {
case 29:
BsonFactory.collectionStringDecoder.convertFrom(this);
break;
case 30:
BsonFactory.collectionObjectDecoder.convertFrom(this);
break;
case 45:
BsonFactory.mapStringIntegerDecoder.convertFrom(this);
break;
@@ -129,6 +132,9 @@ public class BsonReader extends Reader {
case 49:
BsonFactory.mapStringStringDecoder.convertFrom(this);
break;
case 50:
BsonFactory.mapStringObjectDecoder.convertFrom(this);
break;
case 101:
BoolArraySimpledCoder.instance.convertFrom(this);
break;

View File

@@ -248,6 +248,8 @@ public class BsonWriter extends Writer {
typeval = 26;
} else if (comType == String.class) {
typeval = 29;
} else if (!comType.toString().startsWith("java.lang")) {
typeval = 30;
}
}
if (typeval == 127 && member.getEncoder() instanceof MapEncoder) {
@@ -259,6 +261,8 @@ public class BsonWriter extends Writer {
typeval = 46;
} else if (keyType == String.class && valType == String.class) {
typeval = 49;
} else if (keyType == String.class && !valType.toString().startsWith("java.lang")) {
typeval = 50;
}
}
writeByte(typeval);