diff --git a/src/org/redkale/convert/DeMember.java b/src/org/redkale/convert/DeMember.java index 84e79ab56..307a7e68f 100644 --- a/src/org/redkale/convert/DeMember.java +++ b/src/org/redkale/convert/DeMember.java @@ -72,6 +72,10 @@ public final class DeMember { return this.attribute; } + public Decodeable getDecoder() { + return decoder; + } + public int getIndex() { return this.index; } diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index b955ce3db..7afb614c8 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -155,8 +155,18 @@ public class ObjectDecoder implements Decodeable { } this.members = list.toArray(new DeMember[list.size()]); Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b)); + Set pos = new HashSet<>(); for (int i = 0; i < this.members.length; i++) { - this.members[i].position = (i + 1); + if (this.members[i].index > 0) pos.add(this.members[i].index); + } + int pidx = 0; + for (DeMember member : this.members) { + if (member.index > 0) { + member.position = member.index; + } else { + while (pos.contains(++pidx)); + member.position = pidx; + } } if (cps != null) { @@ -211,13 +221,13 @@ public class ObjectDecoder implements Decodeable { } if (this.creatorConstructorMembers == null) { //空构造函数 final T result = this.creator.create(); - while (in.hasNext()) { + while (hasNext(in)) { DeMember member = in.readFieldName(members); in.readBlank(); if (member == null) { in.skipValue(); //跳过不存在的属性的值 } else { - member.read(in, result); + readMemberValue(in, member, result); } } in.readObjectE(typeClass); @@ -227,13 +237,13 @@ public class ObjectDecoder implements Decodeable { final Object[] constructorParams = new Object[fields.length]; final Object[][] otherParams = new Object[this.members.length][2]; int oc = 0; - while (in.hasNext()) { + while (hasNext(in)) { DeMember member = in.readFieldName(members); in.readBlank(); if (member == null) { in.skipValue(); //跳过不存在的属性的值 } else { - Object val = member.read(in); + Object val = readMemberValue(in, member); boolean flag = true; for (int i = 0; i < fields.length; i++) { if (member == fields[i]) { @@ -254,6 +264,18 @@ public class ObjectDecoder implements Decodeable { } } + protected boolean hasNext(Reader in) { + return in.hasNext(); + } + + protected Object readMemberValue(Reader in, DeMember member) { + return member.read(in); + } + + protected void readMemberValue(Reader in, DeMember member, T result) { + member.read(in, result); + } + @Override public Type getType() { return this.type; diff --git a/src/org/redkale/convert/ObjectEncoder.java b/src/org/redkale/convert/ObjectEncoder.java index 8573d9fc0..9166afc19 100644 --- a/src/org/redkale/convert/ObjectEncoder.java +++ b/src/org/redkale/convert/ObjectEncoder.java @@ -109,8 +109,18 @@ public class ObjectEncoder implements Encodeable { } this.members = list.toArray(new EnMember[list.size()]); Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b)); + Set pos = new HashSet<>(); for (int i = 0; i < this.members.length; i++) { - this.members[i].position = (i + 1); + if (this.members[i].index > 0) pos.add(this.members[i].index); + } + int pidx = 0; + for (EnMember member : this.members) { + if (member.index > 0) { + member.position = member.index; + } else { + while (pos.contains(++pidx)); + member.position = pidx; + } } } catch (Exception ex) {