This commit is contained in:
Redkale
2018-07-21 14:21:50 +08:00
parent 0f2474386c
commit 00a12d8113
8 changed files with 79 additions and 5 deletions

View File

@@ -62,6 +62,10 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
@Override @Override
public T[] convertFrom(Reader in) { public T[] convertFrom(Reader in) {
return convertFrom(in, null);
}
public T[] convertFrom(Reader in, DeMember member) {
int len = in.readArrayB(); int len = in.readArrayB();
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
@@ -85,6 +89,7 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
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(localdecoder.convertFrom(in)); result.add(localdecoder.convertFrom(in));
} }
} else { } else {
@@ -97,6 +102,9 @@ public class ArrayDecoder<T> implements Decodeable<Reader, T[]> {
return result.toArray(rs); return result.toArray(rs);
} }
protected void readMember(Reader in, DeMember member) {
}
@Override @Override
public String toString() { public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" + this.decoder + "}"; return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", decoder:" + this.decoder + "}";

View File

@@ -57,6 +57,10 @@ public class ArrayEncoder<T> implements Encodeable<Writer, T[]> {
@Override @Override
public void convertTo(Writer out, T[] value) { public void convertTo(Writer out, T[] value) {
convertTo(out, null, value);
}
public void convertTo(Writer out, EnMember member, T[] value) {
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
return; return;
@@ -82,13 +86,17 @@ 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();
((v != null && (v.getClass() == comp || out.specify() == comp)) ? encoder : anyEncoder).convertTo(out, v); writeValue(out, member, ((v != null && (v.getClass() == comp || out.specify() == comp)) ? encoder : anyEncoder), v);
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) {
encoder.convertTo(out, value);
}
@Override @Override
public String toString() { public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.encoder + "}"; return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" + this.encoder + "}";

View File

@@ -62,6 +62,10 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
@Override @Override
public Collection<T> convertFrom(Reader in) { public Collection<T> convertFrom(Reader in) {
return convertFrom(in, null);
}
public Collection<T> convertFrom(Reader in, DeMember member) {
int len = in.readArrayB(); int len = in.readArrayB();
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
@@ -85,6 +89,7 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
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(localdecoder.convertFrom(in)); result.add(localdecoder.convertFrom(in));
} }
} else { } else {
@@ -96,6 +101,9 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
return result; return result;
} }
protected void readMember(Reader in, DeMember member) {
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -52,6 +52,10 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
@Override @Override
public void convertTo(Writer out, Collection<T> value) { public void convertTo(Writer out, Collection<T> value) {
convertTo(out, null, value);
}
public void convertTo(Writer out, EnMember member, Collection<T> value) {
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
return; return;
@@ -76,13 +80,17 @@ public class CollectionEncoder<T> implements Encodeable<Writer, Collection<T>> {
boolean first = true; boolean first = true;
for (Object v : value) { for (Object v : value) {
if (!first) out.writeArrayMark(); if (!first) out.writeArrayMark();
encoder.convertTo(out, v); writeValue(out, member, v);
if (first) first = false; if (first) first = false;
} }
} }
out.writeArrayE(); out.writeArrayE();
} }
protected void writeValue(Writer out, EnMember member, Object value) {
encoder.convertTo(out, value);
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -76,6 +76,10 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
@Override @Override
public Map<K, V> convertFrom(Reader in) { public Map<K, V> convertFrom(Reader in) {
return convertFrom(in, null);
}
public Map<K, V> convertFrom(Reader in, DeMember member) {
if (this.keyDecoder == null || this.valueDecoder == null) { if (this.keyDecoder == null || this.valueDecoder == null) {
if (!this.inited) { if (!this.inited) {
synchronized (lock) { synchronized (lock) {
@@ -98,15 +102,19 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
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 = keyDecoder.convertFrom(in); K key = keyDecoder.convertFrom(in);
in.readBlank(); in.readBlank();
readValueMember(in, member);
V value = valueDecoder.convertFrom(in); V value = valueDecoder.convertFrom(in);
result.put(key, value); result.put(key, value);
} }
} else { } else {
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
readKeyMember(in, member);
K key = keyDecoder.convertFrom(in); K key = keyDecoder.convertFrom(in);
in.readBlank(); in.readBlank();
readValueMember(in, member);
V value = valueDecoder.convertFrom(in); V value = valueDecoder.convertFrom(in);
result.put(key, value); result.put(key, value);
} }
@@ -115,6 +123,12 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
return result; return result;
} }
protected void readKeyMember(Reader in, DeMember member) {
}
protected void readValueMember(Reader in, DeMember member) {
}
@Override @Override
public Type getType() { public Type getType() {
return this.type; return this.type;

View File

@@ -53,6 +53,10 @@ public class MapEncoder<K, V> implements Encodeable<Writer, Map<K, V>> {
@Override @Override
public void convertTo(Writer out, Map<K, V> value) { public void convertTo(Writer out, Map<K, V> value) {
convertTo(out, null, value);
}
public void convertTo(Writer out, EnMember member, Map<K, V> value) {
final Map<K, V> values = value; final Map<K, V> values = value;
if (values == null) { if (values == null) {
out.writeNull(); out.writeNull();
@@ -74,15 +78,23 @@ 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();
this.keyencoder.convertTo(out, en.getKey()); writeKey(out, member, en.getKey());
out.writeMapMark(); out.writeMapMark();
this.valencoder.convertTo(out, en.getValue()); 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) {
keyencoder.convertTo(out, key);
}
protected void writeValue(Writer out, EnMember member, V value) {
valencoder.convertTo(out, value);
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -58,6 +58,10 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
@Override @Override
public Stream<T> convertFrom(Reader in) { public Stream<T> convertFrom(Reader in) {
return convertFrom(in, null);
}
public Stream<T> convertFrom(Reader in, DeMember member) {
int len = in.readArrayB(); int len = in.readArrayB();
int contentLength = -1; int contentLength = -1;
if (len == Reader.SIGN_NULL) return null; if (len == Reader.SIGN_NULL) return null;
@@ -81,6 +85,7 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
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(localdecoder.convertFrom(in)); result.add(localdecoder.convertFrom(in));
} }
} else { } else {
@@ -92,6 +97,9 @@ public class StreamDecoder<T> implements Decodeable<Reader, Stream<T>> {
return result.stream(); return result.stream();
} }
protected void readMember(Reader in, DeMember member) {
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -52,6 +52,10 @@ public class StreamEncoder<T> implements Encodeable<Writer, Stream<T>> {
@Override @Override
public void convertTo(Writer out, Stream<T> value) { public void convertTo(Writer out, Stream<T> value) {
convertTo(out, null, value);
}
public void convertTo(Writer out, EnMember member, Stream<T> value) {
if (value == null) { if (value == null) {
out.writeNull(); out.writeNull();
return; return;
@@ -77,13 +81,17 @@ 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();
encoder.convertTo(out, v); writeValue(out, member, v);
if (first) first = false; if (first) first = false;
} }
} }
out.writeArrayE(); out.writeArrayE();
} }
protected void writeValue(Writer out, EnMember member, Object value) {
encoder.convertTo(out, value);
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;