From 03e9a5cbcbe3354d2f7419a6ccd4a32348849cce Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 19 Jul 2018 10:26:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0Convert=E7=9A=84Array?= =?UTF-8?q?=E3=80=81Map=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/AnyEncoder.java | 2 +- src/org/redkale/convert/ArrayDecoder.java | 10 ++++-- src/org/redkale/convert/ArrayEncoder.java | 6 ++-- .../redkale/convert/CollectionDecoder.java | 12 +++++-- .../redkale/convert/CollectionEncoder.java | 4 +-- src/org/redkale/convert/MapDecoder.java | 10 ++++-- src/org/redkale/convert/MapEncoder.java | 4 +-- src/org/redkale/convert/Reader.java | 35 +++++++++++++++++-- src/org/redkale/convert/StreamDecoder.java | 10 ++++-- src/org/redkale/convert/StreamEncoder.java | 6 ++-- src/org/redkale/convert/Writer.java | 13 ++++--- src/org/redkale/convert/bson/BsonReader.java | 23 ++++++++++-- src/org/redkale/convert/bson/BsonWriter.java | 8 ++--- .../convert/ext/BoolArraySimpledCoder.java | 10 ++++-- .../convert/ext/ByteBufferSimpledCoder.java | 10 ++++-- .../convert/ext/CharArraySimpledCoder.java | 14 ++++++-- .../convert/ext/DoubleArraySimpledCoder.java | 10 ++++-- .../convert/ext/FloatArraySimpledCoder.java | 14 ++++++-- .../convert/ext/IntArraySimpledCoder.java | 10 ++++-- .../convert/ext/LongArraySimpledCoder.java | 10 ++++-- .../convert/ext/ShortArraySimpledCoder.java | 14 ++++++-- .../convert/ext/StringArraySimpledCoder.java | 14 ++++++-- .../convert/json/JsonByteBufferReader.java | 5 ++- src/org/redkale/convert/json/JsonReader.java | 23 ++++++++++-- src/org/redkale/convert/json/JsonWriter.java | 6 ++-- 25 files changed, 223 insertions(+), 60 deletions(-) diff --git a/src/org/redkale/convert/AnyEncoder.java b/src/org/redkale/convert/AnyEncoder.java index ca712c405..58f7f45e7 100644 --- a/src/org/redkale/convert/AnyEncoder.java +++ b/src/org/redkale/convert/AnyEncoder.java @@ -42,7 +42,7 @@ public final class AnyEncoder implements Encodeable { out.writeNull(); } else { int count = values.length - values.length % 2; - out.writeMapB(count / 2); + out.writeMapB(count / 2, (Encodeable) this, (Encodeable) this, values); for (int i = 0; i < count; i += 2) { if (i > 0) out.writeArrayMark(); this.convertTo(out, (T) values[i]); diff --git a/src/org/redkale/convert/ArrayDecoder.java b/src/org/redkale/convert/ArrayDecoder.java index e4d7bfeea..ed320aed3 100644 --- a/src/org/redkale/convert/ArrayDecoder.java +++ b/src/org/redkale/convert/ArrayDecoder.java @@ -62,8 +62,13 @@ public final class ArrayDecoder implements Decodeable { @Override public T[] convertFrom(Reader in) { - final int len = in.readArrayB(); + int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (this.decoder == null) { if (!this.inited) { synchronized (lock) { @@ -78,7 +83,8 @@ public final class ArrayDecoder implements Decodeable { final Decodeable localdecoder = this.decoder; final List result = new ArrayList(); if (len == Reader.SIGN_NOLENGTH) { - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { result.add(localdecoder.convertFrom(in)); } } else { diff --git a/src/org/redkale/convert/ArrayEncoder.java b/src/org/redkale/convert/ArrayEncoder.java index 4cff3f93c..88496eff4 100644 --- a/src/org/redkale/convert/ArrayEncoder.java +++ b/src/org/redkale/convert/ArrayEncoder.java @@ -62,7 +62,7 @@ public final class ArrayEncoder implements Encodeable { return; } if (value.length == 0) { - out.writeArrayB(0); + out.writeArrayB(0, encoder, value); out.writeArrayE(); return; } @@ -77,7 +77,7 @@ public final class ArrayEncoder implements Encodeable { } } } - out.writeArrayB(value.length); + out.writeArrayB(value.length, encoder, value); final Type comp = this.componentType; boolean first = true; for (Object v : value) { @@ -105,5 +105,5 @@ public final class ArrayEncoder implements Encodeable { public Encodeable getEncoder() { return encoder; } - + } diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index f2358e4fd..a9d46d5cd 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -44,7 +44,7 @@ public final class CollectionDecoder implements Decodeable implements Decodeable convertFrom(Reader in) { - final int len = in.readArrayB(); + int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (this.decoder == null) { if (!this.inited) { synchronized (lock) { @@ -78,7 +83,8 @@ public final class CollectionDecoder implements Decodeable localdecoder = this.decoder; final Collection result = this.creator.create(); if (len == Reader.SIGN_NOLENGTH) { - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { result.add(localdecoder.convertFrom(in)); } } else { diff --git a/src/org/redkale/convert/CollectionEncoder.java b/src/org/redkale/convert/CollectionEncoder.java index d412b7c28..0ee374fe9 100644 --- a/src/org/redkale/convert/CollectionEncoder.java +++ b/src/org/redkale/convert/CollectionEncoder.java @@ -57,7 +57,7 @@ public final class CollectionEncoder implements Encodeable implements Encodeable implements Decodeable> { } } } - final int len = in.readMapB(); + int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } final Map result = this.creator.create(); if (len == Reader.SIGN_NOLENGTH) { - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { K key = keyDecoder.convertFrom(in); in.readBlank(); V value = valueDecoder.convertFrom(in); diff --git a/src/org/redkale/convert/MapEncoder.java b/src/org/redkale/convert/MapEncoder.java index befb21f2a..7b5a83fe1 100644 --- a/src/org/redkale/convert/MapEncoder.java +++ b/src/org/redkale/convert/MapEncoder.java @@ -70,7 +70,7 @@ public final class MapEncoder implements Encodeable> { } } } - out.writeMapB(values.size()); + out.writeMapB(values.size(), (Encodeable) keyencoder, (Encodeable) valencoder, value); boolean first = true; for (Map.Entry en : values.entrySet()) { if (!first) out.writeArrayMark(); @@ -94,5 +94,5 @@ public final class MapEncoder implements Encodeable> { public Encodeable getValencoder() { return valencoder; } - + } diff --git a/src/org/redkale/convert/Reader.java b/src/org/redkale/convert/Reader.java index 428aadceb..3f61f687b 100644 --- a/src/org/redkale/convert/Reader.java +++ b/src/org/redkale/convert/Reader.java @@ -22,12 +22,43 @@ public abstract class Reader { public static final short SIGN_NOLENGTH = -2; + public static final short SIGN_NOLENBUTBYTES = -3; + /** - * 是否还存在下个元素或字段 + * 是否还存在下个元素或字段
+ * 注意: 主要用于Array、Collection、Stream或Map等集合对象 + * + * @param startPosition 起始位置 + * @param contentLength 内容大小, 不确定的传-1 * * @return 是否还存在下个元素或字段 */ - public abstract boolean hasNext(); + public abstract boolean hasNext(int startPosition, int contentLength); + + /** + * 是否还存在下个元素或字段 + * + * + * @return 是否还存在下个元素或字段 + */ + public boolean hasNext() { + return hasNext(-1, -1); + } + + /** + * 获取当前位置 + * + * @return 当前位置 + */ + public abstract int position(); + + /** + * 读取字段值内容的字节数
+ * 只有在readXXXB方法返回SIGN_NOLENBUTBYTES值才会调用此方法 + * + * @return 内容大小, 不确定返回-1 + */ + public abstract int readMemberContentLength(); /** * 跳过值(不包含值前面的字段) diff --git a/src/org/redkale/convert/StreamDecoder.java b/src/org/redkale/convert/StreamDecoder.java index 5a6a5051f..f37543e66 100644 --- a/src/org/redkale/convert/StreamDecoder.java +++ b/src/org/redkale/convert/StreamDecoder.java @@ -58,8 +58,13 @@ public final class StreamDecoder implements Decodeable> { @Override public Stream convertFrom(Reader in) { - final int len = in.readArrayB(); + int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (this.decoder == null) { if (!this.inited) { synchronized (lock) { @@ -74,7 +79,8 @@ public final class StreamDecoder implements Decodeable> { final Decodeable localdecoder = this.decoder; final List result = new ArrayList(); if (len == Reader.SIGN_NOLENGTH) { - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(startPosition, contentLength)) { result.add(localdecoder.convertFrom(in)); } } else { diff --git a/src/org/redkale/convert/StreamEncoder.java b/src/org/redkale/convert/StreamEncoder.java index 0d4d18770..64fe87e2a 100644 --- a/src/org/redkale/convert/StreamEncoder.java +++ b/src/org/redkale/convert/StreamEncoder.java @@ -58,7 +58,7 @@ public final class StreamEncoder implements Encodeable> { } Object[] array = value.toArray(); if (array.length == 0) { - out.writeArrayB(0); + out.writeArrayB(0, encoder, array); out.writeArrayE(); return; } @@ -73,7 +73,7 @@ public final class StreamEncoder implements Encodeable> { } } } - out.writeArrayB(array.length); + out.writeArrayB(array.length, encoder, array); boolean first = true; for (Object v : array) { if (!first) out.writeArrayMark(); @@ -91,5 +91,5 @@ public final class StreamEncoder implements Encodeable> { public Encodeable getEncoder() { return encoder; } - + } diff --git a/src/org/redkale/convert/Writer.java b/src/org/redkale/convert/Writer.java index 190165251..04a9e6528 100644 --- a/src/org/redkale/convert/Writer.java +++ b/src/org/redkale/convert/Writer.java @@ -126,9 +126,11 @@ public abstract class Writer { /** * 输出一个数组前的操作 * - * @param size 数组长度 + * @param size 数组长度 + * @param encoder Encodeable + * @param obj 对象 */ - public abstract void writeArrayB(int size); + public abstract void writeArrayB(int size, Encodeable encoder, Object obj); /** * 输出数组元素间的间隔符 @@ -145,9 +147,12 @@ public abstract class Writer { /** * 输出一个Map前的操作 * - * @param size map大小 + * @param size map大小 + * @param keyEncoder Encodeable + * @param valueEncoder Encodeable + * @param obj 对象 */ - public abstract void writeMapB(int size); + public abstract void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj); /** * 输出一个Map中key与value间的间隔符 diff --git a/src/org/redkale/convert/bson/BsonReader.java b/src/org/redkale/convert/bson/BsonReader.java index 2507aea81..83a70e18c 100644 --- a/src/org/redkale/convert/bson/BsonReader.java +++ b/src/org/redkale/convert/bson/BsonReader.java @@ -202,13 +202,26 @@ public class BsonReader extends Reader { public final void readBlank() { } + @Override + public int position() { + return this.position; + } + + @Override + public int readMemberContentLength() { + return -1; + } + /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * + * @param startPosition 起始位置 + * @param contentLength 内容大小, 不确定的传-1 + * * @return 是否存在 */ @Override - public final boolean hasNext() { + public boolean hasNext(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) @@ -251,11 +264,17 @@ public class BsonReader extends Reader { @Override public final byte[] readByteArray() { int len = readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; byte[] data = new byte[8]; - while (hasNext()) { + int startPosition = position(); + while (hasNext(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/bson/BsonWriter.java b/src/org/redkale/convert/bson/BsonWriter.java index cee5b5616..e315b6c3b 100644 --- a/src/org/redkale/convert/bson/BsonWriter.java +++ b/src/org/redkale/convert/bson/BsonWriter.java @@ -131,7 +131,7 @@ public class BsonWriter extends Writer { writeNull(); return; } - writeArrayB(values.length); + writeArrayB(values.length, null, values); boolean flag = false; for (byte v : values) { if (flag) writeArrayMark(); @@ -284,7 +284,7 @@ public class BsonWriter extends Writer { } @Override - public final void writeArrayB(int size) { + public final void writeArrayB(int size, Encodeable encoder, Object obj) { writeInt(size); } @@ -297,8 +297,8 @@ public class BsonWriter extends Writer { } @Override - public void writeMapB(int size) { - writeArrayB(size); + public void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) { + writeArrayB(size, valueEncoder, obj); } @Override diff --git a/src/org/redkale/convert/ext/BoolArraySimpledCoder.java b/src/org/redkale/convert/ext/BoolArraySimpledCoder.java index 8f2db07c3..99d8c7c40 100644 --- a/src/org/redkale/convert/ext/BoolArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/BoolArraySimpledCoder.java @@ -29,7 +29,7 @@ public final class BoolArraySimpledCoder ext out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, BoolSimpledCoder.instance, values); boolean flag = false; for (boolean v : values) { if (flag) out.writeArrayMark(); @@ -42,11 +42,17 @@ public final class BoolArraySimpledCoder ext @Override public boolean[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; boolean[] data = new boolean[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 056a46980..8717c7813 100644 --- a/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java +++ b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java @@ -30,7 +30,7 @@ public final class ByteBufferSimpledCoder ex out.writeNull(); return; } - out.writeArrayB(value.remaining()); + out.writeArrayB(value.remaining(), ByteSimpledCoder.instance, value); boolean flag = false; for (byte v : value.array()) { if (flag) out.writeArrayMark(); @@ -43,11 +43,17 @@ public final class ByteBufferSimpledCoder ex @Override public ByteBuffer convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; byte[] data = new byte[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 8e01004a0..bafd025a4 100644 --- a/src/org/redkale/convert/ext/CharArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/CharArraySimpledCoder.java @@ -12,7 +12,9 @@ import org.redkale.convert.Writer; /** * char[] 的SimpledCoder实现 * - *

详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param Reader输入的子类型 * @param Writer输出的子类型 @@ -27,7 +29,7 @@ public final class CharArraySimpledCoder ext out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, CharSimpledCoder.instance, values); boolean flag = false; for (char v : values) { if (flag) out.writeArrayMark(); @@ -40,11 +42,17 @@ public final class CharArraySimpledCoder ext @Override public char[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; char[] data = new char[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 cb4114674..890371c52 100644 --- a/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java @@ -30,7 +30,7 @@ public final class DoubleArraySimpledCoder e out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, DoubleSimpledCoder.instance, values); boolean flag = false; for (double v : values) { if (flag) out.writeArrayMark(); @@ -43,11 +43,17 @@ public final class DoubleArraySimpledCoder e @Override public double[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; double[] data = new double[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 305c54160..8c7ecb6bc 100644 --- a/src/org/redkale/convert/ext/FloatArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/FloatArraySimpledCoder.java @@ -12,7 +12,9 @@ import org.redkale.convert.Writer; /** * float[] 的SimpledCoder实现 * - *

详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param Reader输入的子类型 * @param Writer输出的子类型 @@ -27,7 +29,7 @@ public final class FloatArraySimpledCoder ex out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, FloatSimpledCoder.instance, values); boolean flag = false; for (float v : values) { if (flag) out.writeArrayMark(); @@ -40,11 +42,17 @@ public final class FloatArraySimpledCoder ex @Override public float[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; float[] data = new float[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 932aec00c..e1fc3ce9d 100644 --- a/src/org/redkale/convert/ext/IntArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/IntArraySimpledCoder.java @@ -30,7 +30,7 @@ public final class IntArraySimpledCoder exte out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, IntSimpledCoder.instance, values); boolean flag = false; for (int v : values) { if (flag) out.writeArrayMark(); @@ -43,11 +43,17 @@ public final class IntArraySimpledCoder exte @Override public int[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; int[] data = new int[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 7cae9bd0c..14ed2ba84 100644 --- a/src/org/redkale/convert/ext/LongArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/LongArraySimpledCoder.java @@ -30,7 +30,7 @@ public final class LongArraySimpledCoder ext out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, LongSimpledCoder.instance, values); boolean flag = false; for (long v : values) { if (flag) out.writeArrayMark(); @@ -43,11 +43,17 @@ public final class LongArraySimpledCoder ext @Override public long[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; long[] data = new long[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 02d63a552..75085d598 100644 --- a/src/org/redkale/convert/ext/ShortArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/ShortArraySimpledCoder.java @@ -12,7 +12,9 @@ import org.redkale.convert.Writer; /** * short[] 的SimpledCoder实现 * - *

详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param Reader输入的子类型 * @param Writer输出的子类型 @@ -27,7 +29,7 @@ public final class ShortArraySimpledCoder ex out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, ShortSimpledCoder.instance, values); boolean flag = false; for (short v : values) { if (flag) out.writeArrayMark(); @@ -40,11 +42,17 @@ public final class ShortArraySimpledCoder ex @Override public short[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; short[] data = new short[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 629a28e0f..006ba46fc 100644 --- a/src/org/redkale/convert/ext/StringArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/StringArraySimpledCoder.java @@ -12,7 +12,9 @@ import org.redkale.convert.Writer; /** * String[] 的SimpledCoder实现 * - *

详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param Reader输入的子类型 * @param Writer输出的子类型 @@ -27,7 +29,7 @@ public final class StringArraySimpledCoder e out.writeNull(); return; } - out.writeArrayB(values.length); + out.writeArrayB(values.length, StringSimpledCoder.instance, values); boolean flag = false; for (String v : values) { if (flag) out.writeArrayMark(); @@ -40,11 +42,17 @@ public final class StringArraySimpledCoder e @Override public String[] convertFrom(R in) { int len = in.readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = in.readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; String[] data = new String[8]; - while (in.hasNext()) { + int startPosition = in.position(); + while (in.hasNext(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 38e27067e..0102f58b2 100644 --- a/src/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/org/redkale/convert/json/JsonByteBufferReader.java @@ -156,10 +156,13 @@ public class JsonByteBufferReader extends JsonReader { /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * + * @param startPosition 起始位置 + * @param contentLength 内容大小, 不确定的传-1 + * * @return 是否存在 */ @Override - public final boolean hasNext() { + public boolean hasNext(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 ba4621f4e..e367f0488 100644 --- a/src/org/redkale/convert/json/JsonReader.java +++ b/src/org/redkale/convert/json/JsonReader.java @@ -244,13 +244,26 @@ public class JsonReader extends Reader { throw new ConvertException("'" + new String(text) + "'expected a ':' but '" + ch + "'(position = " + position + ") in (" + new String(this.text) + ")"); } + @Override + public int position() { + return this.position; + } + + @Override + public int readMemberContentLength() { + return -1; + } + /** * 判断对象是否存在下一个属性或者数组是否存在下一个元素 * + * @param startPosition 起始位置 + * @param contentLength 内容大小, 不确定的传-1 + * * @return 是否存在 */ @Override - public boolean hasNext() { + public boolean hasNext(int startPosition, int contentLength) { char ch = this.text[++this.position]; if (ch == ',') return true; if (ch == '}' || ch == ']') return false; @@ -456,11 +469,17 @@ public class JsonReader extends Reader { @Override public final byte[] readByteArray() { int len = readArrayB(); + int contentLength = -1; if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENBUTBYTES) { + contentLength = readMemberContentLength(); + len = Reader.SIGN_NOLENGTH; + } if (len == Reader.SIGN_NOLENGTH) { int size = 0; byte[] data = new byte[8]; - while (hasNext()) { + int startPosition = position(); + while (hasNext(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/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index c6b37698a..ede29ea0b 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -194,7 +194,7 @@ public class JsonWriter extends Writer { writeNull(); return; } - writeArrayB(values.length); + writeArrayB(values.length, null, values); boolean flag = false; for (byte v : values) { if (flag) writeArrayMark(); @@ -345,7 +345,7 @@ public class JsonWriter extends Writer { } @Override - public final void writeArrayB(int size) { + public final void writeArrayB(int size, Encodeable encoder, Object obj) { writeTo('['); } @@ -360,7 +360,7 @@ public class JsonWriter extends Writer { } @Override - public final void writeMapB(int size) { + public final void writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) { writeTo('{'); }