diff --git a/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java b/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java index ac6cc7bd8..c508710eb 100644 --- a/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/InetAddressSimpledCoder.java @@ -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 extends this.bsSimpledCoder = Objects.requireNonNull(bSimpledCoder); } - @Override public void convertTo(W out, InetAddress value) { if (value == null) { @@ -70,25 +71,38 @@ public class InetAddressSimpledCoder extends public static final InetSocketAddressSimpledCoder instance = new InetSocketAddressSimpledCoder(); + protected final SimpledCoder bsSimpledCoder; + + protected InetSocketAddressSimpledCoder() { + this.bsSimpledCoder = ByteArraySimpledCoder.instance; + } + + public InetSocketAddressSimpledCoder(SimpledCoder 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; } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java index 08346413e..c9079dc70 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java @@ -27,24 +27,24 @@ public class ProtobufArrayEncoder extends ArrayEncoder } @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(); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java index 68c1a8eac..27ef2ec60 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java @@ -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 diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java index 0f7dfd5e3..a751eea55 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java @@ -27,24 +27,24 @@ public class ProtobufCollectionEncoder extends CollectionEncoder value) { + public void convertTo(final ProtobufWriter out, EnMember member, Collection 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(); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java index 70db33e80..f18518c73 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufDynEncoder.java @@ -49,9 +49,9 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { 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 simpledCoders = new HashMap<>(); final Map otherMembers = new HashMap<>(); StringBuilder elementb = new StringBuilder(); @@ -159,26 +159,15 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { 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); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java b/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java index 4aceb8e2c..a19b520ae 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java @@ -19,6 +19,11 @@ import org.redkale.convert.Writer; */ public interface ProtobufEncodeable extends Encodeable { + // 序列化 + 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 extends Encodeable extends MapEncoder 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 extends MapEncoder 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 value) { + public void convertTo(final ProtobufWriter out, @Nonnull EnMember member, Map value) { this.checkInited(); final Map values = value; if (Utility.isEmpty(value)) { @@ -47,40 +54,71 @@ public class ProtobufMapEncoder extends MapEncoder BiFunction 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 value) { + public int computeSize(ProtobufWriter out, int tagSize, Map value) { if (Utility.isEmpty(value)) { return 0; } - return 0; + Set ignoreColumns = this.ignoreMapColumns; + BiFunction 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 diff --git a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java index 2d294dd65..8b2632b8a 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java @@ -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 extends ObjectEncoder } @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 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 extends ObjectEncoder } } } - 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 extends ObjectEncoder } 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 extends ObjectEncoder } public boolean requiredMemberSize() { - return memberSizeRequired; + return true||memberSizeRequired; } @Override diff --git a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java index e3a3b35b6..00275360e 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java @@ -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 extends StreamEncoder } @Override - public void convertTo(ProtobufWriter out, EnMember member, Stream value) { + public void convertTo(final ProtobufWriter out, @Nonnull EnMember member, Stream value) { this.checkInited(); Object[] array = value == null ? null : value.toArray(); if (array == null || array.length < 1) { @@ -34,17 +35,17 @@ public class ProtobufStreamEncoder extends StreamEncoder } 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(); } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java index 876f3885f..7c802d5b1 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java @@ -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 diff --git a/src/main/java/org/redkale/util/Utility.java b/src/main/java/org/redkale/util/Utility.java index 9701cbb68..2a2209900 100644 --- a/src/main/java/org/redkale/util/Utility.java +++ b/src/main/java/org/redkale/util/Utility.java @@ -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; diff --git a/src/test/java/org/redkale/test/convert/pb/RequiredBeanTest.java b/src/test/java/org/redkale/test/convert/pb/RequiredBeanTest.java index c86e8d47a..b2630ee91 100644 --- a/src/test/java/org/redkale/test/convert/pb/RequiredBeanTest.java +++ b/src/test/java/org/redkale/test/convert/pb/RequiredBeanTest.java @@ -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 strs2; + public List strs2; @ConvertColumn(index = 4) - private List 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 getStrs2() { - return strs2; - } - - public void setStrs2(List strs2) { - this.strs2 = strs2; - } - - public List getZbig1() { - return zbig1; - } - - public void setZbig1(List zbig1) { - this.zbig1 = zbig1; - } + public List zbig1; } } diff --git a/src/test/java/org/redkale/test/convert/pb/UserBeanProtoDynEncoder.java b/src/test/java/org/redkale/test/convert/pb/UserBeanProtoDynEncoder.java index c1a041cc3..1cb1759b7 100644 --- a/src/test/java/org/redkale/test/convert/pb/UserBeanProtoDynEncoder.java +++ b/src/test/java/org/redkale/test/convert/pb/UserBeanProtoDynEncoder.java @@ -26,60 +26,60 @@ public class UserBeanProtoDynEncoder extends ProtobufDynEncoder { } @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); } } diff --git a/src/test/java/org/redkale/test/convert/pb/UserDynTest.java b/src/test/java/org/redkale/test/convert/pb/UserDynTest.java index 9fbfaea19..296faf06a 100644 --- a/src/test/java/org/redkale/test/convert/pb/UserDynTest.java +++ b/src/test/java/org/redkale/test/convert/pb/UserDynTest.java @@ -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()));