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