From 84177f43f4f02e8b8d57b6bd1e56866e66c90ded Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 27 Sep 2024 18:07:16 +0800 Subject: [PATCH] =?UTF-8?q?convert=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/convert/ArrayDecoder.java | 47 +++---------- .../redkale/convert/CollectionDecoder.java | 50 +++----------- .../java/org/redkale/convert/MapDecoder.java | 66 ++++--------------- .../org/redkale/convert/ObjectEncoder.java | 17 +++-- src/main/java/org/redkale/convert/Reader.java | 47 +++++-------- .../org/redkale/convert/StreamDecoder.java | 43 ++---------- .../convert/bson/BsonArrayDecoder.java | 46 +++++++++++++ .../convert/bson/BsonByteBufferReader.java | 2 +- .../convert/bson/BsonCollectionDecoder.java | 44 +++++++++++++ .../org/redkale/convert/bson/BsonFactory.java | 28 ++++++-- .../redkale/convert/bson/BsonMapDecoder.java | 48 ++++++++++++++ .../org/redkale/convert/bson/BsonReader.java | 41 +++++------- .../convert/bson/BsonStreamDecoder.java | 45 +++++++++++++ .../convert/bson/SkipArrayDecoder.java | 34 ---------- .../convert/bson/SkipCollectionDecoder.java | 33 ---------- .../redkale/convert/bson/SkipMapDecoder.java | 41 ------------ .../convert/bson/SkipStreamDecoder.java | 33 ---------- .../convert/ext/BoolArraySimpledCoder.java | 12 +--- .../convert/ext/ByteBufferSimpledCoder.java | 12 +--- .../convert/ext/CharArraySimpledCoder.java | 12 +--- .../convert/ext/DoubleArraySimpledCoder.java | 12 +--- .../convert/ext/FloatArraySimpledCoder.java | 12 +--- .../convert/ext/IntArraySimpledCoder.java | 12 +--- .../convert/ext/LongArraySimpledCoder.java | 12 +--- .../convert/ext/ShortArraySimpledCoder.java | 12 +--- .../convert/ext/StringArraySimpledCoder.java | 12 +--- .../convert/json/JsonByteBufferReader.java | 9 ++- .../convert/json/JsonMultiArrayDecoder.java | 7 +- .../org/redkale/convert/json/JsonReader.java | 42 ++++-------- .../convert/pb/ProtobufArrayDecoder.java | 22 +++++++ .../convert/pb/ProtobufCollectionDecoder.java | 21 ++++++ .../convert/pb/ProtobufMapDecoder.java | 38 +++++++---- .../convert/pb/ProtobufMapEncoder.java | 2 + .../redkale/convert/pb/ProtobufReader.java | 25 ++----- .../convert/pb/ProtobufStreamDecoder.java | 22 +++++++ .../redkale/convert/pb/ProtobufWriter.java | 3 +- 36 files changed, 432 insertions(+), 532 deletions(-) create mode 100644 src/main/java/org/redkale/convert/bson/BsonArrayDecoder.java create mode 100644 src/main/java/org/redkale/convert/bson/BsonCollectionDecoder.java create mode 100644 src/main/java/org/redkale/convert/bson/BsonMapDecoder.java create mode 100644 src/main/java/org/redkale/convert/bson/BsonStreamDecoder.java delete mode 100644 src/main/java/org/redkale/convert/bson/SkipArrayDecoder.java delete mode 100644 src/main/java/org/redkale/convert/bson/SkipCollectionDecoder.java delete mode 100644 src/main/java/org/redkale/convert/bson/SkipMapDecoder.java delete mode 100644 src/main/java/org/redkale/convert/bson/SkipStreamDecoder.java diff --git a/src/main/java/org/redkale/convert/ArrayDecoder.java b/src/main/java/org/redkale/convert/ArrayDecoder.java index 33289d553..645897f51 100644 --- a/src/main/java/org/redkale/convert/ArrayDecoder.java +++ b/src/main/java/org/redkale/convert/ArrayDecoder.java @@ -91,34 +91,22 @@ public class ArrayDecoder implements TagDecodeable return convertFrom(in, null); } + @Override public T[] convertFrom(R in, DeMember member) { this.checkInited(); - byte[] typevals = new byte[1]; - int len = in.readArrayB(member, typevals, componentDecoder); - int contentLength = -1; + final Decodeable itemDecoder = this.componentDecoder; + int len = in.readArrayB(member, itemDecoder); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, componentDecoder); - len = Reader.SIGN_NOLENGTH; - } - final Decodeable localDecoder = getComponentDecoder(this.componentDecoder, typevals); final List result = new ArrayList(); - boolean first = true; - if (len == Reader.SIGN_NOLENGTH) { - int startPosition = in.position(); - while (hasNext(in, member, startPosition, contentLength, first)) { - R itemReader = getItemReader(in, member, first); - if (itemReader == null) { // 元素读取完毕 - break; - } - result.add(readMemberValue(itemReader, member, localDecoder, first)); - first = false; + if (len == Reader.SIGN_VARIABLE) { + while (in.hasNext()) { + result.add(itemDecoder.convertFrom(in)); } - } else { + } else { // 固定长度 for (int i = 0; i < len; i++) { - result.add(localDecoder.convertFrom(in)); + result.add(itemDecoder.convertFrom(in)); } } in.readArrayE(); @@ -126,25 +114,6 @@ public class ArrayDecoder implements TagDecodeable return result.toArray(rs); } - protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) { - return in.hasNext(startPosition, contentLength); - } - - protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { - return decoder; - } - - protected R getItemReader(R in, DeMember member, boolean first) { - return in; - } - - protected T readMemberValue(R in, DeMember member, Decodeable decoder, boolean first) { - if (in == null) { - return null; - } - return decoder.convertFrom(in); - } - @Override public String toString() { return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" diff --git a/src/main/java/org/redkale/convert/CollectionDecoder.java b/src/main/java/org/redkale/convert/CollectionDecoder.java index d55deaccf..59333a0c4 100644 --- a/src/main/java/org/redkale/convert/CollectionDecoder.java +++ b/src/main/java/org/redkale/convert/CollectionDecoder.java @@ -98,57 +98,25 @@ public class CollectionDecoder implements TagDecodeable convertFrom(R in, DeMember member) { this.checkInited(); - byte[] typevals = new byte[1]; - int len = in.readArrayB(member, typevals, componentDecoder); - int contentLength = -1; - if (len == Reader.SIGN_NULL) { + final Decodeable itemDecoder = this.componentDecoder; + int size = in.readArrayB(member, itemDecoder); + if (size == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, componentDecoder); - len = Reader.SIGN_NOLENGTH; - } - final Decodeable localDecoder = getComponentDecoder(this.componentDecoder, typevals); final Collection result = this.creator.create(); - boolean first = true; - if (len == Reader.SIGN_NOLENGTH) { - int startPosition = in.position(); - while (hasNext(in, member, startPosition, contentLength, first)) { - R itemReader = getItemReader(in, member, first); - if (itemReader == null) { // 元素读取完毕 - break; - } - result.add(readMemberValue(itemReader, member, localDecoder, first)); - first = false; + if (size == Reader.SIGN_VARIABLE) { + while (in.hasNext()) { + result.add(itemDecoder.convertFrom(in)); } - } else { - for (int i = 0; i < len; i++) { - result.add(localDecoder.convertFrom(in)); + } else { // 固定长度 + for (int i = 0; i < size; i++) { + result.add(itemDecoder.convertFrom(in)); } } in.readArrayE(); return result; } - protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) { - return in.hasNext(startPosition, contentLength); - } - - protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { - return decoder; - } - - protected R getItemReader(R in, DeMember member, boolean first) { - return in; - } - - protected T readMemberValue(R in, DeMember member, Decodeable decoder, boolean first) { - if (in == null) { - return null; - } - return decoder.convertFrom(in); - } - @Override public Type getType() { return type; diff --git a/src/main/java/org/redkale/convert/MapDecoder.java b/src/main/java/org/redkale/convert/MapDecoder.java index 63239c0e4..97f8b5f52 100644 --- a/src/main/java/org/redkale/convert/MapDecoder.java +++ b/src/main/java/org/redkale/convert/MapDecoder.java @@ -121,70 +121,32 @@ public class MapDecoder implements TagDecodeable convertFrom(R in, DeMember member) { this.checkInited(); - byte[] typevals = new byte[2]; - int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder); - int contentLength = -1; + Decodeable kdecoder = this.keyDecoder; + Decodeable vdecoder = this.valueDecoder; + int len = in.readMapB(member, kdecoder, vdecoder); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, null); - len = Reader.SIGN_NOLENGTH; - } final Map result = this.creator.create(); - boolean first = true; - Decodeable kdecoder = getKeyDecoder(this.keyDecoder, typevals); - Decodeable vdecoder = getValueDecoder(this.valueDecoder, typevals); - if (len == Reader.SIGN_NOLENGTH) { - int startPosition = in.position(); - while (hasNext(in, member, startPosition, contentLength, first)) { - R entryReader = getEntryReader(in, member, first); - if (entryReader == null) { - break; - } - K key = readKeyMember(entryReader, member, kdecoder, first); - entryReader.readBlank(); - 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, kdecoder, first); + if (len == Reader.SIGN_VARIABLE) { + while (in.hasNext()) { + K key = kdecoder.convertFrom(in); in.readBlank(); - V value = readValueMember(in, member, vdecoder, first); + V value = vdecoder.convertFrom(in); + result.put(key, value); + } + } else { // 固定长度 + for (int i = 0; i < len; i++) { + K key = kdecoder.convertFrom(in); + in.readBlank(); + V value = vdecoder.convertFrom(in); result.put(key, value); - first = false; } } in.readMapE(); return result; } - protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) { - return in.hasNext(startPosition, contentLength); - } - - protected Decodeable getKeyDecoder(Decodeable decoder, byte[] typevals) { - return decoder; - } - - protected Decodeable getValueDecoder(Decodeable decoder, byte[] typevals) { - return decoder; - } - - protected R getEntryReader(R in, DeMember member, boolean first) { - return in; - } - - protected K readKeyMember(R in, DeMember member, Decodeable decoder, boolean first) { - return decoder.convertFrom(in); - } - - protected V readValueMember(R in, DeMember member, Decodeable decoder, boolean first) { - return decoder.convertFrom(in); - } - @Override public Type getType() { return this.type; diff --git a/src/main/java/org/redkale/convert/ObjectEncoder.java b/src/main/java/org/redkale/convert/ObjectEncoder.java index bf653c481..354dceb32 100644 --- a/src/main/java/org/redkale/convert/ObjectEncoder.java +++ b/src/main/java/org/redkale/convert/ObjectEncoder.java @@ -349,16 +349,15 @@ public class ObjectEncoder implements Encodeable { if (extFields != null) { Encodeable anyEncoder = factory.getAnyEncoder(); for (ConvertField en : extFields) { - if (en == null) { - continue; + if (en != null) { + maxPosition++; + objout.writeObjectField( + en.getName(), + en.getType(), + Math.max(en.getPosition(), maxPosition), + anyEncoder, + en.getValue()); } - maxPosition++; - objout.writeObjectField( - en.getName(), - en.getType(), - Math.max(en.getPosition(), maxPosition), - anyEncoder, - en.getValue()); } } } diff --git a/src/main/java/org/redkale/convert/Reader.java b/src/main/java/org/redkale/convert/Reader.java index 88ce8925e..3adc21839 100644 --- a/src/main/java/org/redkale/convert/Reader.java +++ b/src/main/java/org/redkale/convert/Reader.java @@ -20,12 +20,19 @@ public abstract class Reader { MAP; } + /** + * 集合对象为null + * + * @see #readArrayB(org.redkale.convert.DeMember, org.redkale.convert.Decodeable) + */ public static final short SIGN_NULL = -1; - public static final short SIGN_NOLENGTH = -2; - - // 目前只适合于protobuf的boolean[]...double[]类型 - public static final short SIGN_NOLENBUTBYTES = -3; + /** + * 不确定的长度, 比如解析json数组 + * + * @see #readArrayB(org.redkale.convert.DeMember, org.redkale.convert.Decodeable) + */ + public static final short SIGN_VARIABLE = -2; /** * 设置Reader的内容,通常结合对象池使用 @@ -34,24 +41,12 @@ public abstract class Reader { */ public abstract void prepare(byte[] content); - /** - * 是否还存在下个元素或字段
- * 注意: 主要用于Array、Collection、Stream或Map等集合对象 - * - * @param startPosition 起始位置 - * @param contentLength 内容大小, 不确定的传-1 - * @return 是否还存在下个元素或字段 - */ - public abstract boolean hasNext(int startPosition, int contentLength); - /** * 是否还存在下个元素或字段 * * @return 是否还存在下个元素或字段 */ - public boolean hasNext() { - return hasNext(-1, -1); - } + public abstract boolean hasNext(); /** * 获取当前位置 @@ -60,16 +55,6 @@ public abstract class Reader { */ public abstract int position(); - /** - * 读取字段值内容的字节数
- * 只有在readXXXB方法返回SIGN_NOLENBUTBYTES值才会调用此方法 - * - * @param member DeMember - * @param decoder Decodeable - * @return 内容大小, 不确定返回-1 - */ - public abstract int readMemberContentLength(DeMember member, Decodeable decoder); - /** 跳过值(不包含值前面的字段) */ public abstract void skipValue(); @@ -103,12 +88,13 @@ public abstract class Reader { /** * 读取数组的开头并返回数组的长度 * + * @see #SIGN_NULL + * @see #SIGN_VARIABLE * @param member DeMember - * @param typevals byte[] * @param componentDecoder Decodeable * @return 返回数组的长度 */ - public abstract int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder); + public abstract int readArrayB(DeMember member, Decodeable componentDecoder); /** 读取数组的尾端 */ public abstract void readArrayE(); @@ -117,12 +103,11 @@ public abstract class Reader { * 读取map的开头并返回map的size * * @param member DeMember - * @param typevals byte[] * @param keyDecoder Decodeable * @param valueDecoder Decodeable * @return 返回map的size */ - public abstract int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder); + public abstract int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valueDecoder); /** 读取数组的尾端 */ public abstract void readMapE(); diff --git a/src/main/java/org/redkale/convert/StreamDecoder.java b/src/main/java/org/redkale/convert/StreamDecoder.java index fcdda4f0d..9c4069d75 100644 --- a/src/main/java/org/redkale/convert/StreamDecoder.java +++ b/src/main/java/org/redkale/convert/StreamDecoder.java @@ -79,54 +79,25 @@ public class StreamDecoder implements TagDecodeable convertFrom(R in, DeMember member) { this.checkInited(); - byte[] typevals = new byte[1]; - int len = in.readArrayB(member, typevals, this.componentDecoder); - int contentLength = -1; + final Decodeable itemDecoder = this.componentDecoder; + int len = in.readArrayB(member, itemDecoder); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, this.componentDecoder); - len = Reader.SIGN_NOLENGTH; - } - final Decodeable localDecoder = getComponentDecoder(this.componentDecoder, typevals); final List result = new ArrayList(); - boolean first = true; - if (len == Reader.SIGN_NOLENGTH) { - int startPosition = in.position(); - while (hasNext(in, member, startPosition, contentLength, first)) { - R itemReader = getItemReader(in, member, first); - if (itemReader == null) { // 元素读取完毕 - break; - } - result.add(readMemberValue(itemReader, member, localDecoder, first)); - first = false; + if (len == Reader.SIGN_VARIABLE) { + while (in.hasNext()) { + result.add(itemDecoder.convertFrom(in)); } - } else { + } else { // 固定长度 for (int i = 0; i < len; i++) { - result.add(localDecoder.convertFrom(in)); + result.add(itemDecoder.convertFrom(in)); } } in.readArrayE(); return result.stream(); } - protected boolean hasNext(R in, DeMember member, int startPosition, int contentLength, boolean first) { - return in.hasNext(startPosition, contentLength); - } - - protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { - return decoder; - } - - protected R getItemReader(R in, DeMember member, boolean first) { - return in; - } - - protected T readMemberValue(R in, DeMember member, Decodeable decoder, boolean first) { - return decoder.convertFrom(in); - } - @Override public Type getType() { return type; diff --git a/src/main/java/org/redkale/convert/bson/BsonArrayDecoder.java b/src/main/java/org/redkale/convert/bson/BsonArrayDecoder.java new file mode 100644 index 000000000..ab7756d5c --- /dev/null +++ b/src/main/java/org/redkale/convert/bson/BsonArrayDecoder.java @@ -0,0 +1,46 @@ +/* + * 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.convert.bson; + +import java.lang.reflect.Type; +import java.util.*; +import org.redkale.convert.*; + +/** + * 数组的反序列化操作类
+ * 对象数组的反序列化,不包含int[]、long[]这样的primitive class数组。
+ * 支持一定程度的泛型。
+ * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param 反解析的数组元素类型 + */ +public class BsonArrayDecoder extends ArrayDecoder { + + public BsonArrayDecoder(final BsonFactory factory, final Type type) { + super(factory, type); + } + + @Override + public T[] convertFrom(BsonReader in, DeMember member) { + this.checkInited(); + byte[] typevals = new byte[1]; + int len = in.readArrayB(member, typevals, this.componentDecoder); + if (len == Reader.SIGN_NULL) { + return null; + } + final Decodeable itemDecoder = BsonFactory.typeEnum(typevals[0]); + final List result = new ArrayList(); + // 固定长度 + for (int i = 0; i < len; i++) { + result.add(itemDecoder.convertFrom(in)); + } + in.readArrayE(); + T[] rs = this.componentArrayFunction.apply(result.size()); + return result.toArray(rs); + } +} diff --git a/src/main/java/org/redkale/convert/bson/BsonByteBufferReader.java b/src/main/java/org/redkale/convert/bson/BsonByteBufferReader.java index 4cfd54370..fd73953a5 100644 --- a/src/main/java/org/redkale/convert/bson/BsonByteBufferReader.java +++ b/src/main/java/org/redkale/convert/bson/BsonByteBufferReader.java @@ -5,12 +5,12 @@ */ package org.redkale.convert.bson; -import static org.redkale.convert.Reader.SIGN_NULL; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import org.redkale.convert.*; import org.redkale.convert.ext.ByteSimpledCoder; +import static org.redkale.convert.Reader.SIGN_NULL; /** * 以ByteBuffer为数据载体的BsonReader diff --git a/src/main/java/org/redkale/convert/bson/BsonCollectionDecoder.java b/src/main/java/org/redkale/convert/bson/BsonCollectionDecoder.java new file mode 100644 index 000000000..18a5365cb --- /dev/null +++ b/src/main/java/org/redkale/convert/bson/BsonCollectionDecoder.java @@ -0,0 +1,44 @@ +/* + * 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.convert.bson; + +import java.lang.reflect.Type; +import java.util.Collection; +import org.redkale.convert.*; + +/** + * Collection的反序列化操作类
+ * 支持一定程度的泛型。
+ * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param 反解析的集合元素类型 + */ +public class BsonCollectionDecoder extends CollectionDecoder { + + public BsonCollectionDecoder(final ConvertFactory factory, final Type type) { + super(factory, type); + } + + @Override + public Collection convertFrom(BsonReader in, DeMember member) { + this.checkInited(); + byte[] typevals = new byte[1]; + int len = in.readArrayB(member, typevals, componentDecoder); + if (len == Reader.SIGN_NULL) { + return null; + } + final Decodeable itemDecoder = BsonFactory.typeEnum(typevals[0]); + final Collection result = this.creator.create(); + // 固定长度 + for (int i = 0; i < len; i++) { + result.add(itemDecoder.convertFrom(in)); + } + in.readArrayE(); + return result; + } +} diff --git a/src/main/java/org/redkale/convert/bson/BsonFactory.java b/src/main/java/org/redkale/convert/bson/BsonFactory.java index c845d735e..b443e9edd 100644 --- a/src/main/java/org/redkale/convert/bson/BsonFactory.java +++ b/src/main/java/org/redkale/convert/bson/BsonFactory.java @@ -36,15 +36,15 @@ public final class BsonFactory extends ConvertFactory { static final Encodeable objectEncoder = instance.loadEncoder(Object.class); - static final Decodeable skipArrayDecoder = new SkipArrayDecoder(instance, Object[].class); + static final Decodeable skipArrayDecoder = new BsonArrayDecoder(instance, Object[].class); static final Decodeable skipCollectionDecoder = - new SkipCollectionDecoder(instance, new TypeToken>() {}.getType()); + new BsonCollectionDecoder(instance, new TypeToken>() {}.getType()); static final Decodeable skipStreamDecoder = - new SkipStreamDecoder(instance, new TypeToken>() {}.getType()); + new BsonStreamDecoder(instance, new TypeToken>() {}.getType()); - static final Decodeable skipMapDecoder = new SkipMapDecoder(instance, Map.class); + static final Decodeable skipMapDecoder = new BsonMapDecoder(instance, Map.class); static { instance.register(Serializable.class, objectDecoder); @@ -120,6 +120,26 @@ public final class BsonFactory extends ConvertFactory { return new BsonFactory(this, features); } + @Override + protected Decodeable createArrayDecoder(Type type) { + return new BsonArrayDecoder(this, type); + } + + @Override + protected Decodeable createCollectionDecoder(Type type) { + return new BsonCollectionDecoder(this, type); + } + + @Override + protected Decodeable createStreamDecoder(Type type) { + return new BsonStreamDecoder(this, type); + } + + @Override + protected Decodeable createMapDecoder(Type type) { + return new BsonMapDecoder(this, type); + } + @Override public ConvertType getConvertType() { return ConvertType.BSON; diff --git a/src/main/java/org/redkale/convert/bson/BsonMapDecoder.java b/src/main/java/org/redkale/convert/bson/BsonMapDecoder.java new file mode 100644 index 000000000..8be41919f --- /dev/null +++ b/src/main/java/org/redkale/convert/bson/BsonMapDecoder.java @@ -0,0 +1,48 @@ +/* + * 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.convert.bson; + +import java.lang.reflect.Type; +import java.util.Map; +import org.redkale.convert.*; + +/** + * Map的反序列化操作类
+ * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param Map key的数据类型 + * @param Map value的数据类型 + */ +public class BsonMapDecoder extends MapDecoder { + + public BsonMapDecoder(final BsonFactory factory, final Type type) { + super(factory, type); + } + + @Override + public Map convertFrom(BsonReader in, DeMember member) { + this.checkInited(); + byte[] typevals = new byte[2]; + int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder); + if (len == Reader.SIGN_NULL) { + return null; + } + Decodeable kdecoder = BsonFactory.typeEnum(typevals[0]); + Decodeable vdecoder = BsonFactory.typeEnum(typevals[1]); + final Map result = this.creator.create(); + // 固定长度 + for (int i = 0; i < len; i++) { + K key = kdecoder.convertFrom(in); + in.readBlank(); + V value = vdecoder.convertFrom(in); + result.put(key, value); + } + in.readMapE(); + return result; + } +} diff --git a/src/main/java/org/redkale/convert/bson/BsonReader.java b/src/main/java/org/redkale/convert/bson/BsonReader.java index 1d5b72497..a6b60202f 100644 --- a/src/main/java/org/redkale/convert/bson/BsonReader.java +++ b/src/main/java/org/redkale/convert/bson/BsonReader.java @@ -7,9 +7,9 @@ package org.redkale.convert.bson; import java.nio.charset.StandardCharsets; import org.redkale.convert.*; -import static org.redkale.convert.Reader.SIGN_NULL; import org.redkale.convert.ext.ByteSimpledCoder; -import org.redkale.util.ObjectPool; +import org.redkale.util.*; +import static org.redkale.convert.Reader.SIGN_NULL; /** * BSON数据源 @@ -129,6 +129,7 @@ public class BsonReader extends Reader { break; default: Decodeable decoder = BsonFactory.typeEnum(val); + System.out.println("val = " + val + ", decoder = " + decoder); if (decoder != null) { decoder.convertFrom(this); } @@ -139,7 +140,7 @@ public class BsonReader extends Reader { @Override public final String readObjectB(final Class clazz) { final String newcls = readClassName(); - if (newcls != null && !newcls.isEmpty()) { + if (Utility.isNotEmpty(newcls)) { return newcls; } short bt = readShort(); @@ -166,6 +167,10 @@ public class BsonReader extends Reader { } @Override + public int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valueDecoder) { + return readMapB(member, null, keyDecoder, valueDecoder); + } + public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) { short bt = readShort(); if (bt == Reader.SIGN_NULL) { @@ -186,12 +191,11 @@ public class BsonReader extends Reader { // do nothing } - /** - * 判断下一个非空白字节是否为[ - * - * @return 数组长度或SIGN_NULL - */ @Override + public int readArrayB(DeMember member, Decodeable componentDecoder) { + return readArrayB(member, null, componentDecoder); + } + public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { // componentDecoder可能为null short bt = readShort(); if (bt == Reader.SIGN_NULL) { @@ -223,20 +227,13 @@ public class BsonReader extends Reader { return this.position; } - @Override - public int readMemberContentLength(DeMember member, Decodeable decoder) { - return -1; - } - /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * - * @param startPosition 起始位置 - * @param contentLength 内容大小, 不确定的传-1 * @return 是否存在 */ @Override - public boolean hasNext(int startPosition, int contentLength) { + public boolean hasNext() { byte b = readByte(); if (b == SIGN_HASNEXT) { return true; @@ -269,19 +266,13 @@ public class BsonReader extends Reader { @Override public final byte[] readByteArray() { int len = readArrayB(null, null, null); - int contentLength = -1; if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = readMemberContentLength(null, null); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; byte[] data = new byte[8]; - int startPosition = position(); - while (hasNext(startPosition, contentLength)) { + while (hasNext()) { if (size >= data.length) { byte[] newdata = new byte[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); @@ -330,7 +321,7 @@ public class BsonReader extends Reader { | (((long) content[++this.position] & 0xff) << 24) | (((long) content[++this.position] & 0xff) << 16) | (((long) content[++this.position] & 0xff) << 8) - | (((long) content[++this.position] & 0xff))); + | ((long) content[++this.position] & 0xff)); } @Override diff --git a/src/main/java/org/redkale/convert/bson/BsonStreamDecoder.java b/src/main/java/org/redkale/convert/bson/BsonStreamDecoder.java new file mode 100644 index 000000000..562375964 --- /dev/null +++ b/src/main/java/org/redkale/convert/bson/BsonStreamDecoder.java @@ -0,0 +1,45 @@ +/* + * 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.convert.bson; + +import java.lang.reflect.Type; +import java.util.*; +import java.util.stream.Stream; +import org.redkale.convert.*; + +/** + * Stream的反序列化操作类
+ * 支持一定程度的泛型。
+ * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param 反解析的集合元素类型 + */ +public class BsonStreamDecoder extends StreamDecoder { + + public BsonStreamDecoder(final BsonFactory factory, final Type type) { + super(factory, type); + } + + @Override + public Stream convertFrom(BsonReader in, DeMember member) { + this.checkInited(); + byte[] typevals = new byte[1]; + int len = in.readArrayB(member, typevals, componentDecoder); + if (len == Reader.SIGN_NULL) { + return null; + } + final Decodeable itemDecoder = BsonFactory.typeEnum(typevals[0]); + final List result = new ArrayList(); + // 固定长度 + for (int i = 0; i < len; i++) { + result.add(itemDecoder.convertFrom(in)); + } + in.readArrayE(); + return result.stream(); + } +} diff --git a/src/main/java/org/redkale/convert/bson/SkipArrayDecoder.java b/src/main/java/org/redkale/convert/bson/SkipArrayDecoder.java deleted file mode 100644 index a08860bed..000000000 --- a/src/main/java/org/redkale/convert/bson/SkipArrayDecoder.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.convert.bson; - -import java.lang.reflect.Type; -import org.redkale.convert.*; - -/** - * 数组的反序列化操作类
- * 对象数组的反序列化,不包含int[]、long[]这样的primitive class数组。
- * 支持一定程度的泛型。
- * - *

详情见: https://redkale.org - * - * @author zhangjx - * @param 反解析的数组元素类型 - */ -public class SkipArrayDecoder extends ArrayDecoder { - - public SkipArrayDecoder(final BsonFactory factory, final Type type) { - super(factory, type); - } - - @Override - protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { - if (typevals != null) { - return BsonFactory.typeEnum(typevals[0]); - } - return decoder; - } -} diff --git a/src/main/java/org/redkale/convert/bson/SkipCollectionDecoder.java b/src/main/java/org/redkale/convert/bson/SkipCollectionDecoder.java deleted file mode 100644 index fd283eb1e..000000000 --- a/src/main/java/org/redkale/convert/bson/SkipCollectionDecoder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.convert.bson; - -import java.lang.reflect.Type; -import org.redkale.convert.*; - -/** - * Collection的反序列化操作类
- * 支持一定程度的泛型。
- * - *

详情见: https://redkale.org - * - * @author zhangjx - * @param 反解析的集合元素类型 - */ -public class SkipCollectionDecoder extends CollectionDecoder { - - public SkipCollectionDecoder(final ConvertFactory factory, final Type type) { - super(factory, type); - } - - @Override - protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { - if (typevals != null) { - return BsonFactory.typeEnum(typevals[0]); - } - return decoder; - } -} diff --git a/src/main/java/org/redkale/convert/bson/SkipMapDecoder.java b/src/main/java/org/redkale/convert/bson/SkipMapDecoder.java deleted file mode 100644 index 2c40817f9..000000000 --- a/src/main/java/org/redkale/convert/bson/SkipMapDecoder.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.convert.bson; - -import java.lang.reflect.Type; -import org.redkale.convert.*; - -/** - * Map的反序列化操作类
- * - *

详情见: https://redkale.org - * - * @author zhangjx - * @param Map key的数据类型 - * @param Map value的数据类型 - */ -public class SkipMapDecoder extends MapDecoder { - - public SkipMapDecoder(final BsonFactory factory, final Type type) { - super(factory, type); - } - - @Override - protected Decodeable getKeyDecoder(Decodeable decoder, byte[] typevals) { - if (typevals != null) { - return BsonFactory.typeEnum(typevals[0]); - } - return decoder; - } - - @Override - protected Decodeable getValueDecoder(Decodeable decoder, byte[] typevals) { - if (typevals != null) { - return BsonFactory.typeEnum(typevals[1]); - } - return decoder; - } -} diff --git a/src/main/java/org/redkale/convert/bson/SkipStreamDecoder.java b/src/main/java/org/redkale/convert/bson/SkipStreamDecoder.java deleted file mode 100644 index 6d276e0aa..000000000 --- a/src/main/java/org/redkale/convert/bson/SkipStreamDecoder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.convert.bson; - -import java.lang.reflect.Type; -import org.redkale.convert.*; - -/** - * Stream的反序列化操作类
- * 支持一定程度的泛型。
- * - *

详情见: https://redkale.org - * - * @author zhangjx - * @param 反解析的集合元素类型 - */ -public class SkipStreamDecoder extends StreamDecoder { - - public SkipStreamDecoder(final BsonFactory factory, final Type type) { - super(factory, type); - } - - @Override - protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { - if (typevals != null) { - return BsonFactory.typeEnum(typevals[0]); - } - return decoder; - } -} diff --git a/src/main/java/org/redkale/convert/ext/BoolArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/BoolArraySimpledCoder.java index 58c1a3914..3a075d7f1 100644 --- a/src/main/java/org/redkale/convert/ext/BoolArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/BoolArraySimpledCoder.java @@ -40,20 +40,14 @@ public final class BoolArraySimpledCoder ext @Override public boolean[] convertFrom(R in) { - int len = in.readArrayB(null, null, BoolSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, BoolSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, BoolSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; boolean[] data = new boolean[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { boolean[] newdata = new boolean[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/ByteBufferSimpledCoder.java b/src/main/java/org/redkale/convert/ext/ByteBufferSimpledCoder.java index 153a8adb6..6d272e603 100644 --- a/src/main/java/org/redkale/convert/ext/ByteBufferSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/ByteBufferSimpledCoder.java @@ -41,20 +41,14 @@ public final class ByteBufferSimpledCoder ex @Override public ByteBuffer convertFrom(R in) { - int len = in.readArrayB(null, null, ByteSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, ByteSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, ByteSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; byte[] data = new byte[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { byte[] newdata = new byte[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/CharArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/CharArraySimpledCoder.java index 45c115841..d79d7b6e5 100644 --- a/src/main/java/org/redkale/convert/ext/CharArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/CharArraySimpledCoder.java @@ -40,20 +40,14 @@ public final class CharArraySimpledCoder ext @Override public char[] convertFrom(R in) { - int len = in.readArrayB(null, null, CharSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, CharSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, CharSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; char[] data = new char[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { char[] newdata = new char[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/DoubleArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/DoubleArraySimpledCoder.java index e83bed43f..fa5d37c37 100644 --- a/src/main/java/org/redkale/convert/ext/DoubleArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/DoubleArraySimpledCoder.java @@ -41,20 +41,14 @@ public final class DoubleArraySimpledCoder e @Override public double[] convertFrom(R in) { - int len = in.readArrayB(null, null, DoubleSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, DoubleSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, DoubleSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; double[] data = new double[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { double[] newdata = new double[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/FloatArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/FloatArraySimpledCoder.java index 8b4d4063c..c89774f94 100644 --- a/src/main/java/org/redkale/convert/ext/FloatArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/FloatArraySimpledCoder.java @@ -40,20 +40,14 @@ public final class FloatArraySimpledCoder ex @Override public float[] convertFrom(R in) { - int len = in.readArrayB(null, null, FloatSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, FloatSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, FloatSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; float[] data = new float[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { float[] newdata = new float[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/IntArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/IntArraySimpledCoder.java index 46b58ae7f..da7ba6a02 100644 --- a/src/main/java/org/redkale/convert/ext/IntArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/IntArraySimpledCoder.java @@ -41,20 +41,14 @@ public final class IntArraySimpledCoder exte @Override public int[] convertFrom(R in) { - int len = in.readArrayB(null, null, IntSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, IntSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, IntSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; int[] data = new int[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { int[] newdata = new int[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/LongArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/LongArraySimpledCoder.java index c59698970..84da721fd 100644 --- a/src/main/java/org/redkale/convert/ext/LongArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LongArraySimpledCoder.java @@ -41,20 +41,14 @@ public final class LongArraySimpledCoder ext @Override public long[] convertFrom(R in) { - int len = in.readArrayB(null, null, LongSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, LongSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, LongSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; long[] data = new long[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { long[] newdata = new long[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/ShortArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/ShortArraySimpledCoder.java index 6c811ae23..7c71e2640 100644 --- a/src/main/java/org/redkale/convert/ext/ShortArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/ShortArraySimpledCoder.java @@ -40,20 +40,14 @@ public final class ShortArraySimpledCoder ex @Override public short[] convertFrom(R in) { - int len = in.readArrayB(null, null, ShortSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(null, ShortSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, ShortSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; short[] data = new short[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { short[] newdata = new short[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/ext/StringArraySimpledCoder.java b/src/main/java/org/redkale/convert/ext/StringArraySimpledCoder.java index 9cc169e1b..fca66cf2c 100644 --- a/src/main/java/org/redkale/convert/ext/StringArraySimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/StringArraySimpledCoder.java @@ -44,20 +44,14 @@ public final class StringArraySimpledCoder e } public String[] convertFrom(R in, DeMember member) { - int len = in.readArrayB(member, null, StringSimpledCoder.instance); - int contentLength = -1; + int len = in.readArrayB(member, StringSimpledCoder.instance); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(null, StringSimpledCoder.instance); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; String[] data = new String[8]; - int startPosition = in.position(); - while (in.hasNext(startPosition, contentLength)) { + while (in.hasNext()) { if (size >= data.length) { String[] newdata = new String[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java index a6740cf60..52d94e826 100644 --- a/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/main/java/org/redkale/convert/json/JsonByteBufferReader.java @@ -160,7 +160,7 @@ public class JsonByteBufferReader extends JsonReader { /** * 判断下一个非空白字符是否为{ * - * @return SIGN_NOLENGTH 或 SIGN_NULL + * @return SIGN_VARIABLE 或 SIGN_NULL */ @Override public final String readObjectB(final Class clazz) { @@ -181,15 +181,14 @@ public class JsonByteBufferReader extends JsonReader { * 判断下一个非空白字符是否为[ * * @param member DeMember - * @param typevals byte[] * @param decoder Decodeable - * @return SIGN_NOLENGTH 或 SIGN_NULL + * @return SIGN_VARIABLE 或 SIGN_NULL */ @Override - public final int readArrayB(DeMember member, byte[] typevals, Decodeable decoder) { + public final int readArrayB(DeMember member, Decodeable decoder) { char ch = nextGoodChar(true); if (ch == '[' || ch == '{') { - return SIGN_NOLENGTH; + return SIGN_VARIABLE; } if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') { return SIGN_NULL; diff --git a/src/main/java/org/redkale/convert/json/JsonMultiArrayDecoder.java b/src/main/java/org/redkale/convert/json/JsonMultiArrayDecoder.java index e8a64fe8d..e48be9a4f 100644 --- a/src/main/java/org/redkale/convert/json/JsonMultiArrayDecoder.java +++ b/src/main/java/org/redkale/convert/json/JsonMultiArrayDecoder.java @@ -39,16 +39,15 @@ public class JsonMultiArrayDecoder implements Decodeable { } public Object[] convertFrom(JsonReader in, DeMember member) { - int len = in.readArrayB(member, null, null); + int len = in.readArrayB(member, null); if (len == Reader.SIGN_NULL) { return null; } - // len must be Reader.SIGN_NOLENGTH + // len must be Reader.SIGN_VARIABLE final List result = new ArrayList(); - int startPosition = in.position(); int index = -1; final Decodeable[] coders = this.decoders; - while (in.hasNext(startPosition, -1)) { + while (in.hasNext()) { result.add(coders[++index % coders.length].convertFrom(in)); } in.readArrayE(); diff --git a/src/main/java/org/redkale/convert/json/JsonReader.java b/src/main/java/org/redkale/convert/json/JsonReader.java index fe107bae8..a498278e9 100644 --- a/src/main/java/org/redkale/convert/json/JsonReader.java +++ b/src/main/java/org/redkale/convert/json/JsonReader.java @@ -6,8 +6,7 @@ package org.redkale.convert.json; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Objects; +import java.util.*; import org.redkale.convert.*; import static org.redkale.convert.Reader.*; import org.redkale.convert.Reader.ValueType; @@ -299,14 +298,13 @@ public class JsonReader extends Reader { * 判断下一个非空白字符是否为{ * * @param member DeMember - * @param typevals byte[] * @param keyDecoder Decodeable * @param valuedecoder Decodeable - * @return SIGN_NOLENGTH 或 SIGN_NULL + * @return SIGN_VARIABLE 或 SIGN_NULL */ @Override - public final int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valuedecoder) { - return readArrayB(member, typevals, keyDecoder); + public final int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valuedecoder) { + return readArrayB(member, keyDecoder); } @Override @@ -318,21 +316,20 @@ public class JsonReader extends Reader { * 判断下一个非空白字符是否为[ * * @param member DeMember - * @param typevals byte[] * @param componentDecoder Decodeable - * @return SIGN_NOLENGTH 或 SIGN_NULL + * @return SIGN_VARIABLE 或 SIGN_NULL */ @Override - public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { + public int readArrayB(DeMember member, Decodeable componentDecoder) { if (this.text.length == 0) { return SIGN_NULL; } char ch = nextGoodChar(true); if (ch == '[') { - return SIGN_NOLENGTH; + return SIGN_VARIABLE; } if (ch == '{') { - return SIGN_NOLENGTH; + return SIGN_VARIABLE; } if (ch == 'n' && text[++position] == 'u' && text[++position] == 'l' && text[++position] == 'l') { return SIGN_NULL; @@ -365,20 +362,13 @@ public class JsonReader extends Reader { return this.position; } - @Override - public int readMemberContentLength(DeMember member, Decodeable decoder) { - return -1; - } - /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * - * @param startPosition 起始位置 - * @param contentLength 内容大小, 不确定的传-1 * @return 是否存在 */ @Override - public final boolean hasNext(int startPosition, int contentLength) { + public final boolean hasNext() { char ch = nextGoodChar(true); if (ch == ',') { char nt = nextGoodChar(true); @@ -730,20 +720,14 @@ public class JsonReader extends Reader { @Override public final byte[] readByteArray() { - int len = readArrayB(null, null, null); - int contentLength = -1; + int len = readArrayB(null, null); if (len == Reader.SIGN_NULL) { return null; } - if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = readMemberContentLength(null, null); - len = Reader.SIGN_NOLENGTH; - } - if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_VARIABLE) { int size = 0; byte[] data = new byte[8]; - int startPosition = position(); - while (hasNext(startPosition, contentLength)) { + while (hasNext()) { if (size >= data.length) { byte[] newdata = new byte[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); @@ -755,7 +739,7 @@ public class JsonReader extends Reader { byte[] newdata = new byte[size]; System.arraycopy(data, 0, newdata, 0, size); return newdata; - } else { + } else { // 固定长度 byte[] values = new byte[len]; for (int i = 0; i < values.length; i++) { values[i] = readByte(); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufArrayDecoder.java b/src/main/java/org/redkale/convert/pb/ProtobufArrayDecoder.java index 726e69f35..b0dd8aade 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufArrayDecoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufArrayDecoder.java @@ -6,6 +6,7 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.*; import org.redkale.convert.*; /** @@ -24,6 +25,27 @@ public class ProtobufArrayDecoder extends ArrayDecoder { } @Override + public T[] convertFrom(ProtobufReader in, DeMember member) { + this.checkInited(); + final Decodeable itemDecoder = this.componentDecoder; + in.readArrayB(member, itemDecoder); + int contentLength = in.readMemberContentLength(member, itemDecoder); + final List result = new ArrayList(); + boolean first = true; + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { + ProtobufReader itemReader = getItemReader(in, member, first); + if (itemReader == null) { // 元素读取完毕 + break; + } + result.add(itemDecoder.convertFrom(itemReader)); + first = false; + } + in.readArrayE(); + T[] rs = this.componentArrayFunction.apply(result.size()); + return result.toArray(rs); + } + protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) { return ProtobufFactory.getItemReader(in, member, componentSimpled, first); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCollectionDecoder.java b/src/main/java/org/redkale/convert/pb/ProtobufCollectionDecoder.java index 63f363df0..4f779b2d2 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCollectionDecoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCollectionDecoder.java @@ -6,6 +6,7 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.Collection; import org.redkale.convert.*; /** @@ -22,6 +23,26 @@ public class ProtobufCollectionDecoder extends CollectionDecoder convertFrom(ProtobufReader in, DeMember member) { + this.checkInited(); + final Decodeable itemDecoder = this.componentDecoder; + in.readArrayB(member, itemDecoder); + int contentLength = in.readMemberContentLength(member, itemDecoder); + final Collection result = this.creator.create(); + boolean first = true; + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { + ProtobufReader itemReader = getItemReader(in, member, first); + if (itemReader == null) { // 元素读取完毕 + break; + } + result.add(itemDecoder.convertFrom(itemReader)); + first = false; + } + in.readArrayE(); + return result; + } + protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) { return ProtobufFactory.getItemReader(in, member, componentSimpled, first); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufMapDecoder.java b/src/main/java/org/redkale/convert/pb/ProtobufMapDecoder.java index 14748eb7e..0a1f98992 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufMapDecoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufMapDecoder.java @@ -6,6 +6,7 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.Map; import org.redkale.convert.*; /** @@ -23,6 +24,29 @@ public class ProtobufMapDecoder extends MapDecoder { } @Override + public Map convertFrom(ProtobufReader in, DeMember member) { + this.checkInited(); + in.readMapB(member, this.keyDecoder, this.valueDecoder); + final Map result = this.creator.create(); + boolean first = true; + Decodeable kdecoder = this.keyDecoder; + Decodeable vdecoder = this.valueDecoder; + while (in.hasNext()) { + ProtobufReader entryReader = getEntryReader(in, member, first); + if (entryReader == null) { + break; + } + entryReader.readTag(); + K key = kdecoder.convertFrom(entryReader); + entryReader.readTag(); + V value = vdecoder.convertFrom(entryReader); + result.put(key, value); + first = false; + } + in.readMapE(); + return result; + } + protected ProtobufReader getEntryReader(ProtobufReader in, DeMember member, boolean first) { if (!first && member != null) { int tag = in.readTag(); @@ -34,18 +58,4 @@ public class ProtobufMapDecoder extends MapDecoder { byte[] bs = in.readByteArray(); return new ProtobufReader(bs); } - - @Override - protected K readKeyMember( - ProtobufReader in, DeMember member, Decodeable decoder, boolean first) { - in.readTag(); - return decoder.convertFrom(in); - } - - @Override - protected V readValueMember( - ProtobufReader in, DeMember member, Decodeable decoder, boolean first) { - in.readTag(); - return decoder.convertFrom(in); - } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java index 7a1a0608c..e58a5c254 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java @@ -46,11 +46,13 @@ public class ProtobufMapEncoder extends MapEncoder { V v = mapFieldFunc == null ? val : mapFieldFunc.apply(key, val); if (v != null) { out.writeFieldName(member); + ProtobufWriter tmp = out.pollChild(); tmp.writeTag(keyTag); kencoder.convertTo(tmp, key); tmp.writeTag(valTag); vencoder.convertTo(tmp, v); + out.writeLength(tmp.count()); out.writeTo(tmp.toArray()); out.offerChild(tmp); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufReader.java b/src/main/java/org/redkale/convert/pb/ProtobufReader.java index 84b0255fd..ac8c2c808 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufReader.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufReader.java @@ -5,7 +5,6 @@ */ package org.redkale.convert.pb; -import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.atomic.*; @@ -123,8 +122,8 @@ public class ProtobufReader extends Reader { } @Override - public final int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) { - return Reader.SIGN_NOLENGTH; + public final int readMapB(DeMember member, Decodeable keyDecoder, Decodeable valueDecoder) { + return Reader.SIGN_VARIABLE; } @Override @@ -136,23 +135,12 @@ public class ProtobufReader extends Reader { * 判断下一个非空白字符是否为[ * * @param member DeMember - * @param typevals byte[] * @param componentDecoder Decodeable - * @return SIGN_NOLENGTH 或 SIGN_NULL + * @return SIGN_VARIABLE 或 SIGN_NULL */ @Override - public final int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { - if (member == null || componentDecoder == null) { - return Reader.SIGN_NOLENBUTBYTES; - } - Type type = componentDecoder.getType(); - if (!(type instanceof Class)) { - return Reader.SIGN_NOLENBUTBYTES; - } - if (ProtobufFactory.isNoLenBytesType(type)) { - return Reader.SIGN_NOLENBUTBYTES; - } - return Reader.SIGN_NOLENGTH; + public final int readArrayB(DeMember member, Decodeable componentDecoder) { + return Reader.SIGN_VARIABLE; } @Override @@ -171,7 +159,6 @@ public class ProtobufReader extends Reader { return this.position; } - @Override public final int readMemberContentLength(DeMember member, Decodeable decoder) { if (member == null && decoder == null) { return -1; // 为byte[] @@ -482,6 +469,7 @@ public class ProtobufReader extends Reader { return this.content[this.position]; } + @Override public boolean hasNext() { return (this.position + 1) < this.content.length; } @@ -493,7 +481,6 @@ public class ProtobufReader extends Reader { * @param contentLength 内容大小, 不确定的传-1 * @return 是否存在 */ - @Override public boolean hasNext(int startPosition, int contentLength) { // ("-------------: " + startPosition + ", " + contentLength + ", " + this.position); if (startPosition >= 0 && contentLength >= 0) { diff --git a/src/main/java/org/redkale/convert/pb/ProtobufStreamDecoder.java b/src/main/java/org/redkale/convert/pb/ProtobufStreamDecoder.java index 3cdcbee5e..3bbec0285 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufStreamDecoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufStreamDecoder.java @@ -6,6 +6,8 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.*; +import java.util.stream.Stream; import org.redkale.convert.*; /** @@ -22,6 +24,26 @@ public class ProtobufStreamDecoder extends StreamDecoder { } @Override + public Stream convertFrom(ProtobufReader in, DeMember member) { + this.checkInited(); + final Decodeable itemDecoder = this.componentDecoder; + in.readArrayB(member, itemDecoder); + int contentLength = in.readMemberContentLength(member, itemDecoder); + final List result = new ArrayList(); + boolean first = true; + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { + ProtobufReader itemReader = getItemReader(in, member, first); + if (itemReader == null) { // 元素读取完毕 + break; + } + result.add(itemDecoder.convertFrom(itemReader)); + first = false; + } + in.readArrayE(); + return result.stream(); + } + protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) { return ProtobufFactory.getItemReader(in, member, componentSimpled, first); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java index 7f5de16f1..c7c7f2660 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java @@ -326,9 +326,10 @@ public class ProtobufWriter extends Writer implements ByteTuple { // do nothing } + // 被ObjectEncoder调用 @Override public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) { - writeTag(member.getTag()); + writeTag(member != null ? member.getTag() : fieldPos); } @Override