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 { } else {
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
result.add(localdecoder.convertFrom(in)); result.add(localdecoder.convertFrom(in));
first = false;
} }
} }
in.readArrayE(); in.readArrayE();

View File

@@ -86,14 +86,14 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
boolean first = true; boolean first = true;
for (Object v : value) { for (Object v : value) {
if (!first) out.writeArrayMark(); 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; if (first) first = false;
} }
} }
out.writeArrayE(); 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); 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 Decodeable<Reader, T> localdecoder = this.decoder;
final Collection<T> result = this.creator.create(); final Collection<T> result = this.creator.create();
boolean first = true;
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position(); int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) { while (in.hasNext(startPosition, contentLength)) {
readMember(in, member); result.add(readMemberValue(in, member, first));
result.add(localdecoder.convertFrom(in)); first = false;
} }
} else { } else {
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
@@ -101,7 +102,8 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
return result; return result;
} }
protected void readMember(Reader in, DeMember member) { protected T readMemberValue(Reader in, DeMember member, boolean first) {
return this.decoder.convertFrom(in);
} }
@Override @Override

View File

@@ -99,34 +99,35 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
len = Reader.SIGN_NOLENGTH; len = Reader.SIGN_NOLENGTH;
} }
final Map<K, V> result = this.creator.create(); final Map<K, V> result = this.creator.create();
boolean first = true;
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position(); int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) { while (in.hasNext(startPosition, contentLength)) {
readKeyMember(in, member); K key = readKeyMember(in, member, first);
K key = keyDecoder.convertFrom(in);
in.readBlank(); in.readBlank();
readValueMember(in, member); V value = readValueMember(in, member, first);
V value = valueDecoder.convertFrom(in);
result.put(key, value); result.put(key, value);
first = false;
} }
} else { } else {
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
readKeyMember(in, member); K key = readKeyMember(in, member, first);
K key = keyDecoder.convertFrom(in);
in.readBlank(); in.readBlank();
readValueMember(in, member); V value = readValueMember(in, member, first);
V value = valueDecoder.convertFrom(in);
result.put(key, value); result.put(key, value);
first = false;
} }
} }
in.readMapE(); in.readMapE();
return result; 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 @Override

View File

@@ -78,20 +78,16 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
boolean first = true; boolean first = true;
for (Map.Entry<K, V> en : values.entrySet()) { for (Map.Entry<K, V> en : values.entrySet()) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
writeKey(out, member, en.getKey()); writeMemberValue(out, member, en.getKey(), en.getValue(),first);
out.writeMapMark();
writeValue(out, member, en.getValue());
if (first) first = false; if (first) first = false;
} }
} }
out.writeMapE(); 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); keyencoder.convertTo(out, key);
} out.writeMapMark();
protected void writeValue(Writer out, EnMember member, V value) {
valencoder.convertTo(out, value); 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) { //空构造函数 if (this.creatorConstructorMembers == null) { //空构造函数
final T result = this.creator.create(); final T result = this.creator.create();
boolean first = true;
while (hasNext(in)) { 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 {
readMemberValue(in, member, result); readMemberValue(in, member, result, first);
} }
} }
first = false;
in.readObjectE(typeClass); in.readObjectE(typeClass);
return result; return result;
} else { //带参数的构造函数 } 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[] 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;
boolean first = true;
while (hasNext(in)) { 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 = readMemberValue(in, member); Object val = readMemberValue(in, member, first);
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]) {
@@ -253,7 +256,9 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
} }
} }
if (flag) otherParams[oc++] = new Object[]{member.attribute, val}; if (flag) otherParams[oc++] = new Object[]{member.attribute, val};
} }
first = false;
} }
in.readObjectE(typeClass); in.readObjectE(typeClass);
final T result = this.creator.create(constructorParams); 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(); return in.hasNext();
} }
protected Object readMemberValue(R in, DeMember member) { protected Object readMemberValue(R in, DeMember member, boolean first) {
return member.read(in); 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); 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 Decodeable<Reader, T> localdecoder = this.decoder;
final List<T> result = new ArrayList(); final List<T> result = new ArrayList();
boolean first = true;
if (len == Reader.SIGN_NOLENGTH) { if (len == Reader.SIGN_NOLENGTH) {
int startPosition = in.position(); int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) { while (in.hasNext(startPosition, contentLength)) {
readMember(in, member); result.add(readMemberValue(in, member, first));
result.add(localdecoder.convertFrom(in)); first = false;
} }
} else { } else {
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
@@ -97,7 +98,8 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
return result.stream(); 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 @Override

View File

@@ -81,14 +81,14 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
boolean first = true; boolean first = true;
for (Object v : array) { for (Object v : array) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
writeValue(out, member, v); writeMemberValue(out, member, v, first);
if (first) first = false; if (first) first = false;
} }
} }
out.writeArrayE(); 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); encoder.convertTo(out, value);
} }