convert
This commit is contained in:
@@ -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:"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user