This commit is contained in:
Redkale
2018-07-25 11:43:51 +08:00
parent e88c4fa2e3
commit d327757d59
8 changed files with 37 additions and 32 deletions

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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);
}