Bson的skipValue方法支持部分常规Collection<JavaBean>、Map<String, JavaBean>字段类型
This commit is contained in:
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user