From 47dab88d725e51552596658b8a1195b03d0c8269 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Tue, 27 Nov 2018 14:10:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4Convert=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=86=85=E9=83=A8=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/ArrayDecoder.java | 29 +++--- src/org/redkale/convert/ArrayEncoder.java | 18 ++-- .../redkale/convert/CollectionDecoder.java | 29 +++--- .../redkale/convert/CollectionEncoder.java | 23 +++-- src/org/redkale/convert/MapDecoder.java | 29 ++++-- src/org/redkale/convert/MapEncoder.java | 40 ++++---- src/org/redkale/convert/Reader.java | 15 +-- src/org/redkale/convert/StreamDecoder.java | 27 +++--- src/org/redkale/convert/StreamEncoder.java | 23 +++-- src/org/redkale/convert/Writer.java | 4 +- .../convert/bson/BsonByteBufferReader.java | 16 +++- src/org/redkale/convert/bson/BsonReader.java | 14 ++- src/org/redkale/convert/bson/BsonWriter.java | 10 +- .../convert/ext/BoolArraySimpledCoder.java | 2 +- .../convert/ext/ByteBufferSimpledCoder.java | 2 +- .../convert/ext/CharArraySimpledCoder.java | 2 +- .../convert/ext/DoubleArraySimpledCoder.java | 2 +- .../convert/ext/FloatArraySimpledCoder.java | 2 +- .../convert/ext/IntArraySimpledCoder.java | 2 +- .../convert/ext/LongArraySimpledCoder.java | 2 +- .../convert/ext/ShortArraySimpledCoder.java | 2 +- .../convert/ext/StringArraySimpledCoder.java | 2 +- .../convert/json/JsonByteBufferReader.java | 7 +- src/org/redkale/convert/json/JsonReader.java | 19 ++-- src/org/redkale/convert/json/JsonWriter.java | 2 +- .../redkale/test/convert/BsonTestMain.java | 3 +- test/org/redkale/test/convert/One.java | 63 ++++++++++++ test/org/redkale/test/convert/Two.java | 96 +++++++++++++++++++ 28 files changed, 353 insertions(+), 132 deletions(-) create mode 100644 test/org/redkale/test/convert/One.java create mode 100644 test/org/redkale/test/convert/Two.java diff --git a/src/org/redkale/convert/ArrayDecoder.java b/src/org/redkale/convert/ArrayDecoder.java index 940bedd50..ff6494e0a 100644 --- a/src/org/redkale/convert/ArrayDecoder.java +++ b/src/org/redkale/convert/ArrayDecoder.java @@ -28,7 +28,7 @@ public class ArrayDecoder implements Decodeable { protected final Class componentClass; - protected final Decodeable decoder; + protected final Decodeable componentDecoder; protected boolean inited = false; @@ -51,7 +51,7 @@ public class ArrayDecoder implements Decodeable { this.componentClass = (Class) this.componentType; } factory.register(type, this); - this.decoder = factory.loadDecoder(this.componentType); + this.componentDecoder = factory.loadDecoder(this.componentType); } finally { inited = true; synchronized (lock) { @@ -66,14 +66,15 @@ public class ArrayDecoder implements Decodeable { } public T[] convertFrom(Reader in, DeMember member) { - int len = in.readArrayB(member, decoder); + byte[] typevals = new byte[1]; + int len = in.readArrayB(member, typevals, componentDecoder); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, decoder); + contentLength = in.readMemberContentLength(member, componentDecoder); len = Reader.SIGN_NOLENGTH; } - if (this.decoder == null) { + if (this.componentDecoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -84,7 +85,7 @@ public class ArrayDecoder implements Decodeable { } } } - final Decodeable localdecoder = this.decoder; + final Decodeable localdecoder = getComponentDecoder(this.componentDecoder, typevals); final List result = new ArrayList(); boolean first = true; if (len == Reader.SIGN_NOLENGTH) { @@ -92,7 +93,7 @@ public class ArrayDecoder implements Decodeable { while (hasNext(in, member, startPosition, contentLength, first)) { Reader itemReader = getItemReader(in, member, first); if (itemReader == null) break; - result.add(readMemberValue(itemReader, member, first)); + result.add(readMemberValue(itemReader, member, localdecoder, first)); first = false; } } else { @@ -109,17 +110,21 @@ public class ArrayDecoder implements Decodeable { return in.hasNext(startPosition, contentLength); } + protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { + return decoder; + } + protected Reader getItemReader(Reader in, DeMember member, boolean first) { return in; } - protected T readMemberValue(Reader in, DeMember member, boolean first) { - return this.decoder.convertFrom(in); + protected T readMemberValue(Reader in, DeMember member, Decodeable decoder, boolean first) { + return decoder.convertFrom(in); } @Override public String toString() { - return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" + this.decoder + "}"; + return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" + this.componentDecoder + "}"; } @Override @@ -131,8 +136,8 @@ public class ArrayDecoder implements Decodeable { return componentType; } - public Decodeable getDecoder() { - return decoder; + public Decodeable getComponentDecoder() { + return componentDecoder; } } diff --git a/src/org/redkale/convert/ArrayEncoder.java b/src/org/redkale/convert/ArrayEncoder.java index ae1b92ea1..744592437 100644 --- a/src/org/redkale/convert/ArrayEncoder.java +++ b/src/org/redkale/convert/ArrayEncoder.java @@ -27,7 +27,7 @@ public class ArrayEncoder implements Encodeable { protected final Encodeable anyEncoder; - protected final Encodeable encoder; + protected final Encodeable componentEncoder; protected boolean inited = false; @@ -45,7 +45,7 @@ public class ArrayEncoder implements Encodeable { throw new ConvertException("(" + type + ") is not a array type"); } factory.register(type, this); - this.encoder = factory.loadEncoder(this.componentType); + this.componentEncoder = factory.loadEncoder(this.componentType); this.anyEncoder = factory.getAnyEncoder(); } finally { inited = true; @@ -66,11 +66,11 @@ public class ArrayEncoder implements Encodeable { return; } if (value.length == 0) { - out.writeArrayB(0, encoder, value); + out.writeArrayB(0, componentEncoder, value); out.writeArrayE(); return; } - if (this.encoder == null) { + if (this.componentEncoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -81,12 +81,12 @@ public class ArrayEncoder implements Encodeable { } } } - if (out.writeArrayB(value.length, encoder, value) < 0) { + if (out.writeArrayB(value.length, componentEncoder, value) < 0) { final Type comp = this.componentType; boolean first = true; for (Object v : value) { if (!first) out.writeArrayMark(); - writeMemberValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? encoder : anyEncoder), v, first); + writeMemberValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? componentEncoder : anyEncoder), v, first); if (first) first = false; } } @@ -99,7 +99,7 @@ public class ArrayEncoder implements Encodeable { @Override public String toString() { - return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.encoder + "}"; + return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.componentEncoder + "}"; } @Override @@ -111,8 +111,8 @@ public class ArrayEncoder implements Encodeable { return componentType; } - public Encodeable getEncoder() { - return encoder; + public Encodeable getComponentEncoder() { + return componentEncoder; } } diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index 79702685d..8bd6294d3 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -29,7 +29,7 @@ public class CollectionDecoder implements Decodeable> { protected Creator> creator; - protected final Decodeable decoder; + protected final Decodeable componentDecoder; protected boolean inited = false; @@ -43,12 +43,12 @@ public class CollectionDecoder implements Decodeable> { this.componentType = pt.getActualTypeArguments()[0]; this.creator = factory.loadCreator((Class) pt.getRawType()); factory.register(type, this); - this.decoder = factory.loadDecoder(this.componentType); + this.componentDecoder = factory.loadDecoder(this.componentType); } else if (factory.isReversible()) { this.componentType = Object.class; this.creator = factory.loadCreator(type instanceof Class ? (Class) type : Collection.class); factory.register(type, this); - this.decoder = factory.loadDecoder(this.componentType); + this.componentDecoder = factory.loadDecoder(this.componentType); } else { throw new ConvertException("CollectionDecoder not support the type (" + type + ")"); } @@ -66,14 +66,15 @@ public class CollectionDecoder implements Decodeable> { } public Collection convertFrom(Reader in, DeMember member) { - int len = in.readArrayB(member, decoder); + byte[] typevals = new byte[1]; + int len = in.readArrayB(member, typevals, componentDecoder); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, decoder); + contentLength = in.readMemberContentLength(member, componentDecoder); len = Reader.SIGN_NOLENGTH; } - if (this.decoder == null) { + if (this.componentDecoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -84,7 +85,7 @@ public class CollectionDecoder implements Decodeable> { } } } - final Decodeable localdecoder = this.decoder; + final Decodeable localdecoder = getComponentDecoder(this.componentDecoder, typevals); final Collection result = this.creator.create(); boolean first = true; if (len == Reader.SIGN_NOLENGTH) { @@ -92,7 +93,7 @@ public class CollectionDecoder implements Decodeable> { while (hasNext(in, member, startPosition, contentLength, first)) { Reader itemReader = getItemReader(in, member, first); if (itemReader == null) break; - result.add(readMemberValue(itemReader, member, first)); + result.add(readMemberValue(itemReader, member, localdecoder, first)); first = false; } } else { @@ -108,12 +109,16 @@ public class CollectionDecoder implements Decodeable> { return in.hasNext(startPosition, contentLength); } + protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { + return decoder; + } + protected Reader getItemReader(Reader in, DeMember member, boolean first) { return in; } - protected T readMemberValue(Reader in, DeMember member, boolean first) { - return this.decoder.convertFrom(in); + protected T readMemberValue(Reader in, DeMember member, Decodeable decoder, boolean first) { + return decoder.convertFrom(in); } @Override @@ -125,8 +130,8 @@ public class CollectionDecoder implements Decodeable> { return componentType; } - public Decodeable getDecoder() { - return decoder; + public Decodeable getComponentDecoder() { + return componentDecoder; } } diff --git a/src/org/redkale/convert/CollectionEncoder.java b/src/org/redkale/convert/CollectionEncoder.java index a15b77878..8a464ab2d 100644 --- a/src/org/redkale/convert/CollectionEncoder.java +++ b/src/org/redkale/convert/CollectionEncoder.java @@ -23,7 +23,7 @@ public class CollectionEncoder implements Encodeable> { protected final Type type; - protected final Encodeable encoder; + protected final Encodeable componentEncoder; protected boolean inited = false; @@ -35,12 +35,12 @@ public class CollectionEncoder implements Encodeable> { if (type instanceof ParameterizedType) { Type t = ((ParameterizedType) type).getActualTypeArguments()[0]; if (t instanceof TypeVariable) { - this.encoder = factory.getAnyEncoder(); + this.componentEncoder = factory.getAnyEncoder(); } else { - this.encoder = factory.loadEncoder(t); + this.componentEncoder = factory.loadEncoder(t); } } else { - this.encoder = factory.getAnyEncoder(); + this.componentEncoder = factory.getAnyEncoder(); } } finally { inited = true; @@ -61,11 +61,11 @@ public class CollectionEncoder implements Encodeable> { return; } if (value.isEmpty()) { - out.writeArrayB(0, encoder, value); + out.writeArrayB(0, componentEncoder, value); out.writeArrayE(); return; } - if (this.encoder == null) { + if (this.componentEncoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -76,7 +76,7 @@ public class CollectionEncoder implements Encodeable> { } } } - if (out.writeArrayB(value.size(), encoder, value) < 0) { + if (out.writeArrayB(value.size(), componentEncoder, value) < 0) { boolean first = true; for (Object v : value) { if (!first) out.writeArrayMark(); @@ -88,7 +88,7 @@ public class CollectionEncoder implements Encodeable> { } protected void writeValue(Writer out, EnMember member, Object value) { - encoder.convertTo(out, value); + componentEncoder.convertTo(out, value); } @Override @@ -96,8 +96,11 @@ public class CollectionEncoder implements Encodeable> { return type; } - public Encodeable getEncoder() { - return encoder; + public Encodeable getComponentEncoder() { + return componentEncoder; } + public Type getComponentType() { + return componentEncoder == null ? null : componentEncoder.getType(); + } } diff --git a/src/org/redkale/convert/MapDecoder.java b/src/org/redkale/convert/MapDecoder.java index e5d6fb552..c81145760 100644 --- a/src/org/redkale/convert/MapDecoder.java +++ b/src/org/redkale/convert/MapDecoder.java @@ -91,7 +91,8 @@ public class MapDecoder implements Decodeable> { } } } - int len = in.readMapB(member, this.keyDecoder); + byte[] typevals = new byte[2]; + int len = in.readMapB(member, typevals, this.keyDecoder, this.valueDecoder); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { @@ -100,22 +101,24 @@ public class MapDecoder implements Decodeable> { } 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)) { Reader entryReader = getEntryReader(in, member, first); if (entryReader == null) break; - K key = readKeyMember(entryReader, member, first); + K key = readKeyMember(entryReader, member, kdecoder, first); entryReader.readBlank(); - V value = readValueMember(entryReader, member, first); + V value = readValueMember(entryReader, member, vdecoder, first); result.put(key, value); first = false; } } else { for (int i = 0; i < len; i++) { - K key = readKeyMember(in, member, first); + K key = readKeyMember(in, member, kdecoder, first); in.readBlank(); - V value = readValueMember(in, member, first); + V value = readValueMember(in, member, vdecoder, first); result.put(key, value); first = false; } @@ -128,16 +131,24 @@ public class MapDecoder implements Decodeable> { return in.hasNext(startPosition, contentLength); } + protected Decodeable getKeyDecoder(Decodeable decoder, byte[] typevals) { + return decoder; + } + + protected Decodeable getValueDecoder(Decodeable decoder, byte[] typevals) { + return decoder; + } + protected Reader getEntryReader(Reader in, DeMember member, boolean first) { return in; } - protected K readKeyMember(Reader in, DeMember member, boolean first) { - return keyDecoder.convertFrom(in); + protected K readKeyMember(Reader in, DeMember member, Decodeable decoder, boolean first) { + return decoder.convertFrom(in); } - protected V readValueMember(Reader in, DeMember member, boolean first) { - return valueDecoder.convertFrom(in); + protected V readValueMember(Reader in, DeMember member, Decodeable decoder, boolean first) { + return decoder.convertFrom(in); } @Override diff --git a/src/org/redkale/convert/MapEncoder.java b/src/org/redkale/convert/MapEncoder.java index 127197857..613d392f7 100644 --- a/src/org/redkale/convert/MapEncoder.java +++ b/src/org/redkale/convert/MapEncoder.java @@ -24,9 +24,9 @@ public class MapEncoder implements Encodeable> { protected final Type type; - protected final Encodeable keyencoder; + protected final Encodeable keyEncoder; - protected final Encodeable valencoder; + protected final Encodeable valueEncoder; protected boolean inited = false; @@ -37,11 +37,11 @@ public class MapEncoder implements Encodeable> { try { if (type instanceof ParameterizedType) { final Type[] pt = ((ParameterizedType) type).getActualTypeArguments(); - this.keyencoder = factory.loadEncoder(pt[0]); - this.valencoder = factory.loadEncoder(pt[1]); + this.keyEncoder = factory.loadEncoder(pt[0]); + this.valueEncoder = factory.loadEncoder(pt[1]); } else { - this.keyencoder = factory.getAnyEncoder(); - this.valencoder = factory.getAnyEncoder(); + this.keyEncoder = factory.getAnyEncoder(); + this.valueEncoder = factory.getAnyEncoder(); } } finally { inited = true; @@ -63,7 +63,7 @@ public class MapEncoder implements Encodeable> { return; } - if (this.keyencoder == null || this.valencoder == null) { + if (this.keyEncoder == null || this.valueEncoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -74,21 +74,21 @@ public class MapEncoder implements Encodeable> { } } } - if (out.writeMapB(values.size(), (Encodeable) keyencoder, (Encodeable) valencoder, value) < 0) { + if (out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value) < 0) { boolean first = true; for (Map.Entry en : values.entrySet()) { if (!first) out.writeArrayMark(); - writeMemberValue(out, member, en.getKey(), en.getValue(),first); + writeMemberValue(out, member, en.getKey(), en.getValue(), first); if (first) first = false; } } out.writeMapE(); } - protected void writeMemberValue(Writer out, EnMember member, K key, V value,boolean first) { - keyencoder.convertTo(out, key); + protected void writeMemberValue(Writer out, EnMember member, K key, V value, boolean first) { + keyEncoder.convertTo(out, key); out.writeMapMark(); - valencoder.convertTo(out, value); + valueEncoder.convertTo(out, value); } @Override @@ -96,12 +96,20 @@ public class MapEncoder implements Encodeable> { return type; } - public Encodeable getKeyencoder() { - return keyencoder; + public Type getKeyType() { + return keyEncoder == null ? null : keyEncoder.getType(); } - public Encodeable getValencoder() { - return valencoder; + public Type getValueType() { + return valueEncoder == null ? null : valueEncoder.getType(); + } + + public Encodeable getKeyEncoder() { + return keyEncoder; + } + + public Encodeable getValueEncoder() { + return valueEncoder; } } diff --git a/src/org/redkale/convert/Reader.java b/src/org/redkale/convert/Reader.java index b20264008..7aaedf689 100644 --- a/src/org/redkale/convert/Reader.java +++ b/src/org/redkale/convert/Reader.java @@ -95,12 +95,13 @@ public abstract class Reader { /** * 读取数组的开头并返回数组的长度 * - * @param member DeMember - * @param decoder Decodeable + * @param member DeMember + * @param typevals byte[] + * @param componentDecoder Decodeable * * @return 返回数组的长度 */ - public abstract int readArrayB(DeMember member, Decodeable decoder); + public abstract int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder); /** * 读取数组的尾端 @@ -111,12 +112,14 @@ public abstract class Reader { /** * 读取map的开头并返回map的size * - * @param member DeMember - * @param keydecoder Decodeable + * @param member DeMember + * @param typevals byte[] + * @param keyDecoder Decodeable + * @param valueDecoder Decodeable * * @return 返回map的size */ - public abstract int readMapB(DeMember member, Decodeable keydecoder); + public abstract int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder); /** * 读取数组的尾端 diff --git a/src/org/redkale/convert/StreamDecoder.java b/src/org/redkale/convert/StreamDecoder.java index 7c07c4b02..316d3a0d8 100644 --- a/src/org/redkale/convert/StreamDecoder.java +++ b/src/org/redkale/convert/StreamDecoder.java @@ -30,7 +30,7 @@ public class StreamDecoder implements Decodeable> { protected Creator> creator; - protected final Decodeable decoder; + protected final Decodeable componentDecoder; protected boolean inited = false; @@ -44,7 +44,7 @@ public class StreamDecoder implements Decodeable> { this.componentType = pt.getActualTypeArguments()[0]; this.creator = factory.loadCreator((Class) pt.getRawType()); factory.register(type, this); - this.decoder = factory.loadDecoder(this.componentType); + this.componentDecoder = factory.loadDecoder(this.componentType); } else { throw new ConvertException("StreamDecoder not support the type (" + type + ")"); } @@ -62,14 +62,15 @@ public class StreamDecoder implements Decodeable> { } public Stream convertFrom(Reader in, DeMember member) { - int len = in.readArrayB(member, this.decoder); + byte[] typevals = new byte[1]; + int len = in.readArrayB(member, typevals, this.componentDecoder); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { - contentLength = in.readMemberContentLength(member, this.decoder); + contentLength = in.readMemberContentLength(member, this.componentDecoder); len = Reader.SIGN_NOLENGTH; } - if (this.decoder == null) { + if (this.componentDecoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -80,7 +81,7 @@ public class StreamDecoder implements Decodeable> { } } } - final Decodeable localdecoder = this.decoder; + final Decodeable localdecoder = getComponentDecoder(this.componentDecoder, typevals); final List result = new ArrayList(); boolean first = true; if (len == Reader.SIGN_NOLENGTH) { @@ -88,7 +89,7 @@ public class StreamDecoder implements Decodeable> { while (hasNext(in, member, startPosition, contentLength, first)) { Reader itemReader = getItemReader(in, member, first); if (itemReader == null) break; - result.add(readMemberValue(itemReader, member, first)); + result.add(readMemberValue(itemReader, member, localdecoder, first)); first = false; } } else { @@ -104,12 +105,16 @@ public class StreamDecoder implements Decodeable> { return in.hasNext(startPosition, contentLength); } + protected Decodeable getComponentDecoder(Decodeable decoder, byte[] typevals) { + return decoder; + } + protected Reader getItemReader(Reader in, DeMember member, boolean first) { return in; } - protected T readMemberValue(Reader in, DeMember member, boolean first) { - return this.decoder.convertFrom(in); + protected T readMemberValue(Reader in, DeMember member, Decodeable decoder, boolean first) { + return decoder.convertFrom(in); } @Override @@ -121,8 +126,8 @@ public class StreamDecoder implements Decodeable> { return componentType; } - public Decodeable getDecoder() { - return decoder; + public Decodeable getComponentDecoder() { + return componentDecoder; } } diff --git a/src/org/redkale/convert/StreamEncoder.java b/src/org/redkale/convert/StreamEncoder.java index 7ee43e686..8dad42153 100644 --- a/src/org/redkale/convert/StreamEncoder.java +++ b/src/org/redkale/convert/StreamEncoder.java @@ -23,7 +23,7 @@ public class StreamEncoder implements Encodeable> { protected final Type type; - protected final Encodeable encoder; + protected final Encodeable componentEncoder; protected boolean inited = false; @@ -35,12 +35,12 @@ public class StreamEncoder implements Encodeable> { if (type instanceof ParameterizedType) { Type t = ((ParameterizedType) type).getActualTypeArguments()[0]; if (t instanceof TypeVariable) { - this.encoder = factory.getAnyEncoder(); + this.componentEncoder = factory.getAnyEncoder(); } else { - this.encoder = factory.loadEncoder(t); + this.componentEncoder = factory.loadEncoder(t); } } else { - this.encoder = factory.getAnyEncoder(); + this.componentEncoder = factory.getAnyEncoder(); } } finally { inited = true; @@ -62,11 +62,11 @@ public class StreamEncoder implements Encodeable> { } Object[] array = value.toArray(); if (array.length == 0) { - out.writeArrayB(0, encoder, array); + out.writeArrayB(0, componentEncoder, array); out.writeArrayE(); return; } - if (this.encoder == null) { + if (this.componentEncoder == null) { if (!this.inited) { synchronized (lock) { try { @@ -77,7 +77,7 @@ public class StreamEncoder implements Encodeable> { } } } - if (out.writeArrayB(array.length, encoder, array) < 0) { + if (out.writeArrayB(array.length, componentEncoder, array) < 0) { boolean first = true; for (Object v : array) { if (!first) out.writeArrayMark(); @@ -89,7 +89,7 @@ public class StreamEncoder implements Encodeable> { } protected void writeMemberValue(Writer out, EnMember member, Object value, boolean first) { - encoder.convertTo(out, value); + componentEncoder.convertTo(out, value); } @Override @@ -97,8 +97,11 @@ public class StreamEncoder implements Encodeable> { return type; } - public Encodeable getEncoder() { - return encoder; + public Encodeable getComponentEncoder() { + return componentEncoder; } + public Type getComponentType() { + return componentEncoder == null ? null : componentEncoder.getType(); + } } diff --git a/src/org/redkale/convert/Writer.java b/src/org/redkale/convert/Writer.java index 0ca5f39a8..845846f0d 100644 --- a/src/org/redkale/convert/Writer.java +++ b/src/org/redkale/convert/Writer.java @@ -130,12 +130,12 @@ public abstract class Writer { * 输出一个数组前的操作 * * @param size 数组长度 - * @param encoder Encodeable + * @param componentEncoder Encodeable * @param obj 对象 * * @return 返回-1表示还没有写入对象内容,大于-1表示已写入对象内容,返回对象内容大小 */ - public abstract int writeArrayB(int size, Encodeable encoder, Object obj); + public abstract int writeArrayB(int size, Encodeable componentEncoder, Object obj); /** * 输出数组元素间的间隔符 diff --git a/src/org/redkale/convert/bson/BsonByteBufferReader.java b/src/org/redkale/convert/bson/BsonByteBufferReader.java index 98f2a7c70..06600b90f 100644 --- a/src/org/redkale/convert/bson/BsonByteBufferReader.java +++ b/src/org/redkale/convert/bson/BsonByteBufferReader.java @@ -48,15 +48,25 @@ public class BsonByteBufferReader extends BsonReader { return mask == null ? currentBuffer.get(currentBuffer.position()) : mask.unmask(currentBuffer.get(currentBuffer.position())); } + @Override + public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) { + short bt = readShort(); + if (bt == Reader.SIGN_NULL) return bt; + short lt = readShort(); + return (bt & 0xffff) << 16 | (lt & 0xffff); + } + /** * 判断下一个非空白字节是否为[ * - * @param member DeMember - * @param decoder Decodeable + * @param member DeMember + * @param typevals byte[] + * @param componentDecoder Decodeable + * * @return 数组长度或 SIGN_NULL */ @Override - public final int readArrayB(DeMember member, Decodeable decoder) { + public final int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { short bt = readShort(); if (bt == Reader.SIGN_NULL) return bt; short lt = readShort(); diff --git a/src/org/redkale/convert/bson/BsonReader.java b/src/org/redkale/convert/bson/BsonReader.java index cb885752a..06897eaae 100644 --- a/src/org/redkale/convert/bson/BsonReader.java +++ b/src/org/redkale/convert/bson/BsonReader.java @@ -231,8 +231,10 @@ public class BsonReader extends Reader { } @Override - public final int readMapB(DeMember member, Decodeable keydecoder) { - return readArrayB(member, keydecoder); + public int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valueDecoder) { + short bt = readShort(); + if (bt == Reader.SIGN_NULL) return bt; + return (bt & 0xffff) << 16 | ((content[++this.position] & 0xff) << 8) | (content[++this.position] & 0xff); } @Override @@ -245,10 +247,12 @@ public class BsonReader extends Reader { * @return 数组长度或SIGN_NULL */ @Override - public int readArrayB(DeMember member, Decodeable decoder) { + public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { //componentDecoder可能为null short bt = readShort(); if (bt == Reader.SIGN_NULL) return bt; - return (bt & 0xffff) << 16 | ((content[++this.position] & 0xff) << 8) | (content[++this.position] & 0xff); + int rs = (bt & 0xffff) << 16 | ((content[++this.position] & 0xff) << 8) | (content[++this.position] & 0xff); + if (componentDecoder == null || componentDecoder == ByteSimpledCoder.instance) return rs; //byte[] + return rs; } @Override @@ -323,7 +327,7 @@ public class BsonReader extends Reader { @Override public final byte[] readByteArray() { - int len = readArrayB(null, null); + int len = readArrayB(null, null, null); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/bson/BsonWriter.java b/src/org/redkale/convert/bson/BsonWriter.java index 76998c118..660b02e41 100644 --- a/src/org/redkale/convert/bson/BsonWriter.java +++ b/src/org/redkale/convert/bson/BsonWriter.java @@ -241,7 +241,7 @@ public class BsonWriter extends Writer { typeval = 109; } if (typeval == 127 && member.getEncoder() instanceof CollectionEncoder) { - java.lang.reflect.Type comType = ((CollectionEncoder) member.getEncoder()).getEncoder().getType(); + java.lang.reflect.Type comType = ((CollectionEncoder) member.getEncoder()).getComponentEncoder().getType(); if (comType == Boolean.class) { typeval = 21; } else if (comType == Byte.class) { @@ -268,8 +268,8 @@ public class BsonWriter extends Writer { typeval = 20; } if (typeval == 127 && member.getEncoder() instanceof MapEncoder) { - java.lang.reflect.Type keyType = ((MapEncoder) member.getEncoder()).getKeyencoder().getType(); - java.lang.reflect.Type valType = ((MapEncoder) member.getEncoder()).getValencoder().getType(); + java.lang.reflect.Type keyType = ((MapEncoder) member.getEncoder()).getKeyEncoder().getType(); + java.lang.reflect.Type valType = ((MapEncoder) member.getEncoder()).getValueEncoder().getType(); if (keyType == String.class && valType == Boolean.class) { typeval = 41; } else if (keyType == String.class && valType == Byte.class) { @@ -337,7 +337,7 @@ public class BsonWriter extends Writer { } @Override - public final int writeArrayB(int size, Encodeable encoder, Object obj) { + public final int writeArrayB(int size, Encodeable componentEncoder, Object obj) { writeInt(size); return -1; } @@ -352,7 +352,7 @@ public class BsonWriter extends Writer { @Override public int writeMapB(int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) { - writeArrayB(size, valueEncoder, obj); + writeInt(size); return -1; } diff --git a/src/org/redkale/convert/ext/BoolArraySimpledCoder.java b/src/org/redkale/convert/ext/BoolArraySimpledCoder.java index 64e1271ea..b9e1a824e 100644 --- a/src/org/redkale/convert/ext/BoolArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/BoolArraySimpledCoder.java @@ -42,7 +42,7 @@ public final class BoolArraySimpledCoder ext @Override public boolean[] convertFrom(R in) { - int len = in.readArrayB(null, BoolSimpledCoder.instance); + int len = in.readArrayB(null, null, BoolSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java index 99bb5b0ef..ab3a4d345 100644 --- a/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java +++ b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java @@ -43,7 +43,7 @@ public final class ByteBufferSimpledCoder ex @Override public ByteBuffer convertFrom(R in) { - int len = in.readArrayB(null, ByteSimpledCoder.instance); + int len = in.readArrayB(null, null, ByteSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/CharArraySimpledCoder.java b/src/org/redkale/convert/ext/CharArraySimpledCoder.java index 5f738aa59..7a2a1c1a9 100644 --- a/src/org/redkale/convert/ext/CharArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/CharArraySimpledCoder.java @@ -42,7 +42,7 @@ public final class CharArraySimpledCoder ext @Override public char[] convertFrom(R in) { - int len = in.readArrayB(null, CharSimpledCoder.instance); + int len = in.readArrayB(null, null, CharSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java b/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java index 5b9f7cd0c..9807753a9 100644 --- a/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java @@ -43,7 +43,7 @@ public final class DoubleArraySimpledCoder e @Override public double[] convertFrom(R in) { - int len = in.readArrayB(null, DoubleSimpledCoder.instance); + int len = in.readArrayB(null, null, DoubleSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/FloatArraySimpledCoder.java b/src/org/redkale/convert/ext/FloatArraySimpledCoder.java index f1963c84d..8bd9b8720 100644 --- a/src/org/redkale/convert/ext/FloatArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/FloatArraySimpledCoder.java @@ -42,7 +42,7 @@ public final class FloatArraySimpledCoder ex @Override public float[] convertFrom(R in) { - int len = in.readArrayB(null, FloatSimpledCoder.instance); + int len = in.readArrayB(null, null, FloatSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/IntArraySimpledCoder.java b/src/org/redkale/convert/ext/IntArraySimpledCoder.java index c72cf841f..1082fa686 100644 --- a/src/org/redkale/convert/ext/IntArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/IntArraySimpledCoder.java @@ -43,7 +43,7 @@ public final class IntArraySimpledCoder exte @Override public int[] convertFrom(R in) { - int len = in.readArrayB(null, IntSimpledCoder.instance); + int len = in.readArrayB(null, null, IntSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/LongArraySimpledCoder.java b/src/org/redkale/convert/ext/LongArraySimpledCoder.java index d5017ccca..415518b0f 100644 --- a/src/org/redkale/convert/ext/LongArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/LongArraySimpledCoder.java @@ -43,7 +43,7 @@ public final class LongArraySimpledCoder ext @Override public long[] convertFrom(R in) { - int len = in.readArrayB(null, LongSimpledCoder.instance); + int len = in.readArrayB(null, null, LongSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/ShortArraySimpledCoder.java b/src/org/redkale/convert/ext/ShortArraySimpledCoder.java index 8b5b48079..93bf64eaa 100644 --- a/src/org/redkale/convert/ext/ShortArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/ShortArraySimpledCoder.java @@ -42,7 +42,7 @@ public final class ShortArraySimpledCoder ex @Override public short[] convertFrom(R in) { - int len = in.readArrayB(null, ShortSimpledCoder.instance); + int len = in.readArrayB(null, null, ShortSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/ext/StringArraySimpledCoder.java b/src/org/redkale/convert/ext/StringArraySimpledCoder.java index aa109989d..e358cc051 100644 --- a/src/org/redkale/convert/ext/StringArraySimpledCoder.java +++ b/src/org/redkale/convert/ext/StringArraySimpledCoder.java @@ -44,7 +44,7 @@ public final class StringArraySimpledCoder e } public String[] convertFrom(R in, DeMember member) { - int len = in.readArrayB(member, StringSimpledCoder.instance); + int len = in.readArrayB(member, null, StringSimpledCoder.instance); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/json/JsonByteBufferReader.java b/src/org/redkale/convert/json/JsonByteBufferReader.java index 4c009d547..9760d7203 100644 --- a/src/org/redkale/convert/json/JsonByteBufferReader.java +++ b/src/org/redkale/convert/json/JsonByteBufferReader.java @@ -139,13 +139,14 @@ public class JsonByteBufferReader extends JsonReader { /** * 判断下一个非空白字符是否为[ * - * @param member DeMember - * @param decoder Decodeable + * @param member DeMember + * @param typevals byte[] + * @param decoder Decodeable * * @return SIGN_NOLENGTH 或 SIGN_NULL */ @Override - public final int readArrayB(DeMember member, Decodeable decoder) { + public final int readArrayB(DeMember member, byte[] typevals, Decodeable decoder) { char ch = nextGoodChar(); if (ch == '[' || ch == '{') return SIGN_NOLENGTH; if (ch == 'n' && nextChar() == 'u' && nextChar() == 'l' && nextChar() == 'l') return SIGN_NULL; diff --git a/src/org/redkale/convert/json/JsonReader.java b/src/org/redkale/convert/json/JsonReader.java index c07a08e07..028e1b938 100644 --- a/src/org/redkale/convert/json/JsonReader.java +++ b/src/org/redkale/convert/json/JsonReader.java @@ -189,14 +189,16 @@ public class JsonReader extends Reader { /** * 判断下一个非空白字符是否为{ * - * @param member DeMember - * @param keydecoder Decodeable + * @param member DeMember + * @param typevals byte[] + * @param keyDecoder Decodeable + * @param valuedecoder Decodeable * * @return SIGN_NOLENGTH 或 SIGN_NULL */ @Override - public final int readMapB(DeMember member, Decodeable keydecoder) { - return readArrayB(member, keydecoder); + public final int readMapB(DeMember member, byte[] typevals, Decodeable keyDecoder, Decodeable valuedecoder) { + return readArrayB(member, typevals, keyDecoder); } @Override @@ -206,13 +208,14 @@ public class JsonReader extends Reader { /** * 判断下一个非空白字符是否为[ * - * @param member DeMember - * @param decoder Decodeable + * @param member DeMember + * @param typevals byte[] + * @param componentDecoder Decodeable * * @return SIGN_NOLENGTH 或 SIGN_NULL */ @Override - public int readArrayB(DeMember member, Decodeable decoder) { + public int readArrayB(DeMember member, byte[] typevals, Decodeable componentDecoder) { char ch = this.text[++this.position]; if (ch == '[') return SIGN_NOLENGTH; if (ch == '{') return SIGN_NOLENGTH; @@ -474,7 +477,7 @@ public class JsonReader extends Reader { @Override public final byte[] readByteArray() { - int len = readArrayB(null, null); + int len = readArrayB(null, null, null); int contentLength = -1; if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NOLENBUTBYTES) { diff --git a/src/org/redkale/convert/json/JsonWriter.java b/src/org/redkale/convert/json/JsonWriter.java index f15323ec6..a5d675b0a 100644 --- a/src/org/redkale/convert/json/JsonWriter.java +++ b/src/org/redkale/convert/json/JsonWriter.java @@ -346,7 +346,7 @@ public class JsonWriter extends Writer { } @Override - public final int writeArrayB(int size, Encodeable encoder, Object obj) { + public final int writeArrayB(int size, Encodeable componentEncoder, Object obj) { writeTo('['); return -1; } diff --git a/test/org/redkale/test/convert/BsonTestMain.java b/test/org/redkale/test/convert/BsonTestMain.java index b2ccf6aa7..c8e89afa9 100644 --- a/test/org/redkale/test/convert/BsonTestMain.java +++ b/test/org/redkale/test/convert/BsonTestMain.java @@ -21,13 +21,14 @@ import org.redkale.util.*; */ public class BsonTestMain { - public static void main(String[] args) throws Exception { + public static void main(String[] args) throws Throwable { Serializable[] sers = new Serializable[]{"aaa", 4}; final BsonConvert convert = BsonFactory.root().getConvert(); byte[] bytes = convert.convertTo(sers); Utility.println("---", bytes); Serializable[] a = convert.convertFrom(Serializable[].class, bytes); System.out.println(Arrays.toString(a)); + Two.main(args); main2(args); main3(args); main4(args); diff --git a/test/org/redkale/test/convert/One.java b/test/org/redkale/test/convert/One.java new file mode 100644 index 000000000..8ef3b1de1 --- /dev/null +++ b/test/org/redkale/test/convert/One.java @@ -0,0 +1,63 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.test.convert; + +import org.redkale.convert.json.JsonConvert; + +/** + * + * @author zhangjx + */ +public class One { + + protected String key; + + protected int code; + + protected byte[] bytes = new byte[]{3, 4, 5}; + + protected int[] ints = new int[]{3000, 4000, 5000}; + + public One(int code) { + this.code = code; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public byte[] getBytes() { + return bytes; + } + + public void setBytes(byte[] bytes) { + this.bytes = bytes; + } + + public int[] getInts() { + return ints; + } + + public void setInts(int[] ints) { + this.ints = ints; + } + + public String toString() { + return JsonConvert.root().convertTo(this); + } +} diff --git a/test/org/redkale/test/convert/Two.java b/test/org/redkale/test/convert/Two.java new file mode 100644 index 000000000..a67e244d0 --- /dev/null +++ b/test/org/redkale/test/convert/Two.java @@ -0,0 +1,96 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.test.convert; + +import java.util.*; +import org.redkale.convert.bson.BsonFactory; + +/** + * + * @author zhangjx + */ +public class Two extends One { + + public Two() { + super(90100119); + } + + protected List list; + + protected Map stringMap; + + protected List records; + + protected Map recordMap; + + public Map getStringMap() { + return stringMap; + } + + public void setStringMap(Map stringMap) { + this.stringMap = stringMap; + } + + String ip; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public Map getRecordMap() { + return recordMap; + } + + public void setRecordMap(Map recordMap) { + this.recordMap = recordMap; + } + + public static void main(String[] args) throws Throwable { + Two two = new Two(); + two.setKey("key111"); + two.setCode(12345); + List list = new ArrayList<>(); + list.add("haha"); + two.setList(list); + Map map = new HashMap<>(); + map.put("222", "333"); + two.setStringMap(map); + + List records = new ArrayList<>(); + records.add(ConvertRecord.createDefault()); + two.setRecords(records); + + Map rmap = new HashMap<>(); + rmap.put("222", ConvertRecord.createDefault()); + two.setRecordMap(rmap); + + byte[] bs = BsonFactory.root().getConvert().convertTo(two); + + One one =BsonFactory.root().getConvert().convertFrom(One.class, bs); + System.out.println(one); + } + +} \ No newline at end of file