diff --git a/src/org/redkale/convert/ArrayDecoder.java b/src/org/redkale/convert/ArrayDecoder.java index 243dff187..779ef4ada 100644 --- a/src/org/redkale/convert/ArrayDecoder.java +++ b/src/org/redkale/convert/ArrayDecoder.java @@ -89,8 +89,9 @@ public class ArrayDecoder implements Decodeable { boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); - while (in.hasNext(member, startPosition, contentLength)) { - result.add(readMemberValue(in, member, first)); + while (in.hasNext(this, member, startPosition, contentLength)) { + Reader itemReader = getArrayItemReader(in, member, first); + result.add(readMemberValue(itemReader, member, first)); first = false; } } else { @@ -103,6 +104,10 @@ public class ArrayDecoder implements Decodeable { return result.toArray(rs); } + protected Reader getArrayItemReader(Reader in, DeMember member, boolean first) { + return in; + } + protected T readMemberValue(Reader in, DeMember member, boolean first) { return this.decoder.convertFrom(in); } diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index 090c8a561..ccd7b2ab7 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -89,7 +89,7 @@ public class CollectionDecoder implements Decodeable> { boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); - while (in.hasNext(member, startPosition, contentLength)) { + while (in.hasNext(this, member, startPosition, contentLength)) { result.add(readMemberValue(in, member, first)); first = false; } diff --git a/src/org/redkale/convert/MapDecoder.java b/src/org/redkale/convert/MapDecoder.java index 87a1dfe6b..a4703f380 100644 --- a/src/org/redkale/convert/MapDecoder.java +++ b/src/org/redkale/convert/MapDecoder.java @@ -102,7 +102,7 @@ public class MapDecoder implements Decodeable> { boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); - while (in.hasNext(member, startPosition, contentLength)) { + while (in.hasNext(this, member, startPosition, contentLength)) { Reader entryReader = getMapEntryReader(in, member, first); K key = readKeyMember(entryReader, member, first); entryReader.readBlank(); diff --git a/src/org/redkale/convert/Reader.java b/src/org/redkale/convert/Reader.java index faf957029..cd53829db 100644 --- a/src/org/redkale/convert/Reader.java +++ b/src/org/redkale/convert/Reader.java @@ -22,19 +22,20 @@ public abstract class Reader { public static final short SIGN_NOLENGTH = -2; - public static final short SIGN_NOLENBUTBYTES = -3; + public static final short SIGN_NOLENBUTBYTES = -3; //目前只适合于protobuf的boolean[]...double[]类型 /** * 是否还存在下个元素或字段
* 注意: 主要用于Array、Collection、Stream或Map等集合对象 * + * @param self Decodeable * @param member DeMember * @param startPosition 起始位置 * @param contentLength 内容大小, 不确定的传-1 * * @return 是否还存在下个元素或字段 */ - public abstract boolean hasNext(DeMember member, int startPosition, int contentLength); + public abstract boolean hasNext(Decodeable self, DeMember member, int startPosition, int contentLength); /** * 是否还存在下个元素或字段 @@ -43,7 +44,7 @@ public abstract class Reader { * @return 是否还存在下个元素或字段 */ public boolean hasNext() { - return hasNext(null, -1, -1); + return hasNext(null, null, -1, -1); } /** diff --git a/src/org/redkale/convert/StreamDecoder.java b/src/org/redkale/convert/StreamDecoder.java index 295f37dfa..fee7efb7b 100644 --- a/src/org/redkale/convert/StreamDecoder.java +++ b/src/org/redkale/convert/StreamDecoder.java @@ -85,7 +85,7 @@ public class StreamDecoder implements Decodeable> { boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); - while (in.hasNext(member, startPosition, contentLength)) { + while (in.hasNext(this, member, startPosition, contentLength)) { result.add(readMemberValue(in, member, first)); first = false; } diff --git a/src/org/redkale/convert/bson/BsonReader.java b/src/org/redkale/convert/bson/BsonReader.java index 2b1d59902..7efd5a6a7 100644 --- a/src/org/redkale/convert/bson/BsonReader.java +++ b/src/org/redkale/convert/bson/BsonReader.java @@ -215,13 +215,15 @@ public class BsonReader extends Reader { /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * + * @param self Decodeable + * @param member DeMember * @param startPosition 起始位置 * @param contentLength 内容大小, 不确定的传-1 * * @return 是否存在 */ @Override - public boolean hasNext(DeMember member, int startPosition, int contentLength) { + public boolean hasNext(Decodeable self, DeMember member, int startPosition, int contentLength) { byte b = readByte(); if (b == SIGN_HASNEXT) return true; if (b != SIGN_NONEXT) throw new ConvertException("hasNext option must be (" + (SIGN_HASNEXT) @@ -274,7 +276,7 @@ public class BsonReader extends Reader { int size = 0; byte[] data = new byte[8]; int startPosition = position(); - while (hasNext(null, startPosition, contentLength)) { + while (hasNext(null, null, startPosition, contentLength)) { if (size >= data.length) { byte[] newdata = new byte[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/BoolArraySimpledCoder.java b/src/org/redkale/convert/ext/BoolArraySimpledCoder.java index 616ba7fcc..18e5fc481 100644 --- a/src/org/redkale/convert/ext/BoolArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/BoolArraySimpledCoder.java @@ -53,7 +53,7 @@ public final class BoolArraySimpledCoder ext int size = 0; boolean[] data = new boolean[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { boolean[] newdata = new boolean[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java index e89b5394d..1f72c00e0 100644 --- a/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java +++ b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java @@ -54,7 +54,7 @@ public final class ByteBufferSimpledCoder ex int size = 0; byte[] data = new byte[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { byte[] newdata = new byte[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/CharArraySimpledCoder.java b/src/org/redkale/convert/ext/CharArraySimpledCoder.java index c7289a7c8..f806b443f 100644 --- a/src/org/redkale/convert/ext/CharArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/CharArraySimpledCoder.java @@ -53,7 +53,7 @@ public final class CharArraySimpledCoder ext int size = 0; char[] data = new char[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { char[] newdata = new char[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java b/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java index 4e826dc9a..1e6fb0719 100644 --- a/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java @@ -54,7 +54,7 @@ public final class DoubleArraySimpledCoder e int size = 0; double[] data = new double[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { double[] newdata = new double[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/FloatArraySimpledCoder.java b/src/org/redkale/convert/ext/FloatArraySimpledCoder.java index b8de258fb..97711e764 100644 --- a/src/org/redkale/convert/ext/FloatArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/FloatArraySimpledCoder.java @@ -53,7 +53,7 @@ public final class FloatArraySimpledCoder ex int size = 0; float[] data = new float[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { float[] newdata = new float[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/IntArraySimpledCoder.java b/src/org/redkale/convert/ext/IntArraySimpledCoder.java index 96263ce23..dfd701a4e 100644 --- a/src/org/redkale/convert/ext/IntArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/IntArraySimpledCoder.java @@ -54,7 +54,7 @@ public final class IntArraySimpledCoder exte int size = 0; int[] data = new int[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { int[] newdata = new int[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/LongArraySimpledCoder.java b/src/org/redkale/convert/ext/LongArraySimpledCoder.java index 834c8955b..8196a9024 100644 --- a/src/org/redkale/convert/ext/LongArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/LongArraySimpledCoder.java @@ -54,7 +54,7 @@ public final class LongArraySimpledCoder ext int size = 0; long[] data = new long[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { long[] newdata = new long[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/ShortArraySimpledCoder.java b/src/org/redkale/convert/ext/ShortArraySimpledCoder.java index 5494fb90f..74c9589f7 100644 --- a/src/org/redkale/convert/ext/ShortArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/ShortArraySimpledCoder.java @@ -53,7 +53,7 @@ public final class ShortArraySimpledCoder ex int size = 0; short[] data = new short[8]; int startPosition = in.position(); - while (in.hasNext(null, startPosition, contentLength)) { + while (in.hasNext(this, null, startPosition, contentLength)) { if (size >= data.length) { short[] newdata = new short[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/ext/StringArraySimpledCoder.java b/src/org/redkale/convert/ext/StringArraySimpledCoder.java index d83fed70e..3b0c6cffc 100644 --- a/src/org/redkale/convert/ext/StringArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/StringArraySimpledCoder.java @@ -55,7 +55,7 @@ public final class StringArraySimpledCoder e int size = 0; String[] data = new String[8]; int startPosition = in.position(); - while (in.hasNext(member, startPosition, contentLength)) { + while (in.hasNext(this, member, startPosition, contentLength)) { if (size >= data.length) { String[] newdata = new String[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size); diff --git a/src/org/redkale/convert/json/JsonByteBufferReader.java b/src/org/redkale/convert/json/JsonByteBufferReader.java index 2f1466a86..b0b675423 100644 --- a/src/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/org/redkale/convert/json/JsonByteBufferReader.java @@ -159,6 +159,7 @@ public class JsonByteBufferReader extends JsonReader { /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * + * @param self Decodeable * @param member DeMember * @param startPosition 起始位置 * @param contentLength 内容大小, 不确定的传-1 @@ -166,7 +167,7 @@ public class JsonByteBufferReader extends JsonReader { * @return 是否存在 */ @Override - public boolean hasNext(DeMember member, int startPosition, int contentLength) { + public boolean hasNext(Decodeable self, DeMember member, int startPosition, int contentLength) { char ch = nextGoodChar(); if (ch == ',') return true; if (ch == '}' || ch == ']' || ch == 0) return false; diff --git a/src/org/redkale/convert/json/JsonReader.java b/src/org/redkale/convert/json/JsonReader.java index 1cbe2fb06..6e7eef6ee 100644 --- a/src/org/redkale/convert/json/JsonReader.java +++ b/src/org/redkale/convert/json/JsonReader.java @@ -263,13 +263,15 @@ public class JsonReader extends Reader { /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * + * @param self Decodeable + * @param member DeMember * @param startPosition 起始位置 * @param contentLength 内容大小, 不确定的传-1 * * @return 是否存在 */ @Override - public boolean hasNext(DeMember member, int startPosition, int contentLength) { + public boolean hasNext(Decodeable self, DeMember member, int startPosition, int contentLength) { char ch = this.text[++this.position]; if (ch == ',') return true; if (ch == '}' || ch == ']') return false; @@ -485,7 +487,7 @@ public class JsonReader extends Reader { int size = 0; byte[] data = new byte[8]; int startPosition = position(); - while (hasNext(null, startPosition, contentLength)) { + while (hasNext(null, null, startPosition, contentLength)) { if (size >= data.length) { byte[] newdata = new byte[data.length + 4]; System.arraycopy(data, 0, newdata, 0, size);