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

View File

@@ -27,7 +27,7 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
protected final Encodeable anyEncoder;
protected final Encodeable<Writer, Object> encoder;
protected final Encodeable<Writer, Object> componentEncoder;
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");
}
factory.register(type, this);
this.encoder = factory.loadEncoder(this.componentType);
this.componentEncoder = factory.loadEncoder(this.componentType);
this.anyEncoder = factory.getAnyEncoder();
} finally {
inited = true;
@@ -66,11 +66,11 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
return;
}
if (value.length == 0) {
out.writeArrayB(0, encoder, value);
out.writeArrayB(0, componentEncoder, value);
out.writeArrayE();
return;
}
if (this.encoder == null) {
if (this.componentEncoder == null) {
if (!this.inited) {
synchronized (lock) {
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;
boolean first = true;
for (Object v : value) {
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;
}
}
@@ -99,7 +99,7 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
@Override
public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.encoder + "}";
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.componentEncoder + "}";
}
@Override
@@ -111,8 +111,8 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
return componentType;
}
public Encodeable<Writer, Object> getEncoder() {
return encoder;
public Encodeable<Writer, Object> getComponentEncoder() {
return componentEncoder;
}
}

View File

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

View File

@@ -23,7 +23,7 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
protected final Type type;
protected final Encodeable<Writer, Object> encoder;
protected final Encodeable<Writer, Object> componentEncoder;
protected boolean inited = false;
@@ -35,12 +35,12 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
if (type instanceof ParameterizedType) {
Type t = ((ParameterizedType) type).getActualTypeArguments()[0];
if (t instanceof TypeVariable) {
this.encoder = factory.getAnyEncoder();
this.componentEncoder = factory.getAnyEncoder();
} else {
this.encoder = factory.loadEncoder(t);
this.componentEncoder = factory.loadEncoder(t);
}
} else {
this.encoder = factory.getAnyEncoder();
this.componentEncoder = factory.getAnyEncoder();
}
} finally {
inited = true;
@@ -61,11 +61,11 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
return;
}
if (value.isEmpty()) {
out.writeArrayB(0, encoder, value);
out.writeArrayB(0, componentEncoder, value);
out.writeArrayE();
return;
}
if (this.encoder == null) {
if (this.componentEncoder == null) {
if (!this.inited) {
synchronized (lock) {
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;
for (Object v : value) {
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) {
encoder.convertTo(out, value);
componentEncoder.convertTo(out, value);
}
@Override
@@ -96,8 +96,11 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
return type;
}
public Encodeable<Writer, Object> getEncoder() {
return encoder;
public Encodeable<Writer, Object> getComponentEncoder() {
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;
if (len == Reader.SIGN_NULL) return null;
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();
boolean first = true;
Decodeable<Reader, K> kdecoder = getKeyDecoder(this.keyDecoder, typevals);
Decodeable<Reader, V> vdecoder = getValueDecoder(this.valueDecoder, typevals);
if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position();
while (hasNext(in, member, startPosition, contentLength, first)) {
Reader entryReader = getEntryReader(in, member, first);
if (entryReader == null) break;
K key = readKeyMember(entryReader, member, first);
K key = readKeyMember(entryReader, member, kdecoder, first);
entryReader.readBlank();
V value = readValueMember(entryReader, member, first);
V value = readValueMember(entryReader, member, vdecoder, first);
result.put(key, value);
first = false;
}
} else {
for (int i = 0; i < len; i++) {
K key = readKeyMember(in, member, first);
K key = readKeyMember(in, member, kdecoder, first);
in.readBlank();
V value = readValueMember(in, member, first);
V value = readValueMember(in, member, vdecoder, first);
result.put(key, value);
first = false;
}
@@ -128,16 +131,24 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
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) {
return in;
}
protected K readKeyMember(Reader in, DeMember member, boolean first) {
return keyDecoder.convertFrom(in);
protected K readKeyMember(Reader in, DeMember member, Decodeable<Reader, K> decoder, boolean first) {
return decoder.convertFrom(in);
}
protected V readValueMember(Reader in, DeMember member, boolean first) {
return valueDecoder.convertFrom(in);
protected V readValueMember(Reader in, DeMember member, Decodeable<Reader, V> decoder, boolean first) {
return decoder.convertFrom(in);
}
@Override

View File

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

View File

@@ -95,12 +95,13 @@ public abstract class Reader {
/**
* 读取数组的开头并返回数组的长度
*
* @param member DeMember
* @param decoder Decodeable
* @param member DeMember
* @param typevals byte[]
* @param componentDecoder Decodeable
*
* @return 返回数组的长度
*/
public abstract int readArrayB(DeMember member, Decodeable decoder);
public abstract int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder);
/**
* 读取数组的尾端
@@ -111,12 +112,14 @@ public abstract class Reader {
/**
* 读取map的开头并返回map的size
*
* @param member DeMember
* @param keydecoder Decodeable
* @param member DeMember
* @param typevals byte[]
* @param keyDecoder Decodeable
* @param valueDecoder Decodeable
*
* @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 final Decodeable<Reader, T> decoder;
protected final Decodeable<Reader, T> componentDecoder;
protected boolean inited = false;
@@ -44,7 +44,7 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
this.componentType = pt.getActualTypeArguments()[0];
this.creator = factory.loadCreator((Class) pt.getRawType());
factory.register(type, this);
this.decoder = factory.loadDecoder(this.componentType);
this.componentDecoder = factory.loadDecoder(this.componentType);
} else {
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) {
int len = in.readArrayB(member, this.decoder);
byte[] typevals = new byte[1];
int len = in.readArrayB(member, typevals, this.componentDecoder);
int contentLength = -1;
if (len == Reader.SIGN_NULL) return null;
if (len == Reader.SIGN_NOLENBUTBYTES) {
contentLength = in.readMemberContentLength(member, this.decoder);
contentLength = in.readMemberContentLength(member, this.componentDecoder);
len = Reader.SIGN_NOLENGTH;
}
if (this.decoder == null) {
if (this.componentDecoder == null) {
if (!this.inited) {
synchronized (lock) {
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();
boolean first = true;
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)) {
Reader itemReader = getItemReader(in, member, first);
if (itemReader == null) break;
result.add(readMemberValue(itemReader, member, first));
result.add(readMemberValue(itemReader, member, localdecoder, first));
first = false;
}
} else {
@@ -104,12 +105,16 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
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) {
return in;
}
protected T readMemberValue(Reader in, DeMember member, boolean first) {
return this.decoder.convertFrom(in);
protected T readMemberValue(Reader in, DeMember member, Decodeable<Reader, T> decoder, boolean first) {
return decoder.convertFrom(in);
}
@Override
@@ -121,8 +126,8 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
return componentType;
}
public Decodeable<Reader, T> getDecoder() {
return decoder;
public Decodeable<Reader, T> getComponentDecoder() {
return componentDecoder;
}
}

View File

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

View File

@@ -130,12 +130,12 @@ public abstract class Writer {
* 输出一个数组前的操作
*
* @param size 数组长度
* @param encoder Encodeable
* @param componentEncoder Encodeable
* @param obj 对象
*
* @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()));
}
@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 decoder Decodeable
* @param member DeMember
* @param typevals byte[]
* @param componentDecoder Decodeable
*
* @return 数组长度或 SIGN_NULL
*/
@Override
public final int readArrayB(DeMember member, Decodeable decoder) {
public final int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) {
short bt = readShort();
if (bt == Reader.SIGN_NULL) return bt;
short lt = readShort();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -346,7 +346,7 @@ public class JsonWriter extends Writer {
}
@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('[');
return -1;
}

View File

@@ -21,13 +21,14 @@ import org.redkale.util.*;
*/
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};
final BsonConvert convert = BsonFactory.root().getConvert();
byte[] bytes = convert.convertTo(sers);
Utility.println("---", bytes);
Serializable[] a = convert.convertFrom(Serializable[].class, bytes);
System.out.println(Arrays.toString(a));
Two.main(args);
main2(args);
main3(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);
}
}