diff --git a/src/org/redkale/convert/ArrayDecoder.java b/src/org/redkale/convert/ArrayDecoder.java index 464adb63f..e274ef193 100644 --- a/src/org/redkale/convert/ArrayDecoder.java +++ b/src/org/redkale/convert/ArrayDecoder.java @@ -96,7 +96,6 @@ public class ArrayDecoder implements Decodeable { } else { for (int i = 0; i < len; i++) { result.add(localdecoder.convertFrom(in)); - first = false; } } in.readArrayE(); diff --git a/src/org/redkale/convert/ArrayEncoder.java b/src/org/redkale/convert/ArrayEncoder.java index 9a051c6b4..ae1b92ea1 100644 --- a/src/org/redkale/convert/ArrayEncoder.java +++ b/src/org/redkale/convert/ArrayEncoder.java @@ -86,14 +86,14 @@ public class ArrayEncoder implements Encodeable { boolean first = true; for (Object v : value) { if (!first) out.writeArrayMark(); - writeValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? encoder : anyEncoder), v); + writeMemberValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? encoder : anyEncoder), v, first); if (first) first = false; } } out.writeArrayE(); } - protected void writeValue(Writer out, EnMember member, Encodeable encoder, Object value) { + protected void writeMemberValue(Writer out, EnMember member, Encodeable encoder, Object value, boolean first) { encoder.convertTo(out, value); } diff --git a/src/org/redkale/convert/CollectionDecoder.java b/src/org/redkale/convert/CollectionDecoder.java index a7e64543a..b42e4fe0f 100644 --- a/src/org/redkale/convert/CollectionDecoder.java +++ b/src/org/redkale/convert/CollectionDecoder.java @@ -86,11 +86,12 @@ public class CollectionDecoder implements Decodeable> { } final Decodeable localdecoder = this.decoder; final Collection result = this.creator.create(); + boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); while (in.hasNext(startPosition, contentLength)) { - readMember(in, member); - result.add(localdecoder.convertFrom(in)); + result.add(readMemberValue(in, member, first)); + first = false; } } else { for (int i = 0; i < len; i++) { @@ -101,7 +102,8 @@ public class CollectionDecoder implements Decodeable> { return result; } - protected void readMember(Reader in, DeMember member) { + protected T readMemberValue(Reader in, DeMember member, boolean first) { + return this.decoder.convertFrom(in); } @Override diff --git a/src/org/redkale/convert/MapDecoder.java b/src/org/redkale/convert/MapDecoder.java index cec99de44..500c88dff 100644 --- a/src/org/redkale/convert/MapDecoder.java +++ b/src/org/redkale/convert/MapDecoder.java @@ -99,34 +99,35 @@ public class MapDecoder implements Decodeable> { len = Reader.SIGN_NOLENGTH; } final Map result = this.creator.create(); + boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); while (in.hasNext(startPosition, contentLength)) { - readKeyMember(in, member); - K key = keyDecoder.convertFrom(in); + K key = readKeyMember(in, member, first); in.readBlank(); - readValueMember(in, member); - V value = valueDecoder.convertFrom(in); + V value = readValueMember(in, member, first); result.put(key, value); + first = false; } } else { for (int i = 0; i < len; i++) { - readKeyMember(in, member); - K key = keyDecoder.convertFrom(in); + K key = readKeyMember(in, member, first); in.readBlank(); - readValueMember(in, member); - V value = valueDecoder.convertFrom(in); + V value = readValueMember(in, member, first); result.put(key, value); + first = false; } } in.readMapE(); return result; } - protected void readKeyMember(Reader in, DeMember member) { + protected K readKeyMember(Reader in, DeMember member, boolean first) { + return keyDecoder.convertFrom(in); } - protected void readValueMember(Reader in, DeMember member) { + protected V readValueMember(Reader in, DeMember member, boolean first) { + return valueDecoder.convertFrom(in); } @Override diff --git a/src/org/redkale/convert/MapEncoder.java b/src/org/redkale/convert/MapEncoder.java index 9809c3745..127197857 100644 --- a/src/org/redkale/convert/MapEncoder.java +++ b/src/org/redkale/convert/MapEncoder.java @@ -78,20 +78,16 @@ public class MapEncoder implements Encodeable> { boolean first = true; for (Map.Entry en : values.entrySet()) { if (!first) out.writeArrayMark(); - writeKey(out, member, en.getKey()); - out.writeMapMark(); - writeValue(out, member, en.getValue()); + writeMemberValue(out, member, en.getKey(), en.getValue(),first); if (first) first = false; } } out.writeMapE(); } - protected void writeKey(Writer out, EnMember member, K key) { + protected void writeMemberValue(Writer out, EnMember member, K key, V value,boolean first) { keyencoder.convertTo(out, key); - } - - protected void writeValue(Writer out, EnMember member, V value) { + out.writeMapMark(); valencoder.convertTo(out, value); } diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index 11bf863da..19c81ddae 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -221,15 +221,17 @@ public class ObjectDecoder implements Decodeable { } if (this.creatorConstructorMembers == null) { //空构造函数 final T result = this.creator.create(); + boolean first = true; while (hasNext(in)) { DeMember member = in.readFieldName(members); in.readBlank(); if (member == null) { in.skipValue(); //跳过不存在的属性的值 } else { - readMemberValue(in, member, result); + readMemberValue(in, member, result, first); } } + first = false; in.readObjectE(typeClass); return result; } else { //带参数的构造函数 @@ -237,13 +239,14 @@ public class ObjectDecoder implements Decodeable { final Object[] constructorParams = new Object[fields.length]; final Object[][] otherParams = new Object[this.members.length][2]; int oc = 0; + boolean first = true; while (hasNext(in)) { DeMember member = in.readFieldName(members); in.readBlank(); if (member == null) { in.skipValue(); //跳过不存在的属性的值 } else { - Object val = readMemberValue(in, member); + Object val = readMemberValue(in, member, first); boolean flag = true; for (int i = 0; i < fields.length; i++) { if (member == fields[i]) { @@ -253,7 +256,9 @@ public class ObjectDecoder implements Decodeable { } } if (flag) otherParams[oc++] = new Object[]{member.attribute, val}; + } + first = false; } in.readObjectE(typeClass); final T result = this.creator.create(constructorParams); @@ -268,11 +273,11 @@ public class ObjectDecoder implements Decodeable { return in.hasNext(); } - protected Object readMemberValue(R in, DeMember member) { + protected Object readMemberValue(R in, DeMember member, boolean first) { return member.read(in); } - protected void readMemberValue(R in, DeMember member, T result) { + protected void readMemberValue(R in, DeMember member, T result, boolean first) { member.read(in, result); } diff --git a/src/org/redkale/convert/StreamDecoder.java b/src/org/redkale/convert/StreamDecoder.java index 658728147..d84190e21 100644 --- a/src/org/redkale/convert/StreamDecoder.java +++ b/src/org/redkale/convert/StreamDecoder.java @@ -82,11 +82,12 @@ public class StreamDecoder implements Decodeable> { } final Decodeable localdecoder = this.decoder; final List result = new ArrayList(); + boolean first = true; if (len == Reader.SIGN_NOLENGTH) { int startPosition = in.position(); while (in.hasNext(startPosition, contentLength)) { - readMember(in, member); - result.add(localdecoder.convertFrom(in)); + result.add(readMemberValue(in, member, first)); + first = false; } } else { for (int i = 0; i < len; i++) { @@ -97,7 +98,8 @@ public class StreamDecoder implements Decodeable> { return result.stream(); } - protected void readMember(Reader in, DeMember member) { + protected T readMemberValue(Reader in, DeMember member, boolean first) { + return this.decoder.convertFrom(in); } @Override diff --git a/src/org/redkale/convert/StreamEncoder.java b/src/org/redkale/convert/StreamEncoder.java index 58ccd48cf..7ee43e686 100644 --- a/src/org/redkale/convert/StreamEncoder.java +++ b/src/org/redkale/convert/StreamEncoder.java @@ -81,14 +81,14 @@ public class StreamEncoder implements Encodeable> { boolean first = true; for (Object v : array) { if (!first) out.writeArrayMark(); - writeValue(out, member, v); + writeMemberValue(out, member, v, first); if (first) first = false; } } out.writeArrayE(); } - protected void writeValue(Writer out, EnMember member, Object value) { + protected void writeMemberValue(Writer out, EnMember member, Object value, boolean first) { encoder.convertTo(out, value); }