This commit is contained in:
redkale
2024-09-27 12:49:19 +08:00
parent de5114a480
commit 438ce904ab
9 changed files with 138 additions and 100 deletions

View File

@@ -30,6 +30,7 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
protected final Encodeable<W, Object> componentEncoder; protected final Encodeable<W, Object> componentEncoder;
// 元素类型是final的, final的元素类型不用判断每个元素类型是否与数组类型一直
protected final boolean subTypeFinal; protected final boolean subTypeFinal;
protected volatile boolean inited = false; protected volatile boolean inited = false;
@@ -101,11 +102,11 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
out.writeArrayE(); out.writeArrayE();
return; return;
} }
Encodeable<W, Object> itemEncoder = this.componentEncoder; Encodeable itemEncoder = this.componentEncoder;
if (subTypeFinal) { if (subTypeFinal) { // 元素类型是final的说明所有元素都是同一个类型
out.writeArrayB(value.length, itemEncoder, value); out.writeArrayB(value.length, itemEncoder, value);
for (int i = 0; ; i++) { for (int i = 0; ; i++) {
writeMemberValue(out, member, itemEncoder, value[i], i); itemEncoder.convertTo(out, value[i]);
if (i == iMax) { if (i == iMax) {
break; break;
} }
@@ -116,14 +117,8 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
final Type comp = this.componentType; final Type comp = this.componentType;
for (int i = 0; ; i++) { for (int i = 0; ; i++) {
Object v = value[i]; Object v = value[i];
writeMemberValue( ((v != null && (v.getClass() == comp || out.specificObjectType() == comp)) ? itemEncoder : anyEncoder)
out, .convertTo(out, v);
member,
((v != null && (v.getClass() == comp || out.specificObjectType() == comp))
? itemEncoder
: anyEncoder),
v,
i);
if (i == iMax) { if (i == iMax) {
break; break;
} }
@@ -133,10 +128,6 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
out.writeArrayE(); out.writeArrayE();
} }
protected void writeMemberValue(W out, EnMember member, Encodeable<W, Object> encoder, Object value, int index) {
encoder.convertTo(out, value);
}
@Override @Override
public String toString() { public String toString() {
return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:" return this.getClass().getSimpleName() + "{componentType:" + this.componentType + ", encoder:"

View File

@@ -82,18 +82,19 @@ public class CollectionEncoder<W extends Writer, T> implements Encodeable<W, Col
out.writeNull(); out.writeNull();
return; return;
} }
Encodeable itemEncoder = this.componentEncoder;
if (value.isEmpty()) { if (value.isEmpty()) {
out.writeArrayB(0, componentEncoder, value); out.writeArrayB(0, itemEncoder, value);
out.writeArrayE(); out.writeArrayE();
return; return;
} }
out.writeArrayB(value.size(), componentEncoder, value); out.writeArrayB(value.size(), itemEncoder, value);
boolean first = true; boolean first = true;
for (Object v : value) { for (Object v : value) {
if (!first) { if (!first) {
out.writeArrayMark(); out.writeArrayMark();
} }
writeMemberValue(out, member, v, first); itemEncoder.convertTo(out, v);
if (first) { if (first) {
first = false; first = false;
} }
@@ -101,10 +102,6 @@ public class CollectionEncoder<W extends Writer, T> implements Encodeable<W, Col
out.writeArrayE(); out.writeArrayE();
} }
protected void writeMemberValue(W out, EnMember member, Object value, boolean first) {
componentEncoder.convertTo(out, value);
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -7,6 +7,7 @@ package org.redkale.convert;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.*; import java.util.concurrent.locks.*;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@@ -95,28 +96,23 @@ public class MapEncoder<W extends Writer, K, V> implements Encodeable<W, Map<K,
} }
Set<String> ignoreColumns = this.ignoreMapColumns; Set<String> ignoreColumns = this.ignoreMapColumns;
BiFunction<K, V, V> mapFieldFunc = (BiFunction) out.mapFieldFunc; BiFunction<K, V, V> mapFieldFunc = (BiFunction) out.mapFieldFunc;
out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value); Encodeable kencoder = this.keyEncoder;
boolean first = true; Encodeable vencoder = this.valueEncoder;
for (Map.Entry<K, V> en : values.entrySet()) { out.writeMapB(values.size(), kencoder, vencoder, value);
if (ignoreColumns != null && ignoreColumns.contains(en.getKey())) { AtomicBoolean first = new AtomicBoolean(true);
continue; values.forEach((key, val) -> {
} if (ignoreColumns == null || !ignoreColumns.contains(key)) {
V v = mapFieldFunc == null ? en.getValue() : mapFieldFunc.apply(en.getKey(), en.getValue()); V v = mapFieldFunc == null ? val : mapFieldFunc.apply(key, val);
if (!first) { if (!first.get()) {
out.writeArrayMark(); out.writeArrayMark();
} }
writeMemberValue(out, member, en.getKey(), v, first); kencoder.convertTo(out, key);
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(); out.writeMapMark();
valueEncoder.convertTo(out, value); vencoder.convertTo(out, v);
first.set(false);
}
});
out.writeMapE();
} }
@Override @Override

View File

@@ -82,19 +82,20 @@ public class StreamEncoder<W extends Writer, T> implements Encodeable<W, Stream<
out.writeNull(); out.writeNull();
return; return;
} }
Encodeable itemEncoder = this.componentEncoder;
Object[] array = value.toArray(); Object[] array = value.toArray();
if (array.length == 0) { if (array.length == 0) {
out.writeArrayB(0, componentEncoder, array); out.writeArrayB(0, itemEncoder, array);
out.writeArrayE(); out.writeArrayE();
return; return;
} }
out.writeArrayB(array.length, componentEncoder, array); out.writeArrayB(array.length, itemEncoder, array);
boolean first = true; boolean first = true;
for (Object v : array) { for (Object v : array) {
if (!first) { if (!first) {
out.writeArrayMark(); out.writeArrayMark();
} }
writeMemberValue(out, member, v, first); itemEncoder.convertTo(out, v);
if (first) { if (first) {
first = false; first = false;
} }
@@ -102,10 +103,6 @@ public class StreamEncoder<W extends Writer, T> implements Encodeable<W, Stream<
out.writeArrayE(); out.writeArrayE();
} }
protected void writeMemberValue(W out, EnMember member, Object value, boolean first) {
componentEncoder.convertTo(out, value);
}
@Override @Override
public Type getType() { public Type getType() {
return type; return type;

View File

@@ -15,25 +15,36 @@ import org.redkale.convert.*;
*/ */
public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> { public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> {
protected final boolean componentSimpled;
public ProtobufArrayEncoder(ProtobufFactory factory, Type type) { public ProtobufArrayEncoder(ProtobufFactory factory, Type type) {
super(factory, type); super(factory, type);
this.componentSimpled = getComponentEncoder()instanceof SimpledCoder;
} }
@Override @Override
protected void writeMemberValue(ProtobufWriter out, EnMember member, Encodeable encoder, Object item, int index) { public void convertTo(ProtobufWriter out, EnMember member, T[] value) {
if (member != null) { this.checkInited();
out.writeFieldName(member); 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) { if (item == null) {
out.writeUInt32(0); out.writeUInt32(0);
} else if (item instanceof CharSequence) { } else if (componentSimpled) {
encoder.convertTo(out, item); itemEncoder.convertTo(out, item);
} else { } else {
ProtobufWriter tmp = out.pollChild(); ProtobufWriter tmp = out.pollChild();
encoder.convertTo(tmp, item); itemEncoder.convertTo(tmp, item);
out.writeLength(tmp.count()); out.writeLength(tmp.count());
out.writeTo(tmp.toArray()); out.writeTo(tmp.toArray());
out.offerChild(tmp); out.offerChild(tmp);
} }
} }
out.writeArrayE();
}
} }

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Collection;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -14,25 +15,35 @@ import org.redkale.convert.*;
*/ */
public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWriter, T> { public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWriter, T> {
protected final boolean componentSimpled;
public ProtobufCollectionEncoder(ProtobufFactory factory, Type type) { public ProtobufCollectionEncoder(ProtobufFactory factory, Type type) {
super(factory, type); super(factory, type);
this.componentSimpled = getComponentEncoder() instanceof SimpledCoder;
} }
@Override @Override
protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) { public void convertTo(ProtobufWriter out, EnMember member, Collection<T> value) {
if (member != null) { this.checkInited();
out.writeFieldName(member); 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) { if (item == null) {
out.writeUInt32(0); out.writeUInt32(0);
} else if (item instanceof CharSequence) { } else if (componentSimpled) {
componentEncoder.convertTo(out, item); itemEncoder.convertTo(out, item);
} else { } else {
ProtobufWriter tmp = out.pollChild(); ProtobufWriter tmp = out.pollChild();
componentEncoder.convertTo(tmp, item); itemEncoder.convertTo(tmp, item);
out.writeLength(tmp.count()); out.writeLength(tmp.count());
out.writeTo(tmp.toArray()); out.writeTo(tmp.toArray());
out.offerChild(tmp); out.offerChild(tmp);
} }
} }
out.writeArrayE();
}
} }

View File

@@ -6,6 +6,8 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.*;
import java.util.function.BiFunction;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -27,17 +29,34 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V> {
} }
@Override @Override
protected void writeMemberValue(ProtobufWriter out, EnMember member, K key, V value, boolean first) { public void convertTo(ProtobufWriter out, EnMember member, Map<K, V> value) {
ProtobufWriter tmp = out.pollChild(); this.checkInited();
if (member != null) { final Map<K, V> values = value;
out.writeFieldName(member); if (values == null || values.isEmpty()) {
out.writeNull();
return;
} }
Set<String> ignoreColumns = this.ignoreMapColumns;
BiFunction<K, V, V> 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); tmp.writeTag(keyTag);
keyEncoder.convertTo(tmp, key); kencoder.convertTo(tmp, key);
tmp.writeTag(valTag); tmp.writeTag(valTag);
valueEncoder.convertTo(tmp, value); vencoder.convertTo(tmp, v);
out.writeLength(tmp.count()); out.writeLength(tmp.count());
out.writeTo(tmp.toArray()); out.writeTo(tmp.toArray());
out.offerChild(tmp); out.offerChild(tmp);
} }
}
});
out.writeMapE();
}
} }

View File

@@ -6,6 +6,7 @@
package org.redkale.convert.pb; package org.redkale.convert.pb;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.stream.Stream;
import org.redkale.convert.*; import org.redkale.convert.*;
/** /**
@@ -14,25 +15,36 @@ import org.redkale.convert.*;
*/ */
public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T> { public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T> {
protected final boolean componentSimpled;
public ProtobufStreamEncoder(ConvertFactory factory, Type type) { public ProtobufStreamEncoder(ConvertFactory factory, Type type) {
super(factory, type); super(factory, type);
this.componentSimpled = getComponentEncoder() instanceof SimpledCoder;
} }
@Override @Override
protected void writeMemberValue(ProtobufWriter out, EnMember member, Object item, boolean first) { public void convertTo(ProtobufWriter out, EnMember member, Stream<T> value) {
if (member != null) { this.checkInited();
out.writeFieldName(member); 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) { if (item == null) {
out.writeUInt32(0); out.writeUInt32(0);
} else if (item instanceof CharSequence) { } else if (componentSimpled) {
componentEncoder.convertTo(out, item); itemEncoder.convertTo(out, item);
} else { } else {
ProtobufWriter tmp = out.pollChild(); ProtobufWriter tmp = out.pollChild();
componentEncoder.convertTo(tmp, item); itemEncoder.convertTo(tmp, item);
out.writeUInt32(tmp.count()); out.writeLength(tmp.count());
out.writeTo(tmp.toArray()); out.writeTo(tmp.toArray());
out.offerChild(tmp); out.offerChild(tmp);
} }
} }
out.writeArrayE();
}
} }

View File

@@ -10,7 +10,7 @@ import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import java.util.function.Consumer; import java.util.function.*;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.redkale.annotation.ClassDepends; import org.redkale.annotation.ClassDepends;
import org.redkale.convert.*; import org.redkale.convert.*;
@@ -113,6 +113,10 @@ public class ProtobufWriter extends Writer implements ByteTuple {
return this; return this;
} }
protected BiFunction mapFieldFunc() {
return mapFieldFunc;
}
public ProtobufWriter() { public ProtobufWriter() {
this(DEFAULT_SIZE); this(DEFAULT_SIZE);
} }