diff --git a/src/main/java/org/redkale/convert/ArrayEncoder.java b/src/main/java/org/redkale/convert/ArrayEncoder.java index ad148963d..b03b8c205 100644 --- a/src/main/java/org/redkale/convert/ArrayEncoder.java +++ b/src/main/java/org/redkale/convert/ArrayEncoder.java @@ -30,6 +30,7 @@ public class ArrayEncoder implements Encodeable { protected final Encodeable componentEncoder; + // 元素类型是final的, final的元素类型不用判断每个元素类型是否与数组类型一直 protected final boolean subTypeFinal; protected volatile boolean inited = false; @@ -101,11 +102,11 @@ public class ArrayEncoder implements Encodeable { out.writeArrayE(); return; } - Encodeable itemEncoder = this.componentEncoder; - if (subTypeFinal) { + Encodeable itemEncoder = this.componentEncoder; + if (subTypeFinal) { // 元素类型是final的,说明所有元素都是同一个类型 out.writeArrayB(value.length, itemEncoder, value); for (int i = 0; ; i++) { - writeMemberValue(out, member, itemEncoder, value[i], i); + itemEncoder.convertTo(out, value[i]); if (i == iMax) { break; } @@ -116,14 +117,8 @@ public class ArrayEncoder implements Encodeable { final Type comp = this.componentType; for (int i = 0; ; i++) { Object v = value[i]; - writeMemberValue( - out, - member, - ((v != null && (v.getClass() == comp || out.specificObjectType() == comp)) - ? itemEncoder - : anyEncoder), - v, - i); + ((v != null && (v.getClass() == comp || out.specificObjectType() == comp)) ? itemEncoder : anyEncoder) + .convertTo(out, v); if (i == iMax) { break; } @@ -133,10 +128,6 @@ public class ArrayEncoder implements Encodeable { out.writeArrayE(); } - protected void writeMemberValue(W out, EnMember member, Encodeable encoder, Object value, int index) { - encoder.convertTo(out, value); - } - @Override public String toString() { return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" diff --git a/src/main/java/org/redkale/convert/CollectionEncoder.java b/src/main/java/org/redkale/convert/CollectionEncoder.java index 1354f19e8..870d70350 100644 --- a/src/main/java/org/redkale/convert/CollectionEncoder.java +++ b/src/main/java/org/redkale/convert/CollectionEncoder.java @@ -82,18 +82,19 @@ public class CollectionEncoder implements Encodeable implements Encodeable implements Encodeable ignoreColumns = this.ignoreMapColumns; BiFunction mapFieldFunc = (BiFunction) out.mapFieldFunc; - out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value); - boolean first = true; - for (Map.Entry en : values.entrySet()) { - if (ignoreColumns != null && ignoreColumns.contains(en.getKey())) { - continue; + Encodeable kencoder = this.keyEncoder; + Encodeable vencoder = this.valueEncoder; + out.writeMapB(values.size(), kencoder, vencoder, value); + AtomicBoolean first = new AtomicBoolean(true); + values.forEach((key, val) -> { + if (ignoreColumns == null || !ignoreColumns.contains(key)) { + V v = mapFieldFunc == null ? val : mapFieldFunc.apply(key, val); + if (!first.get()) { + out.writeArrayMark(); + } + kencoder.convertTo(out, key); + out.writeMapMark(); + vencoder.convertTo(out, v); + first.set(false); } - V v = mapFieldFunc == null ? en.getValue() : mapFieldFunc.apply(en.getKey(), en.getValue()); - if (!first) { - out.writeArrayMark(); - } - writeMemberValue(out, member, en.getKey(), v, first); - if (first) { - first = false; - } - } + }); out.writeMapE(); } - protected void writeMemberValue(W out, EnMember member, K key, V value, boolean first) { - keyEncoder.convertTo(out, key); - out.writeMapMark(); - valueEncoder.convertTo(out, value); - } - @Override public Type getType() { return type; diff --git a/src/main/java/org/redkale/convert/StreamEncoder.java b/src/main/java/org/redkale/convert/StreamEncoder.java index 3ea089e25..79b394834 100644 --- a/src/main/java/org/redkale/convert/StreamEncoder.java +++ b/src/main/java/org/redkale/convert/StreamEncoder.java @@ -82,19 +82,20 @@ public class StreamEncoder implements Encodeable implements Encodeable extends ArrayEncoder { + protected final boolean componentSimpled; + public ProtobufArrayEncoder(ProtobufFactory factory, Type type) { super(factory, type); + this.componentSimpled = getComponentEncoder()instanceof SimpledCoder; } @Override - protected void writeMemberValue(ProtobufWriter out, EnMember member, Encodeable encoder, Object item, int index) { - if (member != null) { + public void convertTo(ProtobufWriter out, EnMember member, T[] value) { + this.checkInited(); + if (value == null || value.length < 1) { + return; + } + Encodeable itemEncoder = this.componentEncoder; + T[] array = value; + out.writeArrayB(array.length, itemEncoder, array); + for (T item : array) { out.writeFieldName(member); + if (item == null) { + out.writeUInt32(0); + } else if (componentSimpled) { + itemEncoder.convertTo(out, item); + } else { + ProtobufWriter tmp = out.pollChild(); + itemEncoder.convertTo(tmp, item); + out.writeLength(tmp.count()); + out.writeTo(tmp.toArray()); + out.offerChild(tmp); + } } - if (item == null) { - out.writeUInt32(0); - } else if (item instanceof CharSequence) { - encoder.convertTo(out, item); - } else { - ProtobufWriter tmp = out.pollChild(); - encoder.convertTo(tmp, item); - out.writeLength(tmp.count()); - out.writeTo(tmp.toArray()); - out.offerChild(tmp); - } + out.writeArrayE(); } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java index 933144f8a..72940c01c 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java @@ -6,6 +6,7 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.Collection; import org.redkale.convert.*; /** @@ -14,25 +15,35 @@ import org.redkale.convert.*; */ public class ProtobufCollectionEncoder extends CollectionEncoder { + protected final boolean componentSimpled; + public ProtobufCollectionEncoder(ProtobufFactory factory, Type type) { super(factory, type); + this.componentSimpled = getComponentEncoder() instanceof SimpledCoder; } @Override - protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) { - if (member != null) { + public void convertTo(ProtobufWriter out, EnMember member, Collection value) { + this.checkInited(); + if (value == null || value.isEmpty()) { + return; + } + Encodeable itemEncoder = this.componentEncoder; + out.writeArrayB(value.size(), itemEncoder, value); + for (T item : value) { out.writeFieldName(member); + if (item == null) { + out.writeUInt32(0); + } else if (componentSimpled) { + itemEncoder.convertTo(out, item); + } else { + ProtobufWriter tmp = out.pollChild(); + itemEncoder.convertTo(tmp, item); + out.writeLength(tmp.count()); + out.writeTo(tmp.toArray()); + out.offerChild(tmp); + } } - if (item == null) { - out.writeUInt32(0); - } else if (item instanceof CharSequence) { - componentEncoder.convertTo(out, item); - } else { - ProtobufWriter tmp = out.pollChild(); - componentEncoder.convertTo(tmp, item); - out.writeLength(tmp.count()); - out.writeTo(tmp.toArray()); - out.offerChild(tmp); - } + out.writeArrayE(); } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java index 3b1822ad4..7a1a0608c 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java @@ -6,6 +6,8 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.*; +import java.util.function.BiFunction; import org.redkale.convert.*; /** @@ -27,17 +29,34 @@ public class ProtobufMapEncoder extends MapEncoder { } @Override - protected void writeMemberValue(ProtobufWriter out, EnMember member, K key, V value, boolean first) { - ProtobufWriter tmp = out.pollChild(); - if (member != null) { - out.writeFieldName(member); + public void convertTo(ProtobufWriter out, EnMember member, Map value) { + this.checkInited(); + final Map values = value; + if (values == null || values.isEmpty()) { + out.writeNull(); + return; } - tmp.writeTag(keyTag); - keyEncoder.convertTo(tmp, key); - tmp.writeTag(valTag); - valueEncoder.convertTo(tmp, value); - out.writeLength(tmp.count()); - out.writeTo(tmp.toArray()); - out.offerChild(tmp); + Set ignoreColumns = this.ignoreMapColumns; + BiFunction mapFieldFunc = out.mapFieldFunc(); + Encodeable kencoder = this.keyEncoder; + Encodeable vencoder = this.valueEncoder; + out.writeMapB(values.size(), kencoder, vencoder, value); + values.forEach((key, val) -> { + if (ignoreColumns == null || !ignoreColumns.contains(key)) { + V v = mapFieldFunc == null ? val : mapFieldFunc.apply(key, val); + if (v != null) { + out.writeFieldName(member); + ProtobufWriter tmp = out.pollChild(); + tmp.writeTag(keyTag); + kencoder.convertTo(tmp, key); + tmp.writeTag(valTag); + vencoder.convertTo(tmp, v); + out.writeLength(tmp.count()); + out.writeTo(tmp.toArray()); + out.offerChild(tmp); + } + } + }); + out.writeMapE(); } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java index b909fa458..c545d783a 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java @@ -6,6 +6,7 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.stream.Stream; import org.redkale.convert.*; /** @@ -14,25 +15,36 @@ import org.redkale.convert.*; */ public class ProtobufStreamEncoder extends StreamEncoder { + protected final boolean componentSimpled; + public ProtobufStreamEncoder(ConvertFactory factory, Type type) { super(factory, type); + this.componentSimpled = getComponentEncoder() instanceof SimpledCoder; } @Override - protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) { - if (member != null) { + public void convertTo(ProtobufWriter out, EnMember member, Stream value) { + this.checkInited(); + Object[] array = value == null ? null : value.toArray(); + if (array == null || array.length < 1) { + return; + } + Encodeable itemEncoder = this.componentEncoder; + out.writeArrayB(array.length, itemEncoder, array); + for (Object item : array) { out.writeFieldName(member); + if (item == null) { + out.writeUInt32(0); + } else if (componentSimpled) { + itemEncoder.convertTo(out, item); + } else { + ProtobufWriter tmp = out.pollChild(); + itemEncoder.convertTo(tmp, item); + out.writeLength(tmp.count()); + out.writeTo(tmp.toArray()); + out.offerChild(tmp); + } } - if (item == null) { - out.writeUInt32(0); - } else if (item instanceof CharSequence) { - componentEncoder.convertTo(out, item); - } else { - ProtobufWriter tmp = out.pollChild(); - componentEncoder.convertTo(tmp, item); - out.writeUInt32(tmp.count()); - out.writeTo(tmp.toArray()); - out.offerChild(tmp); - } + out.writeArrayE(); } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java index c2d484f02..7f5de16f1 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java @@ -10,7 +10,7 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.atomic.*; -import java.util.function.Consumer; +import java.util.function.*; import java.util.stream.Stream; import org.redkale.annotation.ClassDepends; import org.redkale.convert.*; @@ -113,6 +113,10 @@ public class ProtobufWriter extends Writer implements ByteTuple { return this; } + protected BiFunction mapFieldFunc() { + return mapFieldFunc; + } + public ProtobufWriter() { this(DEFAULT_SIZE); }