This commit is contained in:
@@ -96,7 +96,6 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
|
||||
} else {
|
||||
for (int i = 0; i < len; i++) {
|
||||
result.add(localdecoder.convertFrom(in));
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
in.readArrayE();
|
||||
|
||||
@@ -86,14 +86,14 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
|
||||
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<Writer, Object> encoder, Object value) {
|
||||
protected void writeMemberValue(Writer out, EnMember member, Encodeable<Writer, Object> encoder, Object value, boolean first) {
|
||||
encoder.convertTo(out, value);
|
||||
}
|
||||
|
||||
|
||||
@@ -86,11 +86,12 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
|
||||
}
|
||||
final Decodeable<Reader, T> localdecoder = this.decoder;
|
||||
final Collection<T> 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<T> implements Decodeable<Reader, Collection<T>> {
|
||||
return result;
|
||||
}
|
||||
|
||||
protected void readMember(Reader in, DeMember member) {
|
||||
protected T readMemberValue(Reader in, DeMember member, boolean first) {
|
||||
return this.decoder.convertFrom(in);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -99,34 +99,35 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
|
||||
len = Reader.SIGN_NOLENGTH;
|
||||
}
|
||||
final Map<K, V> 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
|
||||
|
||||
@@ -78,20 +78,16 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
|
||||
boolean first = true;
|
||||
for (Map.Entry<K, V> 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -221,15 +221,17 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
|
||||
}
|
||||
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<R extends Reader, T> implements Decodeable<R, T> {
|
||||
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<R extends Reader, T> implements Decodeable<R, T> {
|
||||
}
|
||||
}
|
||||
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<R extends Reader, T> implements Decodeable<R, T> {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -82,11 +82,12 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
|
||||
}
|
||||
final Decodeable<Reader, T> localdecoder = this.decoder;
|
||||
final List<T> 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<T> implements Decodeable<Reader, Stream<T>> {
|
||||
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
|
||||
|
||||
@@ -81,14 +81,14 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user