pb
This commit is contained in:
@@ -6,10 +6,12 @@
|
||||
package org.redkale.convert.ext;
|
||||
|
||||
import java.net.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
import org.redkale.convert.*;
|
||||
import org.redkale.convert.json.*;
|
||||
import org.redkale.util.StringWrapper;
|
||||
import org.redkale.util.Utility;
|
||||
|
||||
/**
|
||||
* InetAddress 的SimpledCoder实现
|
||||
@@ -35,7 +37,6 @@ public class InetAddressSimpledCoder<R extends Reader, W extends Writer> extends
|
||||
this.bsSimpledCoder = Objects.requireNonNull(bSimpledCoder);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, InetAddress value) {
|
||||
if (value == null) {
|
||||
@@ -70,25 +71,38 @@ public class InetAddressSimpledCoder<R extends Reader, W extends Writer> extends
|
||||
|
||||
public static final InetSocketAddressSimpledCoder instance = new InetSocketAddressSimpledCoder();
|
||||
|
||||
protected final SimpledCoder<R, W, byte[]> bsSimpledCoder;
|
||||
|
||||
protected InetSocketAddressSimpledCoder() {
|
||||
this.bsSimpledCoder = ByteArraySimpledCoder.instance;
|
||||
}
|
||||
|
||||
public InetSocketAddressSimpledCoder(SimpledCoder<R, W, byte[]> bSimpledCoder) {
|
||||
this.bsSimpledCoder = Objects.requireNonNull(bSimpledCoder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(W out, InetSocketAddress value) {
|
||||
if (value == null) {
|
||||
out.writeNull();
|
||||
return;
|
||||
}
|
||||
ByteArraySimpledCoder.instance.convertTo(out, value.getAddress().getAddress());
|
||||
out.writeInt(value.getPort());
|
||||
int port = value.getPort();
|
||||
byte[] bs = value.getAddress().getAddress();
|
||||
bs = Utility.append(bs, (byte) ((port & 0xFF00) >> 8), (byte) (port & 0xFF));
|
||||
bsSimpledCoder.convertTo(out, bs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InetSocketAddress convertFrom(R in) {
|
||||
byte[] bytes = ByteArraySimpledCoder.instance.convertFrom(in);
|
||||
byte[] bytes = bsSimpledCoder.convertFrom(in);
|
||||
if (bytes == null) {
|
||||
return null;
|
||||
}
|
||||
int port = in.readInt();
|
||||
byte[] addr = Arrays.copyOf(bytes, bytes.length - 2);
|
||||
int port = ((0xff00 & (bytes[bytes.length - 2] << 8)) | (0xff & bytes[bytes.length - 1]));
|
||||
try {
|
||||
return new InetSocketAddress(InetAddress.getByAddress(bytes), port);
|
||||
return new InetSocketAddress(InetAddress.getByAddress(addr), port);
|
||||
} catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -27,24 +27,24 @@ public class ProtobufArrayEncoder<T> extends ArrayEncoder<ProtobufWriter, T>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(ProtobufWriter out, @Nonnull EnMember member, T[] value) {
|
||||
public void convertTo(final ProtobufWriter out, @Nonnull EnMember member, T[] value) {
|
||||
this.checkInited();
|
||||
if (value == null || value.length < 1) {
|
||||
return;
|
||||
}
|
||||
ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder;
|
||||
out.writeArrayB(value.length, itemEncoder, value);
|
||||
boolean first = true;
|
||||
for (T item : value) {
|
||||
out.writeField(member);
|
||||
if (!first) {
|
||||
out.writeField(member);
|
||||
}
|
||||
if (item == null) {
|
||||
out.writeLength(0);
|
||||
} else if (componentSimpled) {
|
||||
itemEncoder.convertTo(out, member, item);
|
||||
} else {
|
||||
ProtobufWriter tmp = out.pollChild();
|
||||
itemEncoder.convertTo(tmp, member, item);
|
||||
out.offerChild(tmp);
|
||||
itemEncoder.convertTo(out, member, item);
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ import org.redkale.convert.ext.Uint128SimpledCoder;
|
||||
import org.redkale.util.*;
|
||||
|
||||
/**
|
||||
* SimpledCoder子类convertTo方法中都不会执行writeField/writeTag
|
||||
*
|
||||
* @author zhangjx
|
||||
*/
|
||||
@@ -798,13 +799,17 @@ public abstract class ProtobufCoders {
|
||||
public static final ProtobufInetSocketAddressSimpledCoder instance =
|
||||
new ProtobufInetSocketAddressSimpledCoder();
|
||||
|
||||
public ProtobufInetSocketAddressSimpledCoder() {
|
||||
super(ProtobufByteArraySimpledCoder.instance);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int computeSize(ProtobufWriter out, int tagSize, InetSocketAddress value) {
|
||||
if (value == null) {
|
||||
return 0;
|
||||
}
|
||||
byte[] bs = value.getAddress().getAddress();
|
||||
return ProtobufByteArraySimpledCoder.instance.computeSize(out, tagSize, bs);
|
||||
return bs.length + 2; // port固定2字节
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,24 +27,24 @@ public class ProtobufCollectionEncoder<T> extends CollectionEncoder<ProtobufWrit
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(ProtobufWriter out, EnMember member, Collection<T> value) {
|
||||
public void convertTo(final ProtobufWriter out, EnMember member, Collection<T> value) {
|
||||
this.checkInited();
|
||||
if (Utility.isEmpty(value)) {
|
||||
return;
|
||||
}
|
||||
ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder;
|
||||
out.writeArrayB(value.size(), itemEncoder, value);
|
||||
boolean first = true;
|
||||
for (T item : value) {
|
||||
out.writeField(member);
|
||||
if (!first) {
|
||||
out.writeField(member);
|
||||
}
|
||||
if (item == null) {
|
||||
out.writeLength(0);
|
||||
} else if (componentSimpled) {
|
||||
itemEncoder.convertTo(out, member, item);
|
||||
} else {
|
||||
ProtobufWriter tmp = out.pollChild();
|
||||
itemEncoder.convertTo(tmp, member, item);
|
||||
out.offerChild(tmp);
|
||||
itemEncoder.convertTo(out, member, item);
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -49,9 +49,9 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
protected static ProtobufDynEncoder generateDyncEncoder(final ProtobufFactory factory, final Class clazz) {
|
||||
final ObjectEncoder selfObjEncoder = factory.createObjectEncoder(clazz);
|
||||
selfObjEncoder.init(factory); // 必须执行,初始化EnMember内部信息
|
||||
if (((ProtobufObjectEncoder) selfObjEncoder).requiredMemberSize()) { // 嵌套对象
|
||||
return null;
|
||||
}
|
||||
// if (((ProtobufObjectEncoder) selfObjEncoder).requiredMemberSize()) { // 嵌套对象
|
||||
// return null;
|
||||
// }
|
||||
final Map<String, SimpledCoder> simpledCoders = new HashMap<>();
|
||||
final Map<String, EnMember> otherMembers = new HashMap<>();
|
||||
StringBuilder elementb = new StringBuilder();
|
||||
@@ -159,26 +159,15 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
|
||||
mv.visitLineNumber(33, ifLabel);
|
||||
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
||||
|
||||
// if (parentMember != null) out0.writeField(parentMember);
|
||||
mv.visitVarInsn(ALOAD, 2); // parentMember
|
||||
Label ifMemberLabel = new Label();
|
||||
mv.visitJumpInsn(IFNULL, ifMemberLabel);
|
||||
mv.visitVarInsn(ALOAD, 1);
|
||||
mv.visitVarInsn(ALOAD, 2);
|
||||
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeField", "(" + enMemberDesc + ")V", false);
|
||||
mv.visitLabel(ifMemberLabel);
|
||||
mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
||||
|
||||
// ProtobufWriter out = objectWriter(out0, parentMember, value);
|
||||
// ProtobufWriter out = acceptWriter(out0, member);
|
||||
mv.visitVarInsn(ALOAD, 0); // this
|
||||
mv.visitVarInsn(ALOAD, 1); // out0
|
||||
mv.visitVarInsn(ALOAD, 2); // member
|
||||
mv.visitVarInsn(ALOAD, 3); // value
|
||||
mv.visitMethodInsn(
|
||||
INVOKEVIRTUAL,
|
||||
newDynName,
|
||||
"objectWriter",
|
||||
"(" + pbwriterDesc + enMemberDesc + objectDesc + ")" + pbwriterDesc,
|
||||
"acceptWriter",
|
||||
"(" + pbwriterDesc + enMemberDesc + ")" + pbwriterDesc,
|
||||
false);
|
||||
mv.visitVarInsn(ASTORE, 4);
|
||||
|
||||
|
||||
@@ -19,6 +19,11 @@ import org.redkale.convert.Writer;
|
||||
*/
|
||||
public interface ProtobufEncodeable<W extends Writer, T> extends Encodeable<W, T> {
|
||||
|
||||
// 序列化
|
||||
default void convertTo(W out, EnMember member, T value) {
|
||||
convertTo(out, value);
|
||||
}
|
||||
|
||||
// 计算内容长度
|
||||
public int computeSize(ProtobufWriter out, int tagSize, T value);
|
||||
|
||||
@@ -27,11 +32,6 @@ public interface ProtobufEncodeable<W extends Writer, T> extends Encodeable<W, T
|
||||
return false;
|
||||
}
|
||||
|
||||
// 序列化
|
||||
default void convertTo(W out, EnMember member, T value) {
|
||||
convertTo(out, value);
|
||||
}
|
||||
|
||||
// 获取数据类型枚举
|
||||
public ProtobufTypeEnum typeEnum();
|
||||
|
||||
|
||||
@@ -7,7 +7,10 @@ package org.redkale.convert.pb;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.BiFunction;
|
||||
import org.redkale.annotation.Nonnull;
|
||||
import org.redkale.convert.*;
|
||||
import org.redkale.util.Attribute;
|
||||
import org.redkale.util.TypeToken;
|
||||
@@ -24,6 +27,8 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V>
|
||||
private final EnMember keyMember;
|
||||
|
||||
private final EnMember valueMember;
|
||||
private final boolean keySimpled;
|
||||
private final boolean valueSimpled;
|
||||
|
||||
public ProtobufMapEncoder(ConvertFactory factory, Type type) {
|
||||
super(factory, type);
|
||||
@@ -33,10 +38,12 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V>
|
||||
setTag(valueMember, ProtobufFactory.getTag(2, ((ProtobufEncodeable) valueEncoder).typeEnum()));
|
||||
setTagSize(keyMember, ProtobufFactory.computeSInt32SizeNoTag(keyMember.getTag()));
|
||||
setTagSize(valueMember, ProtobufFactory.computeSInt32SizeNoTag(valueMember.getTag()));
|
||||
this.keySimpled = keyEncoder instanceof SimpledCoder;
|
||||
this.valueSimpled = valueEncoder instanceof SimpledCoder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(ProtobufWriter out, EnMember member, Map<K, V> value) {
|
||||
public void convertTo(final ProtobufWriter out, @Nonnull EnMember member, Map<K, V> value) {
|
||||
this.checkInited();
|
||||
final Map<K, V> values = value;
|
||||
if (Utility.isEmpty(value)) {
|
||||
@@ -47,40 +54,71 @@ public class ProtobufMapEncoder<K, V> extends MapEncoder<ProtobufWriter, K, V>
|
||||
BiFunction<K, V, V> mapFieldFunc = out.mapFieldFunc();
|
||||
ProtobufEncodeable kencoder = (ProtobufEncodeable) this.keyEncoder;
|
||||
ProtobufEncodeable vencoder = (ProtobufEncodeable) this.valueEncoder;
|
||||
boolean keySimpled = kencoder instanceof SimpledCoder;
|
||||
boolean valSimpled = vencoder instanceof SimpledCoder;
|
||||
out.writeMapB(values.size(), kencoder, vencoder, value);
|
||||
AtomicBoolean first = new AtomicBoolean(true);
|
||||
values.forEach((key, val0) -> {
|
||||
if (ignoreColumns == null || !ignoreColumns.contains(key)) {
|
||||
V val = mapFieldFunc == null ? val0 : mapFieldFunc.apply(key, val0);
|
||||
if (val != null) {
|
||||
if (!first.get()) {
|
||||
out.writeField(member);
|
||||
ProtobufWriter tmp = out.pollChild();
|
||||
if (keySimpled) {
|
||||
tmp.writeField(keyMember);
|
||||
kencoder.convertTo(tmp, key);
|
||||
} else {
|
||||
kencoder.convertTo(tmp, keyMember, key);
|
||||
}
|
||||
if (valSimpled) {
|
||||
tmp.writeField(valueMember);
|
||||
vencoder.convertTo(tmp, val);
|
||||
} else {
|
||||
vencoder.convertTo(tmp, valueMember, val);
|
||||
}
|
||||
out.offerChild(tmp);
|
||||
}
|
||||
ProtobufWriter subout = out.pollChild();
|
||||
subout.writeTag(keyMember.getTag());
|
||||
if (key == null) {
|
||||
subout.writeLength(0);
|
||||
} else {
|
||||
kencoder.convertTo(subout, keyMember, key);
|
||||
}
|
||||
subout.writeTag(valueMember.getTag());
|
||||
if (val == null) {
|
||||
subout.writeLength(0);
|
||||
} else {
|
||||
vencoder.convertTo(subout, valueMember, val);
|
||||
}
|
||||
out.offerChild(subout);
|
||||
first.set(false);
|
||||
}
|
||||
});
|
||||
out.writeMapE();
|
||||
}
|
||||
|
||||
protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member) {
|
||||
return member != null ? out.pollChild() : out;
|
||||
}
|
||||
|
||||
protected void offerWriter(ProtobufWriter parent, ProtobufWriter out) {
|
||||
if (parent != out) {
|
||||
parent.offerChild(out);
|
||||
}
|
||||
}
|
||||
|
||||
public int computeSize(ProtobufWriter out, K key, V val) {
|
||||
ProtobufEncodeable kencoder = (ProtobufEncodeable) this.keyEncoder;
|
||||
ProtobufEncodeable vencoder = (ProtobufEncodeable) this.valueEncoder;
|
||||
int keySize = kencoder.computeSize(out, keyMember.getTagSize(), key);
|
||||
int valSize = vencoder.computeSize(out, valueMember.getTagSize(), val);
|
||||
return (keySimpled ? (keyMember.getTagSize() + keySize) : keySize)
|
||||
+ (valueSimpled ? (valueMember.getTagSize() + valSize) : valSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int computeSize(ProtobufWriter out, int tagLen, Map<K, V> value) {
|
||||
public int computeSize(ProtobufWriter out, int tagSize, Map<K, V> value) {
|
||||
if (Utility.isEmpty(value)) {
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
Set<String> ignoreColumns = this.ignoreMapColumns;
|
||||
BiFunction<K, V, V> mapFieldFunc = out.mapFieldFunc();
|
||||
AtomicInteger size = new AtomicInteger();
|
||||
value.forEach((key, val0) -> {
|
||||
if (ignoreColumns == null || !ignoreColumns.contains(key)) {
|
||||
V val = mapFieldFunc == null ? val0 : mapFieldFunc.apply(key, val0);
|
||||
if (val != null) {
|
||||
size.addAndGet(tagSize);
|
||||
size.addAndGet(computeSize(out, key, val));
|
||||
}
|
||||
}
|
||||
});
|
||||
return size.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,6 +7,7 @@ package org.redkale.convert.pb;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import org.redkale.annotation.ClassDepends;
|
||||
import org.redkale.annotation.Nullable;
|
||||
import org.redkale.convert.*;
|
||||
import org.redkale.util.Attribute;
|
||||
import org.redkale.util.Utility;
|
||||
@@ -30,30 +31,28 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(ProtobufWriter out, EnMember parentMember, T value) {
|
||||
public void convertTo(ProtobufWriter out, @Nullable EnMember member, T value) {
|
||||
this.checkInited();
|
||||
if (value == null) {
|
||||
out.writeObjectNull(null);
|
||||
return;
|
||||
}
|
||||
if (parentMember != null) {
|
||||
out.writeField(parentMember);
|
||||
}
|
||||
ProtobufWriter objout = objectWriter(out, parentMember, value);
|
||||
objout.writeObjectB(value);
|
||||
|
||||
ProtobufWriter subout = acceptWriter(out, member);
|
||||
subout.writeObjectB(value);
|
||||
int maxPosition = 0;
|
||||
for (EnMember member : members) {
|
||||
maxPosition = member.getPosition();
|
||||
objout.writeObjectField(member, value);
|
||||
for (EnMember fieldMember : members) {
|
||||
maxPosition = fieldMember.getPosition();
|
||||
subout.writeObjectField(fieldMember, value);
|
||||
}
|
||||
if (objout.objExtFunc() != null) {
|
||||
ConvertField[] extFields = objout.objExtFunc().apply(value);
|
||||
if (subout.objExtFunc() != null) {
|
||||
ConvertField[] extFields = subout.objExtFunc().apply(value);
|
||||
if (extFields != null) {
|
||||
Encodeable<ProtobufWriter, ?> anyEncoder = factory.getAnyEncoder();
|
||||
for (ConvertField en : extFields) {
|
||||
if (en != null) {
|
||||
maxPosition++;
|
||||
objout.writeObjectField(
|
||||
subout.writeObjectField(
|
||||
en.getName(),
|
||||
en.getType(),
|
||||
Math.max(en.getPosition(), maxPosition),
|
||||
@@ -63,13 +62,13 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
}
|
||||
}
|
||||
}
|
||||
objout.writeObjectE(value);
|
||||
offerWriter(out, objout);
|
||||
subout.writeObjectE(value);
|
||||
offerWriter(out, subout);
|
||||
}
|
||||
|
||||
@ClassDepends
|
||||
protected ProtobufWriter objectWriter(ProtobufWriter out, EnMember parentMember, T value) {
|
||||
return parentMember != null ? out.pollChild() : out;
|
||||
protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member) {
|
||||
return member != null ? out.pollChild() : out;
|
||||
}
|
||||
|
||||
@ClassDepends
|
||||
@@ -87,7 +86,8 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
}
|
||||
Attribute attr = member.getAttribute();
|
||||
boolean enumtostring = ((ProtobufFactory) factory).enumtostring;
|
||||
this.memberSizeRequired |= ((ProtobufEncodeable) member.getEncoder()).requireSize();
|
||||
this.memberSizeRequired |= !(member.getEncoder() instanceof SimpledCoder)
|
||||
&& ((ProtobufEncodeable) member.getEncoder()).requireSize();
|
||||
setTag(member, ProtobufFactory.getTag(attr.field(), attr.genericType(), member.getPosition(), enumtostring));
|
||||
setTagSize(member, ProtobufFactory.computeSInt32SizeNoTag(member.getTag()));
|
||||
}
|
||||
@@ -107,7 +107,7 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
|
||||
}
|
||||
|
||||
public boolean requiredMemberSize() {
|
||||
return memberSizeRequired;
|
||||
return true||memberSizeRequired;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,6 +7,7 @@ package org.redkale.convert.pb;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.stream.Stream;
|
||||
import org.redkale.annotation.Nonnull;
|
||||
import org.redkale.convert.*;
|
||||
|
||||
/**
|
||||
@@ -26,7 +27,7 @@ public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(ProtobufWriter out, EnMember member, Stream<T> value) {
|
||||
public void convertTo(final ProtobufWriter out, @Nonnull EnMember member, Stream<T> value) {
|
||||
this.checkInited();
|
||||
Object[] array = value == null ? null : value.toArray();
|
||||
if (array == null || array.length < 1) {
|
||||
@@ -34,17 +35,17 @@ public class ProtobufStreamEncoder<T> extends StreamEncoder<ProtobufWriter, T>
|
||||
}
|
||||
ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder;
|
||||
out.writeArrayB(array.length, itemEncoder, array);
|
||||
boolean first = true;
|
||||
for (Object item : array) {
|
||||
out.writeField(member);
|
||||
if (!first) {
|
||||
out.writeField(member);
|
||||
}
|
||||
if (item == null) {
|
||||
out.writeLength(0);
|
||||
} else if (componentSimpled) {
|
||||
itemEncoder.convertTo(out, member, item);
|
||||
} else {
|
||||
ProtobufWriter tmp = out.pollChild();
|
||||
itemEncoder.convertTo(tmp, member, item);
|
||||
out.offerChild(tmp);
|
||||
itemEncoder.convertTo(out, member, item);
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
out.writeArrayE();
|
||||
}
|
||||
|
||||
@@ -437,7 +437,12 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
||||
|
||||
@Override
|
||||
public final void writeString(String value) {
|
||||
byte[] bs = Utility.isLatin1(value) ? Utility.latin1ByteArray(value) : value.getBytes(StandardCharsets.UTF_8);
|
||||
byte[] bs;
|
||||
if (Utility.isLatin1(value)) {
|
||||
bs = Utility.latin1ByteArray(value);
|
||||
} else {
|
||||
bs = value.getBytes(StandardCharsets.UTF_8);
|
||||
}
|
||||
writeLength(bs.length);
|
||||
writeTo(bs);
|
||||
}
|
||||
@@ -1186,12 +1191,8 @@ public class ProtobufWriter extends Writer implements ByteTuple {
|
||||
return;
|
||||
}
|
||||
ProtobufEncodeable encoder = (ProtobufEncodeable) member.getEncoder();
|
||||
if (encoder instanceof SimpledCoder) {
|
||||
this.writeField(member);
|
||||
encoder.convertTo(this, value);
|
||||
} else {
|
||||
encoder.convertTo(this, member, value);
|
||||
}
|
||||
this.writeField(member);
|
||||
encoder.convertTo(this, member, value);
|
||||
}
|
||||
|
||||
@ClassDepends
|
||||
|
||||
@@ -4941,6 +4941,9 @@ public final class Utility {
|
||||
if (value == null) {
|
||||
return -1;
|
||||
}
|
||||
if (value.isEmpty()) {
|
||||
return 0;
|
||||
}
|
||||
char c;
|
||||
int size = 0;
|
||||
final String str = value;
|
||||
|
||||
@@ -26,7 +26,7 @@ public class RequiredBeanTest {
|
||||
|
||||
@Test
|
||||
public void run() throws Exception {
|
||||
RequiredBean bean = RequiredBean.create();
|
||||
RequiredBean bean = createRequiredBean();
|
||||
ProtobufConvert convert = ProtobufConvert.root();
|
||||
byte[] bytes = convert.convertTo(bean);
|
||||
System.out.println("序列化0: 26.[0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,0x62,"
|
||||
@@ -52,83 +52,36 @@ public class RequiredBeanTest {
|
||||
Assertions.assertEquals(jsons1, jsons2);
|
||||
}
|
||||
|
||||
public static RequiredBean createRequiredBean() {
|
||||
RequiredBean bean = new RequiredBean();
|
||||
bean.id = 6;
|
||||
bean.strs1 = new String[] {"aaa", "bbb"};
|
||||
bean.strs2 = List.of("ccc", "ddd");
|
||||
bean.zbig1 = List.of(new AtomicInteger(1), new AtomicInteger(2));
|
||||
return bean;
|
||||
}
|
||||
|
||||
public static class RequiredArray {
|
||||
|
||||
@ConvertColumn(index = 1)
|
||||
private RequiredBean[] beans;
|
||||
public RequiredBean[] beans;
|
||||
|
||||
@ConvertColumn(index = 2)
|
||||
private int id;
|
||||
|
||||
public RequiredBean[] getBeans() {
|
||||
return beans;
|
||||
}
|
||||
|
||||
public void setBeans(RequiredBean[] beans) {
|
||||
this.beans = beans;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
public int id;
|
||||
}
|
||||
|
||||
public static class RequiredBean {
|
||||
|
||||
public static RequiredBean create() {
|
||||
RequiredBean bean = new RequiredBean();
|
||||
bean.id = 6;
|
||||
bean.strs1 = new String[] {"aaa", "bbb"};
|
||||
bean.strs2 = List.of("ccc", "ddd");
|
||||
bean.zbig1 = List.of(new AtomicInteger(1), new AtomicInteger(2));
|
||||
return bean;
|
||||
}
|
||||
|
||||
@ConvertColumn(index = 1)
|
||||
private int id;
|
||||
public int id;
|
||||
|
||||
@ConvertColumn(index = 2)
|
||||
private String[] strs1;
|
||||
public String[] strs1;
|
||||
|
||||
@ConvertColumn(index = 3)
|
||||
private List<String> strs2;
|
||||
public List<String> strs2;
|
||||
|
||||
@ConvertColumn(index = 4)
|
||||
private List<AtomicInteger> zbig1;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String[] getStrs1() {
|
||||
return strs1;
|
||||
}
|
||||
|
||||
public void setStrs1(String[] strs1) {
|
||||
this.strs1 = strs1;
|
||||
}
|
||||
|
||||
public List<String> getStrs2() {
|
||||
return strs2;
|
||||
}
|
||||
|
||||
public void setStrs2(List<String> strs2) {
|
||||
this.strs2 = strs2;
|
||||
}
|
||||
|
||||
public List<AtomicInteger> getZbig1() {
|
||||
return zbig1;
|
||||
}
|
||||
|
||||
public void setZbig1(List<AtomicInteger> zbig1) {
|
||||
this.zbig1 = zbig1;
|
||||
}
|
||||
public List<AtomicInteger> zbig1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,60 +26,60 @@ public class UserBeanProtoDynEncoder extends ProtobufDynEncoder<UserBean> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void convertTo(ProtobufWriter out0, EnMember parentMember, UserBean value) {
|
||||
public void convertTo(ProtobufWriter out, EnMember parentMember, UserBean value) {
|
||||
if (value == null) {
|
||||
return;
|
||||
}
|
||||
ProtobufWriter out = objectWriter(out0, parentMember, value);
|
||||
out.writeObjectB(value);
|
||||
out.writeFieldValue(1, value.getSeqid());
|
||||
out.writeFieldValue(2, value.getName());
|
||||
out.writeFieldValue(3, value.getImg());
|
||||
out.writeFieldValue(4, numberSimpledCoder, value.getNumber());
|
||||
out.writeFieldValue(5, scaleSimpledCoder, value.getScale());
|
||||
out.writeFieldValue(6, value.getBit());
|
||||
ProtobufWriter subout = acceptWriter(out, parentMember);
|
||||
subout.writeObjectB(value);
|
||||
subout.writeFieldValue(1, value.getSeqid());
|
||||
subout.writeFieldValue(2, value.getName());
|
||||
subout.writeFieldValue(3, value.getImg());
|
||||
subout.writeFieldValue(4, numberSimpledCoder, value.getNumber());
|
||||
subout.writeFieldValue(5, scaleSimpledCoder, value.getScale());
|
||||
subout.writeFieldValue(6, value.getBit());
|
||||
|
||||
out.writeFieldValue(7, value.isFlag());
|
||||
out.writeFieldValue(8, value.getStatus());
|
||||
out.writeFieldValue(9, value.getId());
|
||||
out.writeFieldValue(10, value.getCreateTime());
|
||||
out.writeFieldValue(11, value.getPoint());
|
||||
out.writeFieldValue(12, value.getMoney());
|
||||
subout.writeFieldValue(7, value.isFlag());
|
||||
subout.writeFieldValue(8, value.getStatus());
|
||||
subout.writeFieldValue(9, value.getId());
|
||||
subout.writeFieldValue(10, value.getCreateTime());
|
||||
subout.writeFieldValue(11, value.getPoint());
|
||||
subout.writeFieldValue(12, value.getMoney());
|
||||
|
||||
out.writeFieldValue(13, value.getFlag2());
|
||||
out.writeFieldValue(14, value.getStatus2());
|
||||
out.writeFieldValue(15, value.getId2());
|
||||
out.writeFieldValue(16, value.getCreateTime2());
|
||||
out.writeFieldValue(17, value.getPoint2());
|
||||
out.writeFieldValue(18, value.getMoney2());
|
||||
subout.writeFieldValue(13, value.getFlag2());
|
||||
subout.writeFieldValue(14, value.getStatus2());
|
||||
subout.writeFieldValue(15, value.getId2());
|
||||
subout.writeFieldValue(16, value.getCreateTime2());
|
||||
subout.writeFieldValue(17, value.getPoint2());
|
||||
subout.writeFieldValue(18, value.getMoney2());
|
||||
|
||||
out.writeFieldValue(19, value.id3);
|
||||
out.writeFieldValue(20, value.createTime3);
|
||||
out.writeFieldValue(21, value.point3);
|
||||
out.writeFieldValue(22, value.money3);
|
||||
out.writeFieldValue(23, value.bit3);
|
||||
subout.writeFieldValue(19, value.id3);
|
||||
subout.writeFieldValue(20, value.createTime3);
|
||||
subout.writeFieldValue(21, value.point3);
|
||||
subout.writeFieldValue(22, value.money3);
|
||||
subout.writeFieldValue(23, value.bit3);
|
||||
|
||||
out.writeFieldValue(19, value.getId4());
|
||||
out.writeFieldValue(20, value.getCreateTime4());
|
||||
out.writeFieldValue(21, value.getPoint4());
|
||||
out.writeFieldValue(22, value.getMoney4());
|
||||
out.writeFieldValue(23, value.getBit4());
|
||||
subout.writeFieldValue(19, value.getId4());
|
||||
subout.writeFieldValue(20, value.getCreateTime4());
|
||||
subout.writeFieldValue(21, value.getPoint4());
|
||||
subout.writeFieldValue(22, value.getMoney4());
|
||||
subout.writeFieldValue(23, value.getBit4());
|
||||
|
||||
out.writeFieldValue(19, value.getId5());
|
||||
out.writeFieldValue(20, value.getCreateTime5());
|
||||
out.writeFieldValue(21, value.getPoint5());
|
||||
out.writeFieldValue(22, value.getMoney5());
|
||||
out.writeFieldValue(23, value.getBit5());
|
||||
subout.writeFieldValue(19, value.getId5());
|
||||
subout.writeFieldValue(20, value.getCreateTime5());
|
||||
subout.writeFieldValue(21, value.getPoint5());
|
||||
subout.writeFieldValue(22, value.getMoney5());
|
||||
subout.writeFieldValue(23, value.getBit5());
|
||||
|
||||
out.writeFieldIntsValue(19, value.getId6());
|
||||
out.writeFieldLongsValue(20, value.getCreateTime6());
|
||||
out.writeFieldFloatsValue(21, value.getPoint6());
|
||||
out.writeFieldDoublesValue(22, value.getMoney6());
|
||||
out.writeFieldBytesValue(23, value.getBit6());
|
||||
out.writeFieldStringsValue(23, value.getStrs());
|
||||
subout.writeFieldIntsValue(19, value.getId6());
|
||||
subout.writeFieldLongsValue(20, value.getCreateTime6());
|
||||
subout.writeFieldFloatsValue(21, value.getPoint6());
|
||||
subout.writeFieldDoublesValue(22, value.getMoney6());
|
||||
subout.writeFieldBytesValue(23, value.getBit6());
|
||||
subout.writeFieldStringsValue(23, value.getStrs());
|
||||
|
||||
out.writeObjectField(mapEnMember, value);
|
||||
out.writeObjectE(value);
|
||||
offerWriter(out0, out);
|
||||
subout.writeObjectField(mapEnMember, value);
|
||||
subout.writeObjectE(value);
|
||||
offerWriter(out, subout);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
*/
|
||||
package org.redkale.test.convert.pb;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Type;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.redkale.convert.Encodeable;
|
||||
@@ -19,10 +21,20 @@ public class UserDynTest {
|
||||
public static void main(String[] args) throws Throwable {
|
||||
UserDynTest test = new UserDynTest();
|
||||
test.run1();
|
||||
test.run2();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void run1() throws Exception {
|
||||
ProtobufFactory factory = ProtobufFactory.root();
|
||||
Method method = ProtobufFactory.class.getDeclaredMethod("createObjectEncoder", Type.class);
|
||||
method.setAccessible(true);
|
||||
Encodeable encoder = (Encodeable) method.invoke(factory, UserBean.class);
|
||||
Assertions.assertTrue(!ProtobufDynEncoder.class.isAssignableFrom(encoder.getClass()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void run2() throws Exception {
|
||||
ProtobufFactory factory = ProtobufFactory.root();
|
||||
Encodeable encoder = factory.loadEncoder(UserBean.class);
|
||||
Assertions.assertTrue(ProtobufDynEncoder.class.isAssignableFrom(encoder.getClass()));
|
||||
|
||||
Reference in New Issue
Block a user