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;
// 元素类型是final的, final的元素类型不用判断每个元素类型是否与数组类型一直
protected final boolean subTypeFinal;
protected volatile boolean inited = false;
@@ -101,11 +102,11 @@ public class ArrayEncoder<W extends Writer, T> implements Encodeable<W, T[]> {
out.writeArrayE();
return;
}
Encodeable<W, Object> 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<W extends Writer, T> implements Encodeable<W, T[]> {
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<W extends Writer, T> implements Encodeable<W, T[]> {
out.writeArrayE();
}
protected void writeMemberValue(W out, EnMember member, Encodeable<W, Object> encoder, Object value, int index) {
encoder.convertTo(out, value);
}
@Override
public String toString() {
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();
return;
}
Encodeable itemEncoder = this.componentEncoder;
if (value.isEmpty()) {
out.writeArrayB(0, componentEncoder, value);
out.writeArrayB(0, itemEncoder, value);
out.writeArrayE();
return;
}
out.writeArrayB(value.size(), componentEncoder, value);
out.writeArrayB(value.size(), itemEncoder, value);
boolean first = true;
for (Object v : value) {
if (!first) {
out.writeArrayMark();
}
writeMemberValue(out, member, v, first);
itemEncoder.convertTo(out, v);
if (first) {
first = false;
}
@@ -101,10 +102,6 @@ public class CollectionEncoder<W extends Writer, T> implements Encodeable<W, Col
out.writeArrayE();
}
protected void writeMemberValue(W out, EnMember member, Object value, boolean first) {
componentEncoder.convertTo(out, value);
}
@Override
public Type getType() {
return type;

View File

@@ -7,6 +7,7 @@ package org.redkale.convert;
import java.lang.reflect.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.*;
import java.util.function.BiFunction;
@@ -95,30 +96,25 @@ public class MapEncoder<W extends Writer, K, V> implements Encodeable<W, Map<K,
}
Set<String> ignoreColumns = this.ignoreMapColumns;
BiFunction<K, V, V> mapFieldFunc = (BiFunction) out.mapFieldFunc;
out.writeMapB(values.size(), (Encodeable) keyEncoder, (Encodeable) valueEncoder, value);
boolean first = true;
for (Map.Entry<K, V> 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;

View File

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

View File

@@ -15,25 +15,36 @@ import org.redkale.convert.*;
*/
public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T> {
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();
}
}

View File

@@ -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<T> extends CollectionEncoder<ProtobufWriter, T> {
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<T> 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();
}
}

View File

@@ -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<K, V> extends MapEncoder<ProtobufWriter, K, V> {
}
@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<K, V> value) {
this.checkInited();
final Map<K, V> 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<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);
kencoder.convertTo(tmp, key);
tmp.writeTag(valTag);
vencoder.convertTo(tmp, v);
out.writeLength(tmp.count());
out.writeTo(tmp.toArray());
out.offerChild(tmp);
}
}
});
out.writeMapE();
}
}

View File

@@ -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<T> extends StreamEncoder<ProtobufWriter, T> {
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<T> 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();
}
}

View File

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