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;
|
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:"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,30 +96,25 @@ 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 ? 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();
|
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
|
@Override
|
||||||
public Type getType() {
|
public Type getType() {
|
||||||
return type;
|
return type;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
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);
|
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.writeArrayE();
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
if (value == null || value.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Encodeable itemEncoder = this.componentEncoder;
|
||||||
|
out.writeArrayB(value.size(), itemEncoder, value);
|
||||||
|
for (T item : value) {
|
||||||
out.writeFieldName(member);
|
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.writeArrayE();
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
tmp.writeTag(keyTag);
|
Set<String> ignoreColumns = this.ignoreMapColumns;
|
||||||
keyEncoder.convertTo(tmp, key);
|
BiFunction<K, V, V> mapFieldFunc = out.mapFieldFunc();
|
||||||
tmp.writeTag(valTag);
|
Encodeable kencoder = this.keyEncoder;
|
||||||
valueEncoder.convertTo(tmp, value);
|
Encodeable vencoder = this.valueEncoder;
|
||||||
out.writeLength(tmp.count());
|
out.writeMapB(values.size(), kencoder, vencoder, value);
|
||||||
out.writeTo(tmp.toArray());
|
values.forEach((key, val) -> {
|
||||||
out.offerChild(tmp);
|
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;
|
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();
|
||||||
|
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);
|
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.writeArrayE();
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user