From a3cbc19de925c0cd9ac49668e626b559c1265299 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 4 Oct 2024 18:13:12 +0800 Subject: [PATCH] pb --- .../convert/pb/ProtobufArrayEncoder.java | 26 ++++++--- .../redkale/convert/pb/ProtobufCoders.java | 58 +++++++++---------- .../convert/pb/ProtobufCollectionEncoder.java | 26 ++++++--- .../convert/pb/ProtobufDynEncoder.java | 4 +- .../convert/pb/ProtobufObjectEncoder.java | 13 +++-- .../convert/pb/ProtobufStreamEncoder.java | 26 ++++++--- .../redkale/convert/pb/ProtobufWriter.java | 4 +- 7 files changed, 97 insertions(+), 60 deletions(-) diff --git a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java index 186f1fe62..e3aee953b 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java @@ -59,10 +59,14 @@ public class ProtobufArrayEncoder extends ArrayEncoder } protected void convertPrimitivedTo(final ProtobufWriter out, @Nonnull EnMember member, T[] value) { - out.writeLength(computeSize(out, 0, value)); - Encodeable itemCoder = getComponentEncoder(); + ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; + int dataSize = 0; + for (Object item : value) { + dataSize += itemEncoder.computeSize(out, 0, item); + } + out.writeLength(dataSize); for (T item : value) { - itemCoder.convertTo(out, item); + itemEncoder.convertTo(out, item); } } @@ -72,10 +76,18 @@ public class ProtobufArrayEncoder extends ArrayEncoder return 0; } ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; - int dataSize = componentPrimitived ? 0 : tagSize * (value.length - 1); - for (Object item : value) { - dataSize += itemEncoder.computeSize(out, tagSize, item); + if (componentPrimitived) { + int dataSize = 0; + for (T item : value) { + dataSize += itemEncoder.computeSize(out, tagSize, item); + } + return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize; + } else { + int dataSize = tagSize * (value.length - 1); + for (T item : value) { + dataSize += itemEncoder.computeSize(out, tagSize, item); + } + return dataSize; } - return dataSize; } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java index 5083c965a..37ae3d2c1 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java @@ -275,7 +275,7 @@ public abstract class ProtobufCoders { return 0; } int len = Utility.encodeUTF8Length(value); - return len; + return len + ProtobufFactory.computeSInt32SizeNoTag(len); } @Override @@ -614,7 +614,7 @@ public abstract class ProtobufCoders { } byte[] bs = value.toByteArray(); int len = bs.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } @Override @@ -658,7 +658,7 @@ public abstract class ProtobufCoders { } byte[] bs = value.getAddress(); int len = bs.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } @Override @@ -685,7 +685,7 @@ public abstract class ProtobufCoders { } byte[] bs = value.getAddress().getAddress(); int len = bs.length + 2; // port固定2字节 - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } @Override @@ -732,7 +732,7 @@ public abstract class ProtobufCoders { } byte[] bs = value.getBytes(); int len = bs.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } @Override @@ -763,7 +763,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -788,7 +788,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -816,7 +816,7 @@ public abstract class ProtobufCoders { for (char item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -844,7 +844,7 @@ public abstract class ProtobufCoders { for (short item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -872,7 +872,7 @@ public abstract class ProtobufCoders { for (int item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -897,7 +897,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length << 2; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -925,7 +925,7 @@ public abstract class ProtobufCoders { for (long item : value) { len += ProtobufFactory.computeSInt64SizeNoTag(item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -950,7 +950,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length << 3; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -976,7 +976,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1001,7 +1001,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1029,7 +1029,7 @@ public abstract class ProtobufCoders { for (Character item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1057,7 +1057,7 @@ public abstract class ProtobufCoders { for (Short item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1085,7 +1085,7 @@ public abstract class ProtobufCoders { for (Integer item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1110,7 +1110,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length << 2; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1138,7 +1138,7 @@ public abstract class ProtobufCoders { for (Long item : value) { len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1163,7 +1163,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.length << 3; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1194,7 +1194,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.size(); - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1224,7 +1224,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.size(); - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1257,7 +1257,7 @@ public abstract class ProtobufCoders { for (Character item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1290,7 +1290,7 @@ public abstract class ProtobufCoders { for (Short item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1323,7 +1323,7 @@ public abstract class ProtobufCoders { for (Integer item : value) { len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1353,7 +1353,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.size() << 2; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1386,7 +1386,7 @@ public abstract class ProtobufCoders { for (Long item : value) { len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : item); } - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } @@ -1416,7 +1416,7 @@ public abstract class ProtobufCoders { return 0; } int len = value.size() << 3; - return len; + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; } } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java index b56578d25..2dfaaa315 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCollectionEncoder.java @@ -59,10 +59,14 @@ public class ProtobufCollectionEncoder extends CollectionEncoder value) { - out.writeLength(computeSize(out, 0, value)); - Encodeable itemCoder = getComponentEncoder(); + ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; + int dataSize = 0; + for (Object item : value) { + dataSize += itemEncoder.computeSize(out, 0, item); + } + out.writeLength(dataSize); for (T item : value) { - itemCoder.convertTo(out, item); + itemEncoder.convertTo(out, item); } } @@ -72,10 +76,18 @@ 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 (true) { - return null; - } + final Map simpledCoders = new HashMap<>(); final Map otherMembers = new HashMap<>(); StringBuilder elementb = new StringBuilder(); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java index 14cd5aa44..a0d9d0771 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufObjectEncoder.java @@ -67,11 +67,11 @@ public class ProtobufObjectEncoder extends ObjectEncoder @ClassDepends protected ProtobufWriter acceptWriter(ProtobufWriter out, EnMember member, T value) { -// if (member != null) { -// out.writeLength(computeSize(out, member.getTagSize(), value)); -// return out; -// } -// return out; + // if (member != null) { + // out.writeLength(computeSize(out, member.getTagSize(), value)); + // return out; + // } + // return out; return member != null ? out.pollChild() : out; } @@ -96,6 +96,9 @@ public class ProtobufObjectEncoder extends ObjectEncoder @Override public int computeSize(ProtobufWriter out, int tagSize, T value) { + if (value == null) { + return 0; + } int dataSize = 0; BiFunction objFieldFunc = out.objFieldFunc(); for (EnMember member : members) { diff --git a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java index 9a2b3ea5a..f237171a7 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufStreamEncoder.java @@ -60,10 +60,14 @@ public class ProtobufStreamEncoder extends StreamEncoder } protected void convertPrimitivedTo(final ProtobufWriter out, @Nonnull EnMember member, Object[] value) { - out.writeLength(computeSize(out, 0, value)); - Encodeable itemCoder = getComponentEncoder(); + ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; + int dataSize = 0; for (Object item : value) { - itemCoder.convertTo(out, (T) item); + dataSize += itemEncoder.computeSize(out, 0, item); + } + out.writeLength(dataSize); + for (Object item : value) { + itemEncoder.convertTo(out, item); } } @@ -78,10 +82,18 @@ public class ProtobufStreamEncoder extends StreamEncoder protected int computeSize(ProtobufWriter out, int tagSize, Object[] value) { ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; - int dataSize = componentPrimitived ? 0 : tagSize * (value.length - 1); - for (Object item : value) { - dataSize += itemEncoder.computeSize(out, tagSize, item); + if (componentPrimitived) { + int dataSize = 0; + for (Object item : value) { + dataSize += itemEncoder.computeSize(out, tagSize, item); + } + return ProtobufFactory.computeSInt32SizeNoTag(dataSize) + dataSize; + } else { + int dataSize = tagSize * (value.length - 1); + for (Object item : value) { + dataSize += itemEncoder.computeSize(out, tagSize, item); + } + return dataSize; } - 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 4d29092ab..a6d6de150 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufWriter.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufWriter.java @@ -145,7 +145,7 @@ public abstract class ProtobufWriter extends Writer { return count; } - public final @Nullable Object[] putStreamArray(Stream stream) { + public final @Nullable Object[] putStreamArray(@Nullable Stream stream) { if (stream == null) { return null; } @@ -157,7 +157,7 @@ public abstract class ProtobufWriter extends Writer { return rs; } - public final @Nullable Object[] getStreamArray(Stream stream) { + public final @Nullable Object[] getStreamArray(@Nullable Stream stream) { if (stream == null) { return null; }