调整Convert部分内部接口

This commit is contained in:
Redkale
2018-11-27 14:10:58 +08:00
parent 9e553aeff6
commit 47dab88d72
28 changed files with 353 additions and 132 deletions

View File

@@ -28,7 +28,7 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
protected final Class componentClass; protected final Class componentClass;
protected final Decodeable<Reader, T> decoder; protected final Decodeable<Reader, T> componentDecoder;
protected boolean inited = false; protected boolean inited = false;
@@ -51,7 +51,7 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
this.componentClass = (Class) this.componentType; this.componentClass = (Class) this.componentType;
} }
factory.register(type, this); factory.register(type, this);
this.decoder = factory.loadDecoder(this.componentType); this.componentDecoder = factory.loadDecoder(this.componentType);
} finally { } finally {
inited = true; inited = true;
synchronized (lock) { synchronized (lock) {
@@ -66,14 +66,15 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
} }
public T[] convertFrom(Reader in, DeMember member) { public T[] convertFrom(Reader in, DeMember member) {
int len = in.readArrayB(member, decoder); byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, componentDecoder);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, decoder); contentLength = in.readMemberContentLength(member, componentDecoder);
len = Reader.SIGN_NOLENGTH; len = Reader.SIGN_NOLENGTH;
} }
if (this.decoder == null) { if (this.componentDecoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -84,7 +85,7 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
} }
} }
} }
final Decodeable<Reader, T> localdecoder = this.decoder; final Decodeable<Reader, T> localdecoder = getComponentDecoder(this.componentDecoder, typevals);
final List<T> result = new ArrayList(); final List<T> result = new ArrayList();
boolean first = true; boolean first = true;
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
@@ -92,7 +93,7 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
while (hasNext(in, member, startPosition, contentLength, first)) { while (hasNext(in, member, startPosition, contentLength, first)) {
Reader itemReader = getItemReader(in, member, first); Reader itemReader = getItemReader(in, member, first);
if (itemReader == null) break; if (itemReader == null) break;
result.add(readMemberValue(itemReader, member, first)); result.add(readMemberValue(itemReader, member, localdecoder, first));
first = false; first = false;
} }
} else { } else {
@@ -109,17 +110,21 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
return in.hasNext(startPosition, contentLength); return in.hasNext(startPosition, contentLength);
} }
protected Decodeable<Reader, T> getComponentDecoder(Decodeable<Reader, T> decoder, byte[] typevals) {
return decoder;
}
protected Reader getItemReader(Reader in, DeMember member, boolean first) { protected Reader getItemReader(Reader in, DeMember member, boolean first) {
return in; return in;
} }
protected T readMemberValue(Reader in, DeMember member, boolean first) { protected T readMemberValue(Reader in, DeMember member, Decodeable<Reader, T> decoder, boolean first) {
return this.decoder.convertFrom(in); return decoder.convertFrom(in);
} }
@Override @Override
public String toString() { public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" + this.decoder + "}"; return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" + this.componentDecoder + "}";
} }
@Override @Override
@@ -131,8 +136,8 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
return componentType; return componentType;
} }
public Decodeable<Reader, T> getDecoder() { public Decodeable<Reader, T> getComponentDecoder() {
return decoder; return componentDecoder;
} }
} }

View File

@@ -27,7 +27,7 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
protected final Encodeable anyEncoder; protected final Encodeable anyEncoder;
protected final Encodeable<Writer, Object> encoder; protected final Encodeable<Writer, Object> componentEncoder;
protected boolean inited = false; protected boolean inited = false;
@@ -45,7 +45,7 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
throw new ConvertException("(" + type + ") is not a array type"); throw new ConvertException("(" + type + ") is not a array type");
} }
factory.register(type, this); factory.register(type, this);
this.encoder = factory.loadEncoder(this.componentType); this.componentEncoder = factory.loadEncoder(this.componentType);
this.anyEncoder = factory.getAnyEncoder(); this.anyEncoder = factory.getAnyEncoder();
} finally { } finally {
inited = true; inited = true;
@@ -66,11 +66,11 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
return; return;
} }
if (value.length == 0) { if (value.length == 0) {
out.writeArrayB(0, encoder, value); out.writeArrayB(0, componentEncoder, value);
out.writeArrayE(); out.writeArrayE();
return; return;
} }
if (this.encoder == null) { if (this.componentEncoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -81,12 +81,12 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
} }
} }
} }
if (out.writeArrayB(value.length, encoder, value) < 0) { if (out.writeArrayB(value.length, componentEncoder, value) < 0) {
final Type comp = this.componentType; final Type comp = this.componentType;
boolean first = true; boolean first = true;
for (Object v : value) { for (Object v : value) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
writeMemberValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? encoder : anyEncoder), v, first); writeMemberValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? componentEncoder : anyEncoder), v, first);
if (first) first = false; if (first) first = false;
} }
} }
@@ -99,7 +99,7 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
@Override @Override
public String toString() { public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.encoder + "}"; return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.componentEncoder + "}";
} }
@Override @Override
@@ -111,8 +111,8 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
return componentType; return componentType;
} }
public Encodeable<Writer, Object> getEncoder() { public Encodeable<Writer, Object> getComponentEncoder() {
return encoder; return componentEncoder;
} }
} }

View File

@@ -29,7 +29,7 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
protected Creator<Collection<T>> creator; protected Creator<Collection<T>> creator;
protected final Decodeable<Reader, T> decoder; protected final Decodeable<Reader, T> componentDecoder;
protected boolean inited = false; protected boolean inited = false;
@@ -43,12 +43,12 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
this.componentType = pt.getActualTypeArguments()[0]; this.componentType = pt.getActualTypeArguments()[0];
this.creator = factory.loadCreator((Class) pt.getRawType()); this.creator = factory.loadCreator((Class) pt.getRawType());
factory.register(type, this); factory.register(type, this);
this.decoder = factory.loadDecoder(this.componentType); this.componentDecoder = factory.loadDecoder(this.componentType);
} else if (factory.isReversible()) { } else if (factory.isReversible()) {
this.componentType = Object.class; this.componentType = Object.class;
this.creator = factory.loadCreator(type instanceof Class ? (Class) type : Collection.class); this.creator = factory.loadCreator(type instanceof Class ? (Class) type : Collection.class);
factory.register(type, this); factory.register(type, this);
this.decoder = factory.loadDecoder(this.componentType); this.componentDecoder = factory.loadDecoder(this.componentType);
} else { } else {
throw new ConvertException("CollectionDecoder not support the type (" + type + ")"); throw new ConvertException("CollectionDecoder not support the type (" + type + ")");
} }
@@ -66,14 +66,15 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
} }
public Collection<T> convertFrom(Reader in, DeMember member) { public Collection<T> convertFrom(Reader in, DeMember member) {
int len = in.readArrayB(member, decoder); byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, componentDecoder);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, decoder); contentLength = in.readMemberContentLength(member, componentDecoder);
len = Reader.SIGN_NOLENGTH; len = Reader.SIGN_NOLENGTH;
} }
if (this.decoder == null) { if (this.componentDecoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -84,7 +85,7 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
} }
} }
} }
final Decodeable<Reader, T> localdecoder = this.decoder; final Decodeable<Reader, T> localdecoder = getComponentDecoder(this.componentDecoder, typevals);
final Collection<T> result = this.creator.create(); final Collection<T> result = this.creator.create();
boolean first = true; boolean first = true;
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
@@ -92,7 +93,7 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
while (hasNext(in, member, startPosition, contentLength, first)) { while (hasNext(in, member, startPosition, contentLength, first)) {
Reader itemReader = getItemReader(in, member, first); Reader itemReader = getItemReader(in, member, first);
if (itemReader == null) break; if (itemReader == null) break;
result.add(readMemberValue(itemReader, member, first)); result.add(readMemberValue(itemReader, member, localdecoder, first));
first = false; first = false;
} }
} else { } else {
@@ -108,12 +109,16 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
return in.hasNext(startPosition, contentLength); return in.hasNext(startPosition, contentLength);
} }
protected Decodeable<Reader, T> getComponentDecoder(Decodeable<Reader, T> decoder, byte[] typevals) {
return decoder;
}
protected Reader getItemReader(Reader in, DeMember member, boolean first) { protected Reader getItemReader(Reader in, DeMember member, boolean first) {
return in; return in;
} }
protected T readMemberValue(Reader in, DeMember member, boolean first) { protected T readMemberValue(Reader in, DeMember member, Decodeable<Reader, T> decoder, boolean first) {
return this.decoder.convertFrom(in); return decoder.convertFrom(in);
} }
@Override @Override
@@ -125,8 +130,8 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
return componentType; return componentType;
} }
public Decodeable<Reader, T> getDecoder() { public Decodeable<Reader, T> getComponentDecoder() {
return decoder; return componentDecoder;
} }
} }

View File

@@ -23,7 +23,7 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
protected final Type type; protected final Type type;
protected final Encodeable<Writer, Object> encoder; protected final Encodeable<Writer, Object> componentEncoder;
protected boolean inited = false; protected boolean inited = false;
@@ -35,12 +35,12 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
if (type instanceof ParameterizedType) { if (type instanceof ParameterizedType) {
Type t = ((ParameterizedType) type).getActualTypeArguments()[0]; Type t = ((ParameterizedType) type).getActualTypeArguments()[0];
if (t instanceof TypeVariable) { if (t instanceof TypeVariable) {
this.encoder = factory.getAnyEncoder(); this.componentEncoder = factory.getAnyEncoder();
} else { } else {
this.encoder = factory.loadEncoder(t); this.componentEncoder = factory.loadEncoder(t);
} }
} else { } else {
this.encoder = factory.getAnyEncoder(); this.componentEncoder = factory.getAnyEncoder();
} }
} finally { } finally {
inited = true; inited = true;
@@ -61,11 +61,11 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
return; return;
} }
if (value.isEmpty()) { if (value.isEmpty()) {
out.writeArrayB(0, encoder, value); out.writeArrayB(0, componentEncoder, value);
out.writeArrayE(); out.writeArrayE();
return; return;
} }
if (this.encoder == null) { if (this.componentEncoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -76,7 +76,7 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
} }
} }
} }
if (out.writeArrayB(value.size(), encoder, value) < 0) { if (out.writeArrayB(value.size(), componentEncoder, value) < 0) {
boolean first = true; boolean first = true;
for (Object v : value) { for (Object v : value) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
@@ -88,7 +88,7 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
} }
protected void writeValue(Writer out, EnMember member, Object value) { protected void writeValue(Writer out, EnMember member, Object value) {
encoder.convertTo(out, value); componentEncoder.convertTo(out, value);
} }
@Override @Override
@@ -96,8 +96,11 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
return type; return type;
} }
public Encodeable<Writer, Object> getEncoder() { public Encodeable<Writer, Object> getComponentEncoder() {
return encoder; return componentEncoder;
} }
public Type getComponentType() {
return componentEncoder == null ? null : componentEncoder.getType();
}
} }

View File

@@ -91,7 +91,8 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
} }
} }
} }
int len = in.readMapB(member, this.keyDecoder); byte[] typevals = new byte[2];
int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {
@@ -100,22 +101,24 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
} }
final Map<K, V> result = this.creator.create(); final Map<K, V> result = this.creator.create();
boolean first = true; boolean first = true;
Decodeable<Reader, K> kdecoder = getKeyDecoder(this.keyDecoder, typevals);
Decodeable<Reader, V> vdecoder = getValueDecoder(this.valueDecoder, typevals);
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position(); int startPosition = in.position();
while (hasNext(in, member, startPosition, contentLength, first)) { while (hasNext(in, member, startPosition, contentLength, first)) {
Reader entryReader = getEntryReader(in, member, first); Reader entryReader = getEntryReader(in, member, first);
if (entryReader == null) break; if (entryReader == null) break;
K key = readKeyMember(entryReader, member, first); K key = readKeyMember(entryReader, member, kdecoder, first);
entryReader.readBlank(); entryReader.readBlank();
V value = readValueMember(entryReader, member, first); V value = readValueMember(entryReader, member, vdecoder, first);
result.put(key, value); result.put(key, value);
first = false; first = false;
} }
} else { } else {
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
K key = readKeyMember(in, member, first); K key = readKeyMember(in, member, kdecoder, first);
in.readBlank(); in.readBlank();
V value = readValueMember(in, member, first); V value = readValueMember(in, member, vdecoder, first);
result.put(key, value); result.put(key, value);
first = false; first = false;
} }
@@ -128,16 +131,24 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
return in.hasNext(startPosition, contentLength); return in.hasNext(startPosition, contentLength);
} }
protected Decodeable<Reader, K> getKeyDecoder(Decodeable<Reader, K> decoder, byte[] typevals) {
return decoder;
}
protected Decodeable<Reader, V> getValueDecoder(Decodeable<Reader, V> decoder, byte[] typevals) {
return decoder;
}
protected Reader getEntryReader(Reader in, DeMember member, boolean first) { protected Reader getEntryReader(Reader in, DeMember member, boolean first) {
return in; return in;
} }
protected K readKeyMember(Reader in, DeMember member, boolean first) { protected K readKeyMember(Reader in, DeMember member, Decodeable<Reader, K> decoder, boolean first) {
return keyDecoder.convertFrom(in); return decoder.convertFrom(in);
} }
protected V readValueMember(Reader in, DeMember member, boolean first) { protected V readValueMember(Reader in, DeMember member, Decodeable<Reader, V> decoder, boolean first) {
return valueDecoder.convertFrom(in); return decoder.convertFrom(in);
} }
@Override @Override

View File

@@ -24,9 +24,9 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
protected final Type type; protected final Type type;
protected final Encodeable<Writer, K> keyencoder; protected final Encodeable<Writer, K> keyEncoder;
protected final Encodeable<Writer, V> valencoder; protected final Encodeable<Writer, V> valueEncoder;
protected boolean inited = false; protected boolean inited = false;
@@ -37,11 +37,11 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
try { try {
if (type instanceof ParameterizedType) { if (type instanceof ParameterizedType) {
final Type[] pt = ((ParameterizedType) type).getActualTypeArguments(); final Type[] pt = ((ParameterizedType) type).getActualTypeArguments();
this.keyencoder = factory.loadEncoder(pt[0]); this.keyEncoder = factory.loadEncoder(pt[0]);
this.valencoder = factory.loadEncoder(pt[1]); this.valueEncoder = factory.loadEncoder(pt[1]);
} else { } else {
this.keyencoder = factory.getAnyEncoder(); this.keyEncoder = factory.getAnyEncoder();
this.valencoder = factory.getAnyEncoder(); this.valueEncoder = factory.getAnyEncoder();
} }
} finally { } finally {
inited = true; inited = true;
@@ -63,7 +63,7 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
return; return;
} }
if (this.keyencoder == null || this.valencoder == null) { if (this.keyEncoder == null || this.valueEncoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -74,7 +74,7 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
} }
} }
} }
if (out.writeMapB(values.size(), (Encodeable) keyencoder, (Encodeable) valencoder, value) < 0) { if (out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value) < 0) {
boolean first = true; boolean first = true;
for (Map.Entry<K, V> en : values.entrySet()) { for (Map.Entry<K, V> en : values.entrySet()) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
@@ -86,9 +86,9 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
} }
protected void writeMemberValue(Writer out, EnMember member, K key, V value, boolean first) { protected void writeMemberValue(Writer out, EnMember member, K key, V value, boolean first) {
keyencoder.convertTo(out, key); keyEncoder.convertTo(out, key);
out.writeMapMark(); out.writeMapMark();
valencoder.convertTo(out, value); valueEncoder.convertTo(out, value);
} }
@Override @Override
@@ -96,12 +96,20 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
return type; return type;
} }
public Encodeable<Writer, K> getKeyencoder() { public Type getKeyType() {
return keyencoder; return keyEncoder == null ? null : keyEncoder.getType();
} }
public Encodeable<Writer, V> getValencoder() { public Type getValueType() {
return valencoder; return valueEncoder == null ? null : valueEncoder.getType();
}
public Encodeable<Writer, K> getKeyEncoder() {
return keyEncoder;
}
public Encodeable<Writer, V> getValueEncoder() {
return valueEncoder;
} }
} }

View File

@@ -96,11 +96,12 @@ public abstract class Reader {
* 读取数组的开头并返回数组的长度 * 读取数组的开头并返回数组的长度
* *
* @param member DeMember * @param member DeMember
* @param decoder Decodeable * @param typevals byte[]
* @param componentDecoder Decodeable
* *
* @return 返回数组的长度 * @return 返回数组的长度
*/ */
public abstract int readArrayB(DeMember member, Decodeable decoder); public abstract int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder);
/** /**
* 读取数组的尾端 * 读取数组的尾端
@@ -112,11 +113,13 @@ public abstract class Reader {
* 读取map的开头并返回map的size * 读取map的开头并返回map的size
* *
* @param member DeMember * @param member DeMember
* @param keydecoder Decodeable * @param typevals byte[]
* @param keyDecoder Decodeable
* @param valueDecoder Decodeable
* *
* @return 返回map的size * @return 返回map的size
*/ */
public abstract int readMapB(DeMember member, Decodeable keydecoder); public abstract int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder);
/** /**
* 读取数组的尾端 * 读取数组的尾端

View File

@@ -30,7 +30,7 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
protected Creator<Stream<T>> creator; protected Creator<Stream<T>> creator;
protected final Decodeable<Reader, T> decoder; protected final Decodeable<Reader, T> componentDecoder;
protected boolean inited = false; protected boolean inited = false;
@@ -44,7 +44,7 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
this.componentType = pt.getActualTypeArguments()[0]; this.componentType = pt.getActualTypeArguments()[0];
this.creator = factory.loadCreator((Class) pt.getRawType()); this.creator = factory.loadCreator((Class) pt.getRawType());
factory.register(type, this); factory.register(type, this);
this.decoder = factory.loadDecoder(this.componentType); this.componentDecoder = factory.loadDecoder(this.componentType);
} else { } else {
throw new ConvertException("StreamDecoder not support the type (" + type + ")"); throw new ConvertException("StreamDecoder not support the type (" + type + ")");
} }
@@ -62,14 +62,15 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
} }
public Stream<T> convertFrom(Reader in, DeMember member) { public Stream<T> convertFrom(Reader in, DeMember member) {
int len = in.readArrayB(member, this.decoder); byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, this.componentDecoder);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, this.decoder); contentLength = in.readMemberContentLength(member, this.componentDecoder);
len = Reader.SIGN_NOLENGTH; len = Reader.SIGN_NOLENGTH;
} }
if (this.decoder == null) { if (this.componentDecoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -80,7 +81,7 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
} }
} }
} }
final Decodeable<Reader, T> localdecoder = this.decoder; final Decodeable<Reader, T> localdecoder = getComponentDecoder(this.componentDecoder, typevals);
final List<T> result = new ArrayList(); final List<T> result = new ArrayList();
boolean first = true; boolean first = true;
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
@@ -88,7 +89,7 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
while (hasNext(in, member, startPosition, contentLength, first)) { while (hasNext(in, member, startPosition, contentLength, first)) {
Reader itemReader = getItemReader(in, member, first); Reader itemReader = getItemReader(in, member, first);
if (itemReader == null) break; if (itemReader == null) break;
result.add(readMemberValue(itemReader, member, first)); result.add(readMemberValue(itemReader, member, localdecoder, first));
first = false; first = false;
} }
} else { } else {
@@ -104,12 +105,16 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
return in.hasNext(startPosition, contentLength); return in.hasNext(startPosition, contentLength);
} }
protected Decodeable<Reader, T> getComponentDecoder(Decodeable<Reader, T> decoder, byte[] typevals) {
return decoder;
}
protected Reader getItemReader(Reader in, DeMember member, boolean first) { protected Reader getItemReader(Reader in, DeMember member, boolean first) {
return in; return in;
} }
protected T readMemberValue(Reader in, DeMember member, boolean first) { protected T readMemberValue(Reader in, DeMember member, Decodeable<Reader, T> decoder, boolean first) {
return this.decoder.convertFrom(in); return decoder.convertFrom(in);
} }
@Override @Override
@@ -121,8 +126,8 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
return componentType; return componentType;
} }
public Decodeable<Reader, T> getDecoder() { public Decodeable<Reader, T> getComponentDecoder() {
return decoder; return componentDecoder;
} }
} }

View File

@@ -23,7 +23,7 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
protected final Type type; protected final Type type;
protected final Encodeable<Writer, Object> encoder; protected final Encodeable<Writer, Object> componentEncoder;
protected boolean inited = false; protected boolean inited = false;
@@ -35,12 +35,12 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
if (type instanceof ParameterizedType) { if (type instanceof ParameterizedType) {
Type t = ((ParameterizedType) type).getActualTypeArguments()[0]; Type t = ((ParameterizedType) type).getActualTypeArguments()[0];
if (t instanceof TypeVariable) { if (t instanceof TypeVariable) {
this.encoder = factory.getAnyEncoder(); this.componentEncoder = factory.getAnyEncoder();
} else { } else {
this.encoder = factory.loadEncoder(t); this.componentEncoder = factory.loadEncoder(t);
} }
} else { } else {
this.encoder = factory.getAnyEncoder(); this.componentEncoder = factory.getAnyEncoder();
} }
} finally { } finally {
inited = true; inited = true;
@@ -62,11 +62,11 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
} }
Object[] array = value.toArray(); Object[] array = value.toArray();
if (array.length == 0) { if (array.length == 0) {
out.writeArrayB(0, encoder, array); out.writeArrayB(0, componentEncoder, array);
out.writeArrayE(); out.writeArrayE();
return; return;
} }
if (this.encoder == null) { if (this.componentEncoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
try { try {
@@ -77,7 +77,7 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
} }
} }
} }
if (out.writeArrayB(array.length, encoder, array) < 0) { if (out.writeArrayB(array.length, componentEncoder, array) < 0) {
boolean first = true; boolean first = true;
for (Object v : array) { for (Object v : array) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
@@ -89,7 +89,7 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
} }
protected void writeMemberValue(Writer out, EnMember member, Object value, boolean first) { protected void writeMemberValue(Writer out, EnMember member, Object value, boolean first) {
encoder.convertTo(out, value); componentEncoder.convertTo(out, value);
} }
@Override @Override
@@ -97,8 +97,11 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
return type; return type;
} }
public Encodeable<Writer, Object> getEncoder() { public Encodeable<Writer, Object> getComponentEncoder() {
return encoder; return componentEncoder;
} }
public Type getComponentType() {
return componentEncoder == null ? null : componentEncoder.getType();
}
} }

View File

@@ -130,12 +130,12 @@ public abstract class Writer {
* 输出一个数组前的操作 * 输出一个数组前的操作
* *
* @param size 数组长度 * @param size 数组长度
* @param encoder Encodeable * @param componentEncoder Encodeable
* @param obj 对象 * @param obj 对象
* *
* @return 返回-1表示还没有写入对象内容大于-1表示已写入对象内容返回对象内容大小 * @return 返回-1表示还没有写入对象内容大于-1表示已写入对象内容返回对象内容大小
*/ */
public abstract int writeArrayB(int size, Encodeable<Writer, Object> encoder, Object obj); public abstract int writeArrayB(int size, Encodeable<Writer, Object> componentEncoder, Object obj);
/** /**
* 输出数组元素间的间隔符 * 输出数组元素间的间隔符

View File

@@ -48,15 +48,25 @@ public class BsonByteBufferReader extends BsonReader {
return mask == null ? currentBuffer.get(currentBuffer.position()) : mask.unmask(currentBuffer.get(currentBuffer.position())); return mask == null ? currentBuffer.get(currentBuffer.position()) : mask.unmask(currentBuffer.get(currentBuffer.position()));
} }
@Override
public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) {
short bt = readShort();
if (bt == Reader.SIGN_NULL) return bt;
short lt = readShort();
return (bt & 0xffff) << 16 | (lt & 0xffff);
}
/** /**
* 判断下一个非空白字节是否为[ * 判断下一个非空白字节是否为[
* *
* @param member DeMember * @param member DeMember
* @param decoder Decodeable * @param typevals byte[]
* @param componentDecoder Decodeable
*
* @return 数组长度或 SIGN_NULL * @return 数组长度或 SIGN_NULL
*/ */
@Override @Override
public final int readArrayB(DeMember member, Decodeable decoder) { public final int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) {
short bt = readShort(); short bt = readShort();
if (bt == Reader.SIGN_NULL) return bt; if (bt == Reader.SIGN_NULL) return bt;
short lt = readShort(); short lt = readShort();

View File

@@ -231,8 +231,10 @@ public class BsonReader extends Reader {
} }
@Override @Override
public final int readMapB(DeMember member, Decodeable keydecoder) { public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) {
return readArrayB(member, keydecoder); short bt = readShort();
if (bt == Reader.SIGN_NULL) return bt;
return (bt & 0xffff) << 16 | ((content[++this.position] & 0xff) << 8) | (content[++this.position] & 0xff);
} }
@Override @Override
@@ -245,10 +247,12 @@ public class BsonReader extends Reader {
* @return 数组长度或SIGN_NULL * @return 数组长度或SIGN_NULL
*/ */
@Override @Override
public int readArrayB(DeMember member, Decodeable decoder) { public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { //componentDecoder可能为null
short bt = readShort(); short bt = readShort();
if (bt == Reader.SIGN_NULL) return bt; if (bt == Reader.SIGN_NULL) return bt;
return (bt & 0xffff) << 16 | ((content[++this.position] & 0xff) << 8) | (content[++this.position] & 0xff); int rs = (bt & 0xffff) << 16 | ((content[++this.position] & 0xff) << 8) | (content[++this.position] & 0xff);
if (componentDecoder == null || componentDecoder == ByteSimpledCoder.instance) return rs; //byte[]
return rs;
} }
@Override @Override
@@ -323,7 +327,7 @@ public class BsonReader extends Reader {
@Override @Override
public final byte[] readByteArray() { public final byte[] readByteArray() {
int len = readArrayB(null, null); int len = readArrayB(null, null, null);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -241,7 +241,7 @@ public class BsonWriter extends Writer {
typeval = 109; typeval = 109;
} }
if (typeval == 127 && member.getEncoder() instanceof CollectionEncoder) { if (typeval == 127 && member.getEncoder() instanceof CollectionEncoder) {
java.lang.reflect.Type comType = ((CollectionEncoder) member.getEncoder()).getEncoder().getType(); java.lang.reflect.Type comType = ((CollectionEncoder) member.getEncoder()).getComponentEncoder().getType();
if (comType == Boolean.class) { if (comType == Boolean.class) {
typeval = 21; typeval = 21;
} else if (comType == Byte.class) { } else if (comType == Byte.class) {
@@ -268,8 +268,8 @@ public class BsonWriter extends Writer {
typeval = 20; typeval = 20;
} }
if (typeval == 127 && member.getEncoder() instanceof MapEncoder) { if (typeval == 127 && member.getEncoder() instanceof MapEncoder) {
java.lang.reflect.Type keyType = ((MapEncoder) member.getEncoder()).getKeyencoder().getType(); java.lang.reflect.Type keyType = ((MapEncoder) member.getEncoder()).getKeyEncoder().getType();
java.lang.reflect.Type valType = ((MapEncoder) member.getEncoder()).getValencoder().getType(); java.lang.reflect.Type valType = ((MapEncoder) member.getEncoder()).getValueEncoder().getType();
if (keyType == String.class && valType == Boolean.class) { if (keyType == String.class && valType == Boolean.class) {
typeval = 41; typeval = 41;
} else if (keyType == String.class && valType == Byte.class) { } else if (keyType == String.class && valType == Byte.class) {
@@ -337,7 +337,7 @@ public class BsonWriter extends Writer {
} }
@Override @Override
public final int writeArrayB(int size, Encodeable<Writer, Object> encoder, Object obj) { public final int writeArrayB(int size, Encodeable<Writer, Object> componentEncoder, Object obj) {
writeInt(size); writeInt(size);
return -1; return -1;
} }
@@ -352,7 +352,7 @@ public class BsonWriter extends Writer {
@Override @Override
public int writeMapB(int size, Encodeable<Writer, Object> keyEncoder, Encodeable<Writer, Object> valueEncoder, Object obj) { public int writeMapB(int size, Encodeable<Writer, Object> keyEncoder, Encodeable<Writer, Object> valueEncoder, Object obj) {
writeArrayB(size, valueEncoder, obj); writeInt(size);
return -1; return -1;
} }

View File

@@ -42,7 +42,7 @@ public final class BoolArraySimpledCoder<R extends Reader, W extends Writer> ext
@Override @Override
public boolean[] convertFrom(R in) { public boolean[] convertFrom(R in) {
int len = in.readArrayB(null, BoolSimpledCoder.instance); int len = in.readArrayB(null, null, BoolSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -43,7 +43,7 @@ public final class ByteBufferSimpledCoder<R extends Reader, W extends Writer> ex
@Override @Override
public ByteBuffer convertFrom(R in) { public ByteBuffer convertFrom(R in) {
int len = in.readArrayB(null, ByteSimpledCoder.instance); int len = in.readArrayB(null, null, ByteSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -42,7 +42,7 @@ public final class CharArraySimpledCoder<R extends Reader, W extends Writer> ext
@Override @Override
public char[] convertFrom(R in) { public char[] convertFrom(R in) {
int len = in.readArrayB(null, CharSimpledCoder.instance); int len = in.readArrayB(null, null, CharSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -43,7 +43,7 @@ public final class DoubleArraySimpledCoder<R extends Reader, W extends Writer> e
@Override @Override
public double[] convertFrom(R in) { public double[] convertFrom(R in) {
int len = in.readArrayB(null, DoubleSimpledCoder.instance); int len = in.readArrayB(null, null, DoubleSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -42,7 +42,7 @@ public final class FloatArraySimpledCoder<R extends Reader, W extends Writer> ex
@Override @Override
public float[] convertFrom(R in) { public float[] convertFrom(R in) {
int len = in.readArrayB(null, FloatSimpledCoder.instance); int len = in.readArrayB(null, null, FloatSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -43,7 +43,7 @@ public final class IntArraySimpledCoder<R extends Reader, W extends Writer> exte
@Override @Override
public int[] convertFrom(R in) { public int[] convertFrom(R in) {
int len = in.readArrayB(null, IntSimpledCoder.instance); int len = in.readArrayB(null, null, IntSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -43,7 +43,7 @@ public final class LongArraySimpledCoder<R extends Reader, W extends Writer> ext
@Override @Override
public long[] convertFrom(R in) { public long[] convertFrom(R in) {
int len = in.readArrayB(null, LongSimpledCoder.instance); int len = in.readArrayB(null, null, LongSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -42,7 +42,7 @@ public final class ShortArraySimpledCoder<R extends Reader, W extends Writer> ex
@Override @Override
public short[] convertFrom(R in) { public short[] convertFrom(R in) {
int len = in.readArrayB(null, ShortSimpledCoder.instance); int len = in.readArrayB(null, null, ShortSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -44,7 +44,7 @@ public final class StringArraySimpledCoder<R extends Reader, W extends Writer> e
} }
public String[] convertFrom(R in, DeMember member) { public String[] convertFrom(R in, DeMember member) {
int len = in.readArrayB(member, StringSimpledCoder.instance); int len = in.readArrayB(member, null, StringSimpledCoder.instance);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -140,12 +140,13 @@ public class JsonByteBufferReader extends JsonReader {
* 判断下一个非空白字符是否为[ * 判断下一个非空白字符是否为[
* *
* @param member DeMember * @param member DeMember
* @param typevals byte[]
* @param decoder Decodeable * @param decoder Decodeable
* *
* @return SIGN_NOLENGTH 或 SIGN_NULL * @return SIGN_NOLENGTH 或 SIGN_NULL
*/ */
@Override @Override
public final int readArrayB(DeMember member, Decodeable decoder) { public final int readArrayB(DeMember member, byte[] typevals, Decodeable decoder) {
char ch = nextGoodChar(); char ch = nextGoodChar();
if (ch == '[' || ch == '{') return SIGN_NOLENGTH; if (ch == '[' || ch == '{') return SIGN_NOLENGTH;
if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') return SIGN_NULL; if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') return SIGN_NULL;

View File

@@ -190,13 +190,15 @@ public class JsonReader extends Reader {
* 判断下一个非空白字符是否为{ * 判断下一个非空白字符是否为{
* *
* @param member DeMember * @param member DeMember
* @param keydecoder Decodeable * @param typevals byte[]
* @param keyDecoder Decodeable
* @param valuedecoder Decodeable
* *
* @return SIGN_NOLENGTH 或 SIGN_NULL * @return SIGN_NOLENGTH 或 SIGN_NULL
*/ */
@Override @Override
public final int readMapB(DeMember member, Decodeable keydecoder) { public final int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valuedecoder) {
return readArrayB(member, keydecoder); return readArrayB(member, typevals, keyDecoder);
} }
@Override @Override
@@ -207,12 +209,13 @@ public class JsonReader extends Reader {
* 判断下一个非空白字符是否为[ * 判断下一个非空白字符是否为[
* *
* @param member DeMember * @param member DeMember
* @param decoder Decodeable * @param typevals byte[]
* @param componentDecoder Decodeable
* *
* @return SIGN_NOLENGTH 或 SIGN_NULL * @return SIGN_NOLENGTH 或 SIGN_NULL
*/ */
@Override @Override
public int readArrayB(DeMember member, Decodeable decoder) { public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) {
char ch = this.text[++this.position]; char ch = this.text[++this.position];
if (ch == '[') return SIGN_NOLENGTH; if (ch == '[') return SIGN_NOLENGTH;
if (ch == '{') return SIGN_NOLENGTH; if (ch == '{') return SIGN_NOLENGTH;
@@ -474,7 +477,7 @@ public class JsonReader extends Reader {
@Override @Override
public final byte[] readByteArray() { public final byte[] readByteArray() {
int len = readArrayB(null, null); int len = readArrayB(null, null, null);
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) { if (len == Reader.SIGN_NOLENBUTBYTES) {

View File

@@ -346,7 +346,7 @@ public class JsonWriter extends Writer {
} }
@Override @Override
public final int writeArrayB(int size, Encodeable<Writer, Object> encoder, Object obj) { public final int writeArrayB(int size, Encodeable<Writer, Object> componentEncoder, Object obj) {
writeTo('['); writeTo('[');
return -1; return -1;
} }

View File

@@ -21,13 +21,14 @@ import org.redkale.util.*;
*/ */
public class BsonTestMain { public class BsonTestMain {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Throwable {
Serializable[] sers = new Serializable[]{"aaa", 4}; Serializable[] sers = new Serializable[]{"aaa", 4};
final BsonConvert convert = BsonFactory.root().getConvert(); final BsonConvert convert = BsonFactory.root().getConvert();
byte[] bytes = convert.convertTo(sers); byte[] bytes = convert.convertTo(sers);
Utility.println("---", bytes); Utility.println("---", bytes);
Serializable[] a = convert.convertFrom(Serializable[].class, bytes); Serializable[] a = convert.convertFrom(Serializable[].class, bytes);
System.out.println(Arrays.toString(a)); System.out.println(Arrays.toString(a));
Two.main(args);
main2(args); main2(args);
main3(args); main3(args);
main4(args); main4(args);

View File

@@ -0,0 +1,63 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.test.convert;
import org.redkale.convert.json.JsonConvert;
/**
*
* @author zhangjx
*/
public class One {
protected String key;
protected int code;
protected byte[] bytes = new byte[]{3, 4, 5};
protected int[] ints = new int[]{3000, 4000, 5000};
public One(int code) {
this.code = code;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public byte[] getBytes() {
return bytes;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
public int[] getInts() {
return ints;
}
public void setInts(int[] ints) {
this.ints = ints;
}
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,96 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.test.convert;
import java.util.*;
import org.redkale.convert.bson.BsonFactory;
/**
*
* @author zhangjx
*/
public class Two extends One {
public Two() {
super(90100119);
}
protected List<String> list;
protected Map<String, String> stringMap;
protected List<ConvertRecord> records;
protected Map<String, ConvertRecord> recordMap;
public Map<String, String> getStringMap() {
return stringMap;
}
public void setStringMap(Map<String, String> stringMap) {
this.stringMap = stringMap;
}
String ip;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public List<ConvertRecord> getRecords() {
return records;
}
public void setRecords(List<ConvertRecord> records) {
this.records = records;
}
public Map<String, ConvertRecord> getRecordMap() {
return recordMap;
}
public void setRecordMap(Map<String, ConvertRecord> recordMap) {
this.recordMap = recordMap;
}
public static void main(String[] args) throws Throwable {
Two two = new Two();
two.setKey("key111");
two.setCode(12345);
List<String> list = new ArrayList<>();
list.add("haha");
two.setList(list);
Map<String, String> map = new HashMap<>();
map.put("222", "333");
two.setStringMap(map);
List<ConvertRecord> records = new ArrayList<>();
records.add(ConvertRecord.createDefault());
two.setRecords(records);
Map<String, ConvertRecord> rmap = new HashMap<>();
rmap.put("222", ConvertRecord.createDefault());
two.setRecordMap(rmap);
byte[] bs = BsonFactory.root().getConvert().convertTo(two);
One one =BsonFactory.root().getConvert().convertFrom(One.class, bs);
System.out.println(one);
}
}