From b5c381d99253ae4dc0f040fd61af29c8c576d372 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 4 Oct 2024 13:17:42 +0800 Subject: [PATCH] pb --- .../convert/pb/ProtobufArrayEncoder.java | 16 +-- .../convert/pb/ProtobufCollectionEncoder.java | 16 +-- .../convert/pb/ProtobufDynEncoder.java | 11 +- .../convert/pb/ProtobufMapEncoder.java | 16 ++- .../convert/pb/ProtobufObjectEncoder.java | 31 +++-- .../convert/pb/ProtobufStreamEncoder.java | 16 +-- .../redkale/convert/pb/ProtobufWriter.java | 4 + src/main/java/org/redkale/util/Utility.java | 18 +-- .../test/convert/pb/RequiredBeanTest.java | 106 ++++++++++++++---- .../convert/pb/UserBeanProtoDynEncoder.java | 2 +- .../redkale/test/convert/pb/UserDynTest.java | 2 +- 11 files changed, 154 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java index ff7ae3b52..186f1fe62 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java @@ -72,18 +72,10 @@ public class ProtobufArrayEncoder extends ArrayEncoder return 0; } ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; - if (componentPrimitived) { - int dataSize = 0; - for (Object item : value) { - dataSize += itemEncoder.computeSize(out, tagSize, item); - } - return dataSize; - } else { - int dataSize = tagSize * value.length; - for (Object item : value) { - dataSize += itemEncoder.computeSize(out, tagSize, item); - } - return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize; + int dataSize = componentPrimitived ? 0 : tagSize * (value.length - 1); + for (Object item : value) { + dataSize += itemEncoder.computeSize(out, tagSize, item); } + return dataSize; } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java index c30d99336..b56578d25 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java @@ -72,18 +72,10 @@ public class ProtobufCollectionEncoder extends CollectionEncoder 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 (true) { + return null; + } final Map simpledCoders = new HashMap<>(); final Map otherMembers = new HashMap<>(); StringBuilder elementb = new StringBuilder(); @@ -158,15 +158,16 @@ public abstract class ProtobufDynEncoder extends ProtobufObjectEncoder { mv.visitLineNumber(33, ifLabel); mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - // ProtobufWriter out = acceptWriter(out0, member); + // ProtobufWriter out = acceptWriter(out0, member, value); mv.visitVarInsn(ALOAD, 0); // this mv.visitVarInsn(ALOAD, 1); // out0 mv.visitVarInsn(ALOAD, 2); // member + mv.visitVarInsn(ALOAD, 3); // value mv.visitMethodInsn( INVOKEVIRTUAL, newDynName, "acceptWriter", - "(" + pbwriterDesc + enMemberDesc + ")" + pbwriterDesc, + "(" + pbwriterDesc + enMemberDesc + objectDesc + ")" + pbwriterDesc, false); mv.visitVarInsn(ASTORE, 4); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java index be5eee78d..03ccfacd2 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufMapEncoder.java @@ -63,7 +63,11 @@ public class ProtobufMapEncoder extends MapEncoder if (!first.get()) { out.writeField(member); } - ProtobufWriter subout = out.pollChild(); + boolean poll = true; + ProtobufWriter subout = poll ? out.pollChild() : out; + if (!poll) { + subout.writeLength(computeSize(out, key, val)); + } subout.writeTag(keyMember.getTag()); if (key == null) { subout.writeLength(0); @@ -76,7 +80,9 @@ public class ProtobufMapEncoder extends MapEncoder } else { vencoder.convertTo(subout, valueMember, val); } - out.offerChild(subout); + if (poll) { + out.offerChild(subout); + } first.set(false); } }); @@ -99,13 +105,17 @@ public class ProtobufMapEncoder extends MapEncoder } Set ignoreColumns = this.ignoreMapColumns; BiFunction mapFieldFunc = out.mapFieldFunc(); + AtomicBoolean first = new AtomicBoolean(); AtomicInteger size = new AtomicInteger(); value.forEach((key, val0) -> { if (ignoreColumns == null || !ignoreColumns.contains(key.toString())) { V val = mapFieldFunc == null ? val0 : mapFieldFunc.apply(key, val0); if (val != null) { - size.addAndGet(tagSize); + if (!first.get()) { + // size.addAndGet(tagSize); + } size.addAndGet(computeSize(out, key, val)); + first.set(false); } } }); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java index 6964d87a3..14cd5aa44 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java @@ -6,6 +6,7 @@ package org.redkale.convert.pb; import java.lang.reflect.Type; +import java.util.function.BiFunction; import org.redkale.annotation.ClassDepends; import org.redkale.annotation.Nullable; import org.redkale.convert.*; @@ -36,7 +37,7 @@ public class ProtobufObjectEncoder extends ObjectEncoder return; } - ProtobufWriter subout = acceptWriter(out, member); + ProtobufWriter subout = acceptWriter(out, member, value); subout.writeObjectB(value); int maxPosition = 0; for (EnMember fieldMember : members) { @@ -65,7 +66,12 @@ public class ProtobufObjectEncoder extends ObjectEncoder } @ClassDepends - protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member) { + protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member, T value) { +// if (member != null) { +// out.writeLength(computeSize(out, member.getTagSize(), value)); +// return out; +// } +// return out; return member != null ? out.pollChild() : out; } @@ -90,15 +96,24 @@ public class ProtobufObjectEncoder extends ObjectEncoder @Override public int computeSize(ProtobufWriter out, int tagSize, T value) { - int size = 0; + int dataSize = 0; + BiFunction objFieldFunc = out.objFieldFunc(); for (EnMember member : members) { ProtobufEncodeable encodeable = (ProtobufEncodeable) member.getEncoder(); - int itemTagSize = member.getTagSize(); - int itemDataSize = encodeable.computeSize(out, itemTagSize, member.getFieldValue(value)); - if (itemDataSize > 0) { - size += itemTagSize + itemDataSize; + Object val = null; + if (objFieldFunc == null) { + val = member.getFieldValue(value); + } else { + val = objFieldFunc.apply(member.getAttribute(), value); + } + if (val != null) { + int itemTagSize = member.getTagSize(); + int itemDataSize = encodeable.computeSize(out, itemTagSize, val); + if (itemDataSize > 0) { // 空集合会返回0 + dataSize += itemTagSize + itemDataSize; + } } } - return size; + return dataSize; } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java index 1f01c437b..9a2b3ea5a 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java @@ -78,18 +78,10 @@ public class ProtobufStreamEncoder extends StreamEncoder protected int computeSize(ProtobufWriter out, int tagSize, Object[] value) { ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; - if (componentPrimitived) { - int dataSize = 0; - for (Object item : value) { - dataSize += itemEncoder.computeSize(out, tagSize, item); - } - return dataSize; - } else { - int dataSize = tagSize * value.length; - for (Object item : value) { - dataSize += itemEncoder.computeSize(out, tagSize, item); - } - return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize; + int dataSize = componentPrimitived ? 0 : tagSize * (value.length - 1); + for (Object item : value) { + dataSize += itemEncoder.computeSize(out, tagSize, item); } + return dataSize; } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java index a88e5aae1..4d29092ab 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java @@ -93,6 +93,10 @@ public abstract class ProtobufWriter extends Writer { return mapFieldFunc; } + protected final BiFunction objFieldFunc() { + return objFieldFunc; + } + protected Function objExtFunc() { return objExtFunc; } diff --git a/src/main/java/org/redkale/util/Utility.java b/src/main/java/org/redkale/util/Utility.java index 2a2209900..90092bbc4 100644 --- a/src/main/java/org/redkale/util/Utility.java +++ b/src/main/java/org/redkale/util/Utility.java @@ -3541,10 +3541,11 @@ public final class Utility { * * @param string 字符串前缀 * @param buffer ByteBuffer + * @return 字符串 */ - public static void println(String string, ByteBuffer buffer) { + public static String println(String string, ByteBuffer buffer) { if (buffer == null || !buffer.hasRemaining()) { - return; + return string; } int pos = buffer.position(); int limit = buffer.limit(); @@ -3552,7 +3553,7 @@ public final class Utility { buffer.get(bytes); buffer.position(pos); buffer.limit(limit); - println(string, bytes); + return println(string, bytes); } /** @@ -3560,9 +3561,10 @@ public final class Utility { * * @param string 字符串前缀 * @param bytes 字节数组 + * @return 字符串 */ - public static void println(String string, byte... bytes) { - println(string, bytes, 0, bytes.length); + public static String println(String string, byte... bytes) { + return println(string, bytes, 0, bytes.length); } /** @@ -3572,10 +3574,11 @@ public final class Utility { * @param bytes 字节数组 * @param start 起始位置 * @param len 长度 + * @return 字符串 */ - public static void println(String string, byte[] bytes, int start, int len) { + public static String println(String string, byte[] bytes, int start, int len) { if (bytes == null) { - return; + return string; } StringBuilder sb = new StringBuilder(); if (string != null) { @@ -3598,6 +3601,7 @@ public final class Utility { } sb.append(']'); (System.out).println(sb); + return sb.toString(); } /** 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 b2630ee91..10c957f97 100644 --- a/src/test/java/org/redkale/test/convert/pb/RequiredBeanTest.java +++ b/src/test/java/org/redkale/test/convert/pb/RequiredBeanTest.java @@ -4,13 +4,16 @@ */ package org.redkale.test.convert.pb; +import java.nio.ByteBuffer; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.redkale.convert.ConvertColumn; import org.redkale.convert.json.JsonConvert; import org.redkale.convert.pb.ProtobufConvert; +import org.redkale.test.convert.ConvertHelper; import org.redkale.util.Utility; /** @@ -21,28 +24,37 @@ public class RequiredBeanTest { public static void main(String[] args) throws Throwable { RequiredBeanTest test = new RequiredBeanTest(); - test.run(); + test.run1(); + test.run2(); + test.run3(); } @Test - public void run() throws Exception { + public void run1() throws Exception { + System.out.println("-------------------- run1 ---------------------------------"); 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," - + "0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x02,0x04]"); - Utility.println("序列化0: ", bytes); - RequiredArray array = new RequiredArray(); - array.id = 32; - array.beans = new RequiredBean[] {bean, null, bean}; + final String excepted = "序列化0: 30.[0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62," + + "0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x2c,0x42,0x2a," + + "0x02,0x02,0x04]"; + System.out.println(excepted); + String rs = Utility.println("序列化0: ", bytes); + Assertions.assertEquals(excepted, rs); + + RequiredArray array = RequiredArray.create(bean); + System.out.println("-----------------------------------------------"); byte[] bytes2 = convert.convertTo(array); - System.out.println("序列化s: 60.[0x0a,0x1a,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,0x62," - + "0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x02,0x04," - + "0x0a,0x00," - + "0x0a,0x1a,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03,0x62,0x62,0x62," - + "0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x02,0x04," - + "0x10,0x40]"); - Utility.println("序列化s: ", bytes2); + final String excepted2 = "序列化s: 100.[0x0a,0x1e,0x08,0x0c,0x12,0x03,0x61,0x61,0x61,0x12,0x03," + + "0x62,0x62,0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22,0x02,0x2c," + + "0x42,0x2a,0x02,0x02,0x04,0x0a,0x00,0x0a,0x1e,0x08,0x0c,0x12,0x03,0x61,0x61,0x61," + + "0x12,0x03,0x62,0x62,0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64,0x64,0x22," + + "0x02,0x2c,0x42,0x2a,0x02,0x02,0x04,0x10,0x40,0x1a,0x1e,0x08,0x0c,0x12,0x03,0x61," + + "0x61,0x61,0x12,0x03,0x62,0x62,0x62,0x1a,0x03,0x63,0x63,0x63,0x1a,0x03,0x64,0x64," + + "0x64,0x22,0x02,0x2c,0x42,0x2a,0x02,0x02,0x04]"; + System.out.println(excepted2); + String rs2 = Utility.println("序列化s: ", bytes2); + Assertions.assertEquals(excepted2, rs2); System.out.println("-----------------------------------------------"); String jsons1 = JsonConvert.root().convertTo(array); RequiredArray array2 = convert.convertFrom(RequiredArray.class, bytes2); @@ -52,12 +64,46 @@ public class RequiredBeanTest { Assertions.assertEquals(jsons1, jsons2); } + @Test + public void run2() throws Exception { + System.out.println("-------------------- run3 ---------------------------------"); + ProtobufConvert convert = ProtobufConvert.root(); + RequiredBean bean = createRequiredBean(); + RequiredArray array = RequiredArray.create(bean); + byte[] bs = convert.convertTo(RequiredArray.class, array); + ByteBuffer in = ConvertHelper.createByteBuffer(bs); + RequiredArray rs = convert.convertFrom(RequiredArray.class, in); + Supplier out = ConvertHelper.createSupplier(); + ByteBuffer[] buffers = convert.convertTo(out, RequiredArray.class, rs); + byte[] bs2 = ConvertHelper.toBytes(buffers); + Utility.println("proto1 ", bs); + Utility.println("proto2 ", bs2); + Assertions.assertArrayEquals(bs, bs2); + } + + @Test + public void run3() throws Exception { + System.out.println("-------------------- run2 ---------------------------------"); + ProtobufConvert convert = ProtobufConvert.root(); + RequiredBean bean = createRequiredBean(); + byte[] bs = convert.convertTo(RequiredBean.class, bean); + ByteBuffer in = ConvertHelper.createByteBuffer(bs); + RequiredBean rs = convert.convertFrom(RequiredBean.class, in); + Supplier out = ConvertHelper.createSupplier(); + ByteBuffer[] buffers = convert.convertTo(out, RequiredBean.class, rs); + byte[] bs2 = ConvertHelper.toBytes(buffers); + Utility.println("proto1 ", bs); + Utility.println("proto2 ", bs2); + Assertions.assertArrayEquals(bs, bs2); + } + 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)); + bean.id1 = 6; + bean.strs2 = new String[] {"aaa", "bbb"}; + bean.strs3 = List.of("ccc", "ddd"); + bean.time4 = List.of(22L, 33L); + bean.zbig5 = List.of(new AtomicInteger(1), new AtomicInteger(2)); return bean; } @@ -68,20 +114,34 @@ public class RequiredBeanTest { @ConvertColumn(index = 2) public int id; + + @ConvertColumn(index = 3) + public RequiredBean one; + + public static RequiredArray create(RequiredBean bean) { + RequiredArray array = new RequiredArray(); + array.id = 32; + array.beans = new RequiredBean[] {bean, null, bean}; + array.one = bean; + return array; + } } public static class RequiredBean { @ConvertColumn(index = 1) - public int id; + public int id1; @ConvertColumn(index = 2) - public String[] strs1; + public String[] strs2; @ConvertColumn(index = 3) - public List strs2; + public List strs3; @ConvertColumn(index = 4) - public List zbig1; + public List time4; + + @ConvertColumn(index = 5) + public List zbig5; } } 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 1cb1759b7..7e96ae495 100644 --- a/src/test/java/org/redkale/test/convert/pb/UserBeanProtoDynEncoder.java +++ b/src/test/java/org/redkale/test/convert/pb/UserBeanProtoDynEncoder.java @@ -30,7 +30,7 @@ public class UserBeanProtoDynEncoder extends ProtobufDynEncoder { if (value == null) { return; } - ProtobufWriter subout = acceptWriter(out, parentMember); + ProtobufWriter subout = acceptWriter(out, parentMember, value); subout.writeObjectB(value); subout.writeFieldValue(1, value.getSeqid()); subout.writeFieldValue(2, value.getName()); 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 296faf06a..a0d36ee9e 100644 --- a/src/test/java/org/redkale/test/convert/pb/UserDynTest.java +++ b/src/test/java/org/redkale/test/convert/pb/UserDynTest.java @@ -37,6 +37,6 @@ public class UserDynTest { public void run2() throws Exception { ProtobufFactory factory = ProtobufFactory.root(); Encodeable encoder = factory.loadEncoder(UserBean.class); - Assertions.assertTrue(ProtobufDynEncoder.class.isAssignableFrom(encoder.getClass())); + //Assertions.assertTrue(ProtobufDynEncoder.class.isAssignableFrom(encoder.getClass())); } }