This commit is contained in:
@@ -72,6 +72,10 @@ public final class DeMember<R extends Reader, T, F> {
|
|||||||
return this.attribute;
|
return this.attribute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Decodeable<R, F> getDecoder() {
|
||||||
|
return decoder;
|
||||||
|
}
|
||||||
|
|
||||||
public int getIndex() {
|
public int getIndex() {
|
||||||
return this.index;
|
return this.index;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -155,8 +155,18 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
}
|
}
|
||||||
this.members = list.toArray(new DeMember[list.size()]);
|
this.members = list.toArray(new DeMember[list.size()]);
|
||||||
Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b));
|
Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b));
|
||||||
|
Set<Integer> pos = new HashSet<>();
|
||||||
for (int i = 0; i < this.members.length; i++) {
|
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) {
|
if (cps != null) {
|
||||||
@@ -211,13 +221,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
}
|
}
|
||||||
if (this.creatorConstructorMembers == null) { //空构造函数
|
if (this.creatorConstructorMembers == null) { //空构造函数
|
||||||
final T result = this.creator.create();
|
final T result = this.creator.create();
|
||||||
while (in.hasNext()) {
|
while (hasNext(in)) {
|
||||||
DeMember member = in.readFieldName(members);
|
DeMember member = in.readFieldName(members);
|
||||||
in.readBlank();
|
in.readBlank();
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
in.skipValue(); //跳过不存在的属性的值
|
in.skipValue(); //跳过不存在的属性的值
|
||||||
} else {
|
} else {
|
||||||
member.read(in, result);
|
readMemberValue(in, member, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
in.readObjectE(typeClass);
|
in.readObjectE(typeClass);
|
||||||
@@ -227,13 +237,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
final Object[] constructorParams = new Object[fields.length];
|
final Object[] constructorParams = new Object[fields.length];
|
||||||
final Object[][] otherParams = new Object[this.members.length][2];
|
final Object[][] otherParams = new Object[this.members.length][2];
|
||||||
int oc = 0;
|
int oc = 0;
|
||||||
while (in.hasNext()) {
|
while (hasNext(in)) {
|
||||||
DeMember member = in.readFieldName(members);
|
DeMember member = in.readFieldName(members);
|
||||||
in.readBlank();
|
in.readBlank();
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
in.skipValue(); //跳过不存在的属性的值
|
in.skipValue(); //跳过不存在的属性的值
|
||||||
} else {
|
} else {
|
||||||
Object val = member.read(in);
|
Object val = readMemberValue(in, member);
|
||||||
boolean flag = true;
|
boolean flag = true;
|
||||||
for (int i = 0; i < fields.length; i++) {
|
for (int i = 0; i < fields.length; i++) {
|
||||||
if (member == fields[i]) {
|
if (member == fields[i]) {
|
||||||
@@ -254,6 +264,18 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
@Override
|
||||||
public Type getType() {
|
public Type getType() {
|
||||||
return this.type;
|
return this.type;
|
||||||
|
|||||||
@@ -109,8 +109,18 @@ public class ObjectEncoder<W extends Writer, T> implements Encodeable<W, T> {
|
|||||||
}
|
}
|
||||||
this.members = list.toArray(new EnMember[list.size()]);
|
this.members = list.toArray(new EnMember[list.size()]);
|
||||||
Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b));
|
Arrays.sort(this.members, (a, b) -> a.compareTo(factory.isFieldSort(), b));
|
||||||
|
Set<Integer> pos = new HashSet<>();
|
||||||
for (int i = 0; i < this.members.length; i++) {
|
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) {
|
} catch (Exception ex) {
|
||||||
|
|||||||
Reference in New Issue
Block a user