From e7f05c31e03db2e7bbbc17c087dd574f9394b841 Mon Sep 17 00:00:00 2001 From: redkale Date: Mon, 30 Sep 2024 18:38:50 +0800 Subject: [PATCH] Protobuf --- .../org/redkale/convert/ObjectDecoder.java | 4 +- .../org/redkale/convert/ObjectEncoder.java | 4 +- .../convert/ext/AtomicLongSimpledCoder.java | 2 +- .../redkale/convert/ext/BoolSimpledCoder.java | 2 +- .../redkale/convert/ext/ByteSimpledCoder.java | 2 +- .../redkale/convert/ext/CharSimpledCoder.java | 2 +- .../redkale/convert/ext/DateSimpledCoder.java | 2 +- .../convert/ext/DoubleSimpledCoder.java | 2 +- .../convert/ext/FloatSimpledCoder.java | 2 +- .../redkale/convert/ext/IntSimpledCoder.java | 2 +- .../convert/ext/LocalDateSimpledCoder.java | 6 +- .../ext/LocalDateTimeSimpledCoder.java | 2 +- .../convert/ext/LocalTimeSimpledCoder.java | 2 +- .../redkale/convert/ext/LongSimpledCoder.java | 2 +- .../convert/ext/NumberSimpledCoder.java | 2 +- .../convert/ext/ShortSimpledCoder.java | 2 +- .../convert/ext/StringSimpledCoder.java | 6 +- .../ext/StringWrapperSimpledCoder.java | 2 +- .../convert/pb/ProtobufArrayEncoder.java | 23 +- .../redkale/convert/pb/ProtobufCoders.java | 846 +++++++++++++++++- .../convert/pb/ProtobufEncodeable.java | 27 + .../redkale/convert/pb/ProtobufFactory.java | 91 +- .../convert/pb/ProtobufObjectEncoder.java | 13 +- .../redkale/test/util/SelectColumnTest.java | 6 +- 24 files changed, 954 insertions(+), 100 deletions(-) create mode 100644 src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java diff --git a/src/main/java/org/redkale/convert/ObjectDecoder.java b/src/main/java/org/redkale/convert/ObjectDecoder.java index 399c749a2..e24c27c61 100644 --- a/src/main/java/org/redkale/convert/ObjectDecoder.java +++ b/src/main/java/org/redkale/convert/ObjectDecoder.java @@ -112,7 +112,7 @@ public class ObjectDecoder implements Decodeable { field.getGenericType(), field.getAnnotationsByType(ConvertCoder.class), false); Decodeable fieldCoder; if (small != null && field.getType() == String.class) { - fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + fieldCoder = StringSimpledCoder.StandardStringSimpledCoder.instance; } else { fieldCoder = colFactory.findFieldCoder(clazz, field.getName()); } @@ -216,7 +216,7 @@ public class ObjectDecoder implements Decodeable { } Decodeable fieldCoder; if (small != null && method.getParameterTypes()[0] == String.class) { - fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + fieldCoder = StringSimpledCoder.StandardStringSimpledCoder.instance; } else { fieldCoder = colFactory.findFieldCoder(clazz, ConvertFactory.readGetSetFieldName(method)); } diff --git a/src/main/java/org/redkale/convert/ObjectEncoder.java b/src/main/java/org/redkale/convert/ObjectEncoder.java index 354dceb32..532ec91f9 100644 --- a/src/main/java/org/redkale/convert/ObjectEncoder.java +++ b/src/main/java/org/redkale/convert/ObjectEncoder.java @@ -98,7 +98,7 @@ public class ObjectEncoder implements Encodeable { field.getGenericType(), field.getAnnotationsByType(ConvertCoder.class), true); Encodeable fieldCoder; if (small != null && field.getType() == String.class) { - fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + fieldCoder = StringSimpledCoder.StandardStringSimpledCoder.instance; } else { fieldCoder = colFactory.findFieldCoder(clazz, field.getName()); } @@ -182,7 +182,7 @@ public class ObjectEncoder implements Encodeable { } Encodeable fieldCoder; if (small != null && method.getReturnType() == String.class) { - fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + fieldCoder = StringSimpledCoder.StandardStringSimpledCoder.instance; } else { String fieldName = ConvertFactory.readGetSetFieldName(method); fieldCoder = colFactory.findFieldCoder(clazz, fieldName); diff --git a/src/main/java/org/redkale/convert/ext/AtomicLongSimpledCoder.java b/src/main/java/org/redkale/convert/ext/AtomicLongSimpledCoder.java index 0ee133eec..972097d00 100644 --- a/src/main/java/org/redkale/convert/ext/AtomicLongSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/AtomicLongSimpledCoder.java @@ -17,7 +17,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class AtomicLongSimpledCoder extends SimpledCoder { +public class AtomicLongSimpledCoder extends SimpledCoder { public static final AtomicLongSimpledCoder instance = new AtomicLongSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/BoolSimpledCoder.java b/src/main/java/org/redkale/convert/ext/BoolSimpledCoder.java index 008139bd5..dc54ba3b3 100644 --- a/src/main/java/org/redkale/convert/ext/BoolSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/BoolSimpledCoder.java @@ -16,7 +16,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class BoolSimpledCoder extends SimpledCoder { +public class BoolSimpledCoder extends SimpledCoder { public static final BoolSimpledCoder instance = new BoolSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/ByteSimpledCoder.java b/src/main/java/org/redkale/convert/ext/ByteSimpledCoder.java index a9af79285..ce8726173 100644 --- a/src/main/java/org/redkale/convert/ext/ByteSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/ByteSimpledCoder.java @@ -16,7 +16,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class ByteSimpledCoder extends SimpledCoder { +public class ByteSimpledCoder extends SimpledCoder { public static final ByteSimpledCoder instance = new ByteSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/CharSimpledCoder.java b/src/main/java/org/redkale/convert/ext/CharSimpledCoder.java index a7d130fda..fcc9bbeb7 100644 --- a/src/main/java/org/redkale/convert/ext/CharSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/CharSimpledCoder.java @@ -16,7 +16,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class CharSimpledCoder extends SimpledCoder { +public class CharSimpledCoder extends SimpledCoder { public static final CharSimpledCoder instance = new CharSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/DateSimpledCoder.java b/src/main/java/org/redkale/convert/ext/DateSimpledCoder.java index fd40cefd9..87fc2cf3b 100644 --- a/src/main/java/org/redkale/convert/ext/DateSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/DateSimpledCoder.java @@ -19,7 +19,7 @@ import org.redkale.convert.Writer; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class DateSimpledCoder extends SimpledCoder { +public class DateSimpledCoder extends SimpledCoder { public static final DateSimpledCoder instance = new DateSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/DoubleSimpledCoder.java b/src/main/java/org/redkale/convert/ext/DoubleSimpledCoder.java index 916fbeceb..3cd96112c 100644 --- a/src/main/java/org/redkale/convert/ext/DoubleSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/DoubleSimpledCoder.java @@ -16,7 +16,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class DoubleSimpledCoder extends SimpledCoder { +public class DoubleSimpledCoder extends SimpledCoder { public static final DoubleSimpledCoder instance = new DoubleSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/FloatSimpledCoder.java b/src/main/java/org/redkale/convert/ext/FloatSimpledCoder.java index 278adb61a..d16895af8 100644 --- a/src/main/java/org/redkale/convert/ext/FloatSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/FloatSimpledCoder.java @@ -16,7 +16,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class FloatSimpledCoder extends SimpledCoder { +public class FloatSimpledCoder extends SimpledCoder { public static final FloatSimpledCoder instance = new FloatSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/IntSimpledCoder.java b/src/main/java/org/redkale/convert/ext/IntSimpledCoder.java index 9ccc3e8e8..7b4055f4f 100644 --- a/src/main/java/org/redkale/convert/ext/IntSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/IntSimpledCoder.java @@ -17,7 +17,7 @@ import org.redkale.convert.json.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class IntSimpledCoder extends SimpledCoder { +public class IntSimpledCoder extends SimpledCoder { public static final IntSimpledCoder instance = new IntSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java index 4957857ff..ad3c7869a 100644 --- a/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LocalDateSimpledCoder.java @@ -18,20 +18,20 @@ import org.redkale.convert.json.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class LocalDateSimpledCoder extends SimpledCoder { +public class LocalDateSimpledCoder extends SimpledCoder { public static final LocalDateSimpledCoder instance = new LocalDateSimpledCoder(); @Override public void convertTo(W out, LocalDate value) { out.writeInt( - value == null ? -1 : value.getYear() * 100_00 + value.getMonthValue() * 100 + value.getDayOfMonth()); + value == null ? 0 : value.getYear() * 100_00 + value.getMonthValue() * 100 + value.getDayOfMonth()); } @Override public LocalDate convertFrom(R in) { int t = in.readInt(); - return t == -1 ? null : LocalDate.of(t / 100_00, t % 100_00 / 100, t % 100); + return t == 0 ? null : LocalDate.of(t / 100_00, t % 100_00 / 100, t % 100); } /** diff --git a/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java index 8e1d24099..35753f095 100644 --- a/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LocalDateTimeSimpledCoder.java @@ -18,7 +18,7 @@ import org.redkale.convert.json.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class LocalDateTimeSimpledCoder +public class LocalDateTimeSimpledCoder extends SimpledCoder { private static final ByteArraySimpledCoder bsSimpledCoder = ByteArraySimpledCoder.instance; diff --git a/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java index 3bc66e942..29212a213 100644 --- a/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LocalTimeSimpledCoder.java @@ -18,7 +18,7 @@ import org.redkale.convert.json.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class LocalTimeSimpledCoder extends SimpledCoder { +public class LocalTimeSimpledCoder extends SimpledCoder { public static final LocalTimeSimpledCoder instance = new LocalTimeSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/LongSimpledCoder.java b/src/main/java/org/redkale/convert/ext/LongSimpledCoder.java index 62a554683..bf37f42ab 100644 --- a/src/main/java/org/redkale/convert/ext/LongSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/LongSimpledCoder.java @@ -17,7 +17,7 @@ import org.redkale.convert.json.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class LongSimpledCoder extends SimpledCoder { +public class LongSimpledCoder extends SimpledCoder { public static final LongSimpledCoder instance = new LongSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/NumberSimpledCoder.java b/src/main/java/org/redkale/convert/ext/NumberSimpledCoder.java index 5482eb0e8..d435c9412 100644 --- a/src/main/java/org/redkale/convert/ext/NumberSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/NumberSimpledCoder.java @@ -18,7 +18,7 @@ import org.redkale.convert.Writer; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class NumberSimpledCoder extends SimpledCoder { +public class NumberSimpledCoder extends SimpledCoder { public static final NumberSimpledCoder instance = new NumberSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/ShortSimpledCoder.java b/src/main/java/org/redkale/convert/ext/ShortSimpledCoder.java index a4450eee5..0b03cc27d 100644 --- a/src/main/java/org/redkale/convert/ext/ShortSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/ShortSimpledCoder.java @@ -16,7 +16,7 @@ import org.redkale.convert.*; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class ShortSimpledCoder extends SimpledCoder { +public class ShortSimpledCoder extends SimpledCoder { public static final ShortSimpledCoder instance = new ShortSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/ext/StringSimpledCoder.java b/src/main/java/org/redkale/convert/ext/StringSimpledCoder.java index 445550ec7..e0ad9a599 100644 --- a/src/main/java/org/redkale/convert/ext/StringSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/StringSimpledCoder.java @@ -18,7 +18,7 @@ import org.redkale.convert.Writer; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class StringSimpledCoder extends SimpledCoder { +public class StringSimpledCoder extends SimpledCoder { public static final StringSimpledCoder instance = new StringSimpledCoder(); @@ -32,10 +32,10 @@ public final class StringSimpledCoder extend return in.readString(); } - public static final class SmallStringSimpledCoder + public static final class StandardStringSimpledCoder extends SimpledCoder { - public static final SmallStringSimpledCoder instance = new SmallStringSimpledCoder(); + public static final StandardStringSimpledCoder instance = new StandardStringSimpledCoder(); @Override public void convertTo(W out, String value) { diff --git a/src/main/java/org/redkale/convert/ext/StringWrapperSimpledCoder.java b/src/main/java/org/redkale/convert/ext/StringWrapperSimpledCoder.java index 6a0936df6..156d7d42f 100644 --- a/src/main/java/org/redkale/convert/ext/StringWrapperSimpledCoder.java +++ b/src/main/java/org/redkale/convert/ext/StringWrapperSimpledCoder.java @@ -17,7 +17,7 @@ import org.redkale.util.StringWrapper; * @param Reader输入的子类型 * @param Writer输出的子类型 */ -public final class StringWrapperSimpledCoder +public class StringWrapperSimpledCoder extends SimpledCoder { public static final StringWrapperSimpledCoder instance = new StringWrapperSimpledCoder(); diff --git a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java index cf3c42521..3dec113db 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufArrayEncoder.java @@ -13,13 +13,16 @@ import org.redkale.convert.*; * @author zhangjx * @param T */ -public class ProtobufArrayEncoder extends ArrayEncoder { +public class ProtobufArrayEncoder extends ArrayEncoder + implements ProtobufEncodeable { protected final boolean componentSimpled; + protected final boolean requireSizeFlag; public ProtobufArrayEncoder(ProtobufFactory factory, Type type) { super(factory, type); this.componentSimpled = getComponentEncoder() instanceof SimpledCoder; + this.requireSizeFlag = ((ProtobufEncodeable) getComponentEncoder()).requireSize(); } @Override @@ -46,4 +49,22 @@ public class ProtobufArrayEncoder extends ArrayEncoder { } out.writeArrayE(); } + + @Override + public int computeSize(T[] value) { + if (value == null || value.length < 1) { + return 0; + } + int len = 0; + ProtobufEncodeable itemEncoder = (ProtobufEncodeable) this.componentEncoder; + for (T item : value) { + len += itemEncoder.computeSize(item); + } + return len; + } + + @Override + public boolean requireSize() { + return requireSizeFlag; + } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java index cb03e1686..7a9cfcbb1 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufCoders.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufCoders.java @@ -4,10 +4,33 @@ */ package org.redkale.convert.pb; +import java.lang.reflect.Type; import java.util.*; import java.util.concurrent.atomic.*; import java.util.stream.Stream; import org.redkale.convert.SimpledCoder; +import org.redkale.convert.ext.AtomicBooleanSimpledCoder; +import org.redkale.convert.ext.AtomicIntegerSimpledCoder; +import org.redkale.convert.ext.AtomicLongSimpledCoder; +import org.redkale.convert.ext.BoolSimpledCoder; +import org.redkale.convert.ext.ByteSimpledCoder; +import org.redkale.convert.ext.CharSequenceSimpledCoder; +import org.redkale.convert.ext.CharSequenceSimpledCoder.StringBuilderSimpledCoder; +import org.redkale.convert.ext.CharSimpledCoder; +import org.redkale.convert.ext.DateSimpledCoder; +import org.redkale.convert.ext.DoubleSimpledCoder; +import org.redkale.convert.ext.DurationSimpledCoder; +import org.redkale.convert.ext.FloatSimpledCoder; +import org.redkale.convert.ext.InstantSimpledCoder; +import org.redkale.convert.ext.IntSimpledCoder; +import org.redkale.convert.ext.LocalDateSimpledCoder; +import org.redkale.convert.ext.LocalDateTimeSimpledCoder; +import org.redkale.convert.ext.LocalTimeSimpledCoder; +import org.redkale.convert.ext.LongSimpledCoder; +import org.redkale.convert.ext.NumberSimpledCoder; +import org.redkale.convert.ext.ShortSimpledCoder; +import org.redkale.convert.ext.StringSimpledCoder; +import org.redkale.convert.ext.StringWrapperSimpledCoder; import org.redkale.util.*; /** @@ -22,8 +45,376 @@ public abstract class ProtobufCoders { // do nothing } + // ------------------------------------- boolean ------------------------------------- + public static class ProtobufBoolSimpledCoder extends BoolSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufBoolSimpledCoder instance = new ProtobufBoolSimpledCoder(); + + @Override + public int computeSize(Boolean value) { + return value == null ? 0 : 1; + } + + @Override + public Type getType() { + return Boolean.class; + } + } + + public static class ProtobufByteSimpledCoder extends ByteSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufByteSimpledCoder instance = new ProtobufByteSimpledCoder(); + + @Override + public int computeSize(Byte value) { + return value == null ? 0 : 1; + } + + @Override + public Type getType() { + return Byte.class; + } + } + + public static class ProtobufCharSimpledCoder extends CharSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufCharSimpledCoder instance = new ProtobufCharSimpledCoder(); + + @Override + public int computeSize(Character value) { + return value == null ? 0 : ProtobufFactory.computeSInt32SizeNoTag(value); + } + + @Override + public Type getType() { + return Character.class; + } + } + + public static class ProtobufShortSimpledCoder extends ShortSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufShortSimpledCoder instance = new ProtobufShortSimpledCoder(); + + @Override + public int computeSize(Short value) { + return value == null ? 0 : ProtobufFactory.computeSInt32SizeNoTag(value); + } + + @Override + public Type getType() { + return Short.class; + } + } + + public static class ProtobufIntSimpledCoder extends IntSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufIntSimpledCoder instance = new ProtobufIntSimpledCoder(); + + @Override + public int computeSize(Integer value) { + return value == null ? 0 : ProtobufFactory.computeSInt32SizeNoTag(value); + } + + @Override + public Type getType() { + return Integer.class; + } + } + + public static class ProtobufFloatSimpledCoder extends FloatSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufFloatSimpledCoder instance = new ProtobufFloatSimpledCoder(); + + @Override + public int computeSize(Float value) { + return value == null ? 0 : 4; + } + + @Override + public Type getType() { + return Float.class; + } + } + + public static class ProtobufLongSimpledCoder extends LongSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufLongSimpledCoder instance = new ProtobufLongSimpledCoder(); + + @Override + public int computeSize(Long value) { + return value == null ? 0 : ProtobufFactory.computeSInt64SizeNoTag(value); + } + + @Override + public Type getType() { + return Long.class; + } + } + + public static class ProtobufDoubleSimpledCoder extends DoubleSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufDoubleSimpledCoder instance = new ProtobufDoubleSimpledCoder(); + + @Override + public int computeSize(Double value) { + return value == null ? 0 : 8; + } + + @Override + public Type getType() { + return Double.class; + } + } + + public static class ProtobufStringSimpledCoder extends StringSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufStringSimpledCoder instance = new ProtobufStringSimpledCoder(); + + @Override + public int computeSize(String value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = Utility.encodeUTF8Length(value); + return ProtobufFactory.computeSInt32SizeNoTag(len) + len; + } + + @Override + public Type getType() { + return String.class; + } + } + + // ------------------------------------- simple object ------------------------------------- + public static class ProtobufNumberSimpledCoder extends NumberSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufNumberSimpledCoder instance = new ProtobufNumberSimpledCoder(); + + @Override + public int computeSize(Number value) { + return ProtobufLongSimpledCoder.instance.computeSize(value == null ? null : value.longValue()); + } + + @Override + public Type getType() { + return Number.class; + } + } + + public static class ProtobufStringWrapperSimpledCoder + extends StringWrapperSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufStringWrapperSimpledCoder instance = new ProtobufStringWrapperSimpledCoder(); + + @Override + public int computeSize(StringWrapper value) { + return ProtobufStringSimpledCoder.instance.computeSize(value == null ? null : value.getValue()); + } + + @Override + public Type getType() { + return StringWrapper.class; + } + } + + public static class ProtobufCharSequenceSimpledCoder + extends CharSequenceSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufCharSequenceSimpledCoder instance = new ProtobufCharSequenceSimpledCoder(); + + @Override + public int computeSize(CharSequence value) { + return ProtobufStringSimpledCoder.instance.computeSize(value == null ? null : value.toString()); + } + + @Override + public Type getType() { + return CharSequence.class; + } + } + + public static class ProtobufStringBuilderSimpledCoder + extends StringBuilderSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufStringBuilderSimpledCoder instance = new ProtobufStringBuilderSimpledCoder(); + + @Override + public int computeSize(StringBuilder value) { + return ProtobufStringSimpledCoder.instance.computeSize(value == null ? null : value.toString()); + } + + @Override + public Type getType() { + return StringBuilder.class; + } + } + + public static class ProtobufDateSimpledCoder extends DateSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufDateSimpledCoder instance = new ProtobufDateSimpledCoder(); + + @Override + public int computeSize(java.util.Date value) { + return ProtobufLongSimpledCoder.instance.computeSize(value == null ? null : value.getTime()); + } + + @Override + public Type getType() { + return java.util.Date.class; + } + } + + public static class ProtobufInstantSimpledCoder extends InstantSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufInstantSimpledCoder instance = new ProtobufInstantSimpledCoder(); + + @Override + public int computeSize(java.time.Instant value) { + return ProtobufLongSimpledCoder.instance.computeSize(value == null ? null : value.toEpochMilli()); + } + + @Override + public Type getType() { + return java.time.Instant.class; + } + } + + public static class ProtobufLocalDateSimpledCoder extends LocalDateSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufLocalDateSimpledCoder instance = new ProtobufLocalDateSimpledCoder(); + + @Override + public int computeSize(java.time.LocalDate value) { + return ProtobufIntSimpledCoder.instance.computeSize( + value == null + ? null + : (value.getYear() * 100_00 + value.getMonthValue() * 100 + value.getDayOfMonth())); + } + + @Override + public Type getType() { + return java.time.LocalDate.class; + } + } + + public static class ProtobufLocalTimeSimpledCoder extends LocalTimeSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufLocalTimeSimpledCoder instance = new ProtobufLocalTimeSimpledCoder(); + + @Override + public int computeSize(java.time.LocalTime value) { + return ProtobufLongSimpledCoder.instance.computeSize(value == null ? null : value.toNanoOfDay()); + } + + @Override + public Type getType() { + return java.time.LocalTime.class; + } + } + + public static class ProtobufLocalDateTimeSimpledCoder + extends LocalDateTimeSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufLocalDateTimeSimpledCoder instance = new ProtobufLocalDateTimeSimpledCoder(); + + @Override + public int computeSize(java.time.LocalDateTime value) { + return value == null ? 0 : (ProtobufFactory.computeSInt64SizeNoTag(12) + 12); + } + + @Override + public Type getType() { + return java.time.LocalDateTime.class; + } + } + + public static class ProtobufDurationSimpledCoder extends DurationSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufDurationSimpledCoder instance = new ProtobufDurationSimpledCoder(); + + @Override + public int computeSize(java.time.Duration value) { + return ProtobufLongSimpledCoder.instance.computeSize(value == null ? null : value.toNanos()); + } + + @Override + public Type getType() { + return java.time.Duration.class; + } + } + + public static class ProtobufAtomicBooleanSimpledCoder + extends AtomicBooleanSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufAtomicBooleanSimpledCoder instance = new ProtobufAtomicBooleanSimpledCoder(); + + @Override + public int computeSize(AtomicBoolean value) { + return value == null ? 0 : 1; + } + + @Override + public Type getType() { + return AtomicBoolean.class; + } + } + + public static class ProtobufAtomicIntegerSimpledCoder + extends AtomicIntegerSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufAtomicIntegerSimpledCoder instance = new ProtobufAtomicIntegerSimpledCoder(); + + @Override + public int computeSize(AtomicInteger value) { + return ProtobufIntSimpledCoder.instance.computeSize(value == null ? null : value.get()); + } + + @Override + public Type getType() { + return AtomicInteger.class; + } + } + + public static class ProtobufAtomicLongSimpledCoder extends AtomicLongSimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { + + public static final ProtobufAtomicLongSimpledCoder instance = new ProtobufAtomicLongSimpledCoder(); + + @Override + public int computeSize(AtomicLong value) { + return ProtobufLongSimpledCoder.instance.computeSize(value == null ? null : value.get()); + } + + @Override + public Type getType() { + return AtomicLong.class; + } + } + + // ------------------------------------- boolean[] ------------------------------------- public static class ProtobufBoolArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufBoolArraySimpledCoder instance = new ProtobufBoolArraySimpledCoder(); @@ -36,10 +427,15 @@ public abstract class ProtobufCoders { public boolean[] convertFrom(ProtobufReader in) { return in.readBools(); } + + @Override + public int computeSize(boolean[] value) { + return value == null ? 0 : value.length; + } } public static class ProtobufByteArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufByteArraySimpledCoder instance = new ProtobufByteArraySimpledCoder(); @@ -52,10 +448,15 @@ public abstract class ProtobufCoders { public byte[] convertFrom(ProtobufReader in) { return in.readBytes(); } + + @Override + public int computeSize(byte[] value) { + return value == null ? 0 : value.length; + } } public static class ProtobufCharArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufCharArraySimpledCoder instance = new ProtobufCharArraySimpledCoder(); @@ -68,10 +469,22 @@ public abstract class ProtobufCoders { public char[] convertFrom(ProtobufReader in) { return in.readChars(); } + + @Override + public int computeSize(char[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (char item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item); + } + return len; + } } public static class ProtobufShortArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufShortArraySimpledCoder instance = new ProtobufShortArraySimpledCoder(); @@ -84,10 +497,22 @@ public abstract class ProtobufCoders { public short[] convertFrom(ProtobufReader in) { return in.readShorts(); } + + @Override + public int computeSize(short[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (short item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item); + } + return len; + } } public static class ProtobufIntArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufIntArraySimpledCoder instance = new ProtobufIntArraySimpledCoder(); @@ -100,10 +525,22 @@ public abstract class ProtobufCoders { public int[] convertFrom(ProtobufReader in) { return in.readInts(); } + + @Override + public int computeSize(int[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (int item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item); + } + return len; + } } public static class ProtobufFloatArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufFloatArraySimpledCoder instance = new ProtobufFloatArraySimpledCoder(); @@ -116,10 +553,15 @@ public abstract class ProtobufCoders { public float[] convertFrom(ProtobufReader in) { return in.readFloats(); } + + @Override + public int computeSize(float[] value) { + return value == null ? 0 : value.length * 4; + } } public static class ProtobufLongArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufLongArraySimpledCoder instance = new ProtobufLongArraySimpledCoder(); @@ -132,10 +574,22 @@ public abstract class ProtobufCoders { public long[] convertFrom(ProtobufReader in) { return in.readLongs(); } + + @Override + public int computeSize(long[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (long item : value) { + len += ProtobufFactory.computeSInt64SizeNoTag(item); + } + return len; + } } public static class ProtobufDoubleArraySimpledCoder extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufDoubleArraySimpledCoder instance = new ProtobufDoubleArraySimpledCoder(); @@ -148,10 +602,16 @@ public abstract class ProtobufCoders { public double[] convertFrom(ProtobufReader in) { return in.readDoubles(); } + + @Override + public int computeSize(double[] value) { + return value == null ? 0 : value.length * 8; + } } + // ------------------------------------- Boolean[] ------------------------------------- public static class ProtobufBoolArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufBoolArraySimpledCoder2 instance = new ProtobufBoolArraySimpledCoder2(); @@ -164,10 +624,15 @@ public abstract class ProtobufCoders { public Boolean[] convertFrom(ProtobufReader in) { return Utility.box(in.readBools()); } + + @Override + public int computeSize(Boolean[] value) { + return value == null ? 0 : value.length; + } } public static class ProtobufByteArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufByteArraySimpledCoder2 instance = new ProtobufByteArraySimpledCoder2(); @@ -180,10 +645,15 @@ public abstract class ProtobufCoders { public Byte[] convertFrom(ProtobufReader in) { return Utility.box(in.readBytes()); } + + @Override + public int computeSize(Byte[] value) { + return value == null ? 0 : value.length; + } } public static class ProtobufCharArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufCharArraySimpledCoder2 instance = new ProtobufCharArraySimpledCoder2(); @@ -196,10 +666,22 @@ public abstract class ProtobufCoders { public Character[] convertFrom(ProtobufReader in) { return Utility.box(in.readChars()); } + + @Override + public int computeSize(Character[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (Character item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufShortArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufShortArraySimpledCoder2 instance = new ProtobufShortArraySimpledCoder2(); @@ -212,10 +694,22 @@ public abstract class ProtobufCoders { public Short[] convertFrom(ProtobufReader in) { return Utility.box(in.readShorts()); } + + @Override + public int computeSize(Short[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (Short item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufIntArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufIntArraySimpledCoder2 instance = new ProtobufIntArraySimpledCoder2(); @@ -228,10 +722,22 @@ public abstract class ProtobufCoders { public Integer[] convertFrom(ProtobufReader in) { return Utility.box(in.readInts()); } + + @Override + public int computeSize(Integer[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (Integer item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufFloatArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufFloatArraySimpledCoder2 instance = new ProtobufFloatArraySimpledCoder2(); @@ -244,10 +750,15 @@ public abstract class ProtobufCoders { public Float[] convertFrom(ProtobufReader in) { return Utility.box(in.readFloats()); } + + @Override + public int computeSize(Float[] value) { + return value == null ? 0 : value.length * 4; + } } public static class ProtobufLongArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufLongArraySimpledCoder2 instance = new ProtobufLongArraySimpledCoder2(); @@ -260,10 +771,22 @@ public abstract class ProtobufCoders { public Long[] convertFrom(ProtobufReader in) { return Utility.box(in.readLongs()); } + + @Override + public int computeSize(Long[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (Long item : value) { + len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufDoubleArraySimpledCoder2 extends SimpledCoder - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufDoubleArraySimpledCoder2 instance = new ProtobufDoubleArraySimpledCoder2(); @@ -276,10 +799,16 @@ public abstract class ProtobufCoders { public Double[] convertFrom(ProtobufReader in) { return Utility.box(in.readDoubles()); } + + @Override + public int computeSize(Double[] value) { + return value == null ? 0 : value.length * 8; + } } public static class ProtobufAtomicIntegerArraySimpledCoder - extends SimpledCoder implements ProtobufPrimitivable { + extends SimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufAtomicIntegerArraySimpledCoder instance = new ProtobufAtomicIntegerArraySimpledCoder(); @@ -293,10 +822,23 @@ public abstract class ProtobufCoders { public AtomicInteger[] convertFrom(ProtobufReader in) { return in.readAtomicIntegers(); } + + @Override + public int computeSize(AtomicInteger[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (AtomicInteger item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item.get()); + } + return len; + } } public static class ProtobufAtomicLongArraySimpledCoder - extends SimpledCoder implements ProtobufPrimitivable { + extends SimpledCoder + implements ProtobufPrimitivable, ProtobufEncodeable { public static final ProtobufAtomicLongArraySimpledCoder instance = new ProtobufAtomicLongArraySimpledCoder(); @@ -309,10 +851,24 @@ public abstract class ProtobufCoders { public AtomicLong[] convertFrom(ProtobufReader in) { return in.readAtomicLongs(); } + + @Override + public int computeSize(AtomicLong[] value) { + if (value == null || value.length == 0) { + return 0; + } + int len = 0; + for (AtomicLong item : value) { + len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : item.get()); + } + return len; + } } + // ------------------------------------- Collection ------------------------------------- public static class ProtobufBoolCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -329,10 +885,16 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readBools(creator); } + + @Override + public int computeSize(Collection value) { + return value == null ? 0 : value.size(); + } } public static class ProtobufByteCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -349,11 +911,16 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readBytes(creator); } + + @Override + public int computeSize(Collection value) { + return value == null ? 0 : value.size(); + } } public static class ProtobufCharCollectionSimpledCoder extends SimpledCoder> - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -370,10 +937,23 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readChars(creator); } + + @Override + public int computeSize(Collection value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = 0; + for (Character item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufShortCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -390,10 +970,23 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readShorts(creator); } + + @Override + public int computeSize(Collection value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = 0; + for (Short item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufIntCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -410,10 +1003,23 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readInts(creator); } + + @Override + public int computeSize(Collection value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = 0; + for (Integer item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufFloatCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -430,10 +1036,16 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readFloats(creator); } + + @Override + public int computeSize(Collection value) { + return value == null ? 0 : value.size() * 4; + } } public static class ProtobufLongCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -450,10 +1062,23 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readLongs(creator); } + + @Override + public int computeSize(Collection value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = 0; + for (Long item : value) { + len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : item); + } + return len; + } } public static class ProtobufDoubleCollectionSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -470,11 +1095,16 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readDoubles(creator); } + + @Override + public int computeSize(Collection value) { + return value == null ? 0 : value.size() * 8; + } } public static class ProtobufAtomicBooleanCollectionSimpledCoder extends SimpledCoder> - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -491,11 +1121,16 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readAtomicBooleans(creator); } + + @Override + public int computeSize(Collection value) { + return value == null ? 0 : value.size(); + } } public static class ProtobufAtomicIntegerCollectionSimpledCoder extends SimpledCoder> - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -512,11 +1147,23 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readAtomicIntegers(creator); } + + @Override + public int computeSize(Collection value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = 0; + for (AtomicInteger item : value) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : item.get()); + } + return len; + } } public static class ProtobufAtomicLongCollectionSimpledCoder extends SimpledCoder> - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable> { private final Creator creator; @@ -533,10 +1180,24 @@ public abstract class ProtobufCoders { public Collection convertFrom(ProtobufReader in) { return in.readAtomicLongs(creator); } + + @Override + public int computeSize(Collection value) { + if (value == null || value.isEmpty()) { + return 0; + } + int len = 0; + for (AtomicLong item : value) { + len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : item.get()); + } + return len; + } } + // ------------------------------------- Stream ------------------------------------- public static class ProtobufBoolStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufBoolStreamSimpledCoder instance = new ProtobufBoolStreamSimpledCoder(); @@ -549,10 +1210,16 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readBools(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + return value == null ? 0 : (int) value.count(); + } } public static class ProtobufByteStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufByteStreamSimpledCoder instance = new ProtobufByteStreamSimpledCoder(); @@ -565,10 +1232,16 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readBytes(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + return value == null ? 0 : (int) value.count(); + } } public static class ProtobufCharStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufCharStreamSimpledCoder instance = new ProtobufCharStreamSimpledCoder(); @@ -581,10 +1254,23 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readChars(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + if (value == null) { + return 0; + } + int len = 0; + for (Object item : value.toArray()) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : (Character) item); + } + return len; + } } public static class ProtobufShortStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufShortStreamSimpledCoder instance = new ProtobufShortStreamSimpledCoder(); @@ -597,10 +1283,23 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readShorts(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + if (value == null) { + return 0; + } + int len = 0; + for (Object item : value.toArray()) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : (Short) item); + } + return len; + } } public static class ProtobufIntStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufIntStreamSimpledCoder instance = new ProtobufIntStreamSimpledCoder(); @@ -613,10 +1312,23 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readInts(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + if (value == null) { + return 0; + } + int len = 0; + for (Object item : value.toArray()) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : (Integer) item); + } + return len; + } } public static class ProtobufFloatStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufFloatStreamSimpledCoder instance = new ProtobufFloatStreamSimpledCoder(); @@ -629,10 +1341,16 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readFloats(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + return value == null ? 0 : (int) value.count() * 4; + } } public static class ProtobufLongStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufLongStreamSimpledCoder instance = new ProtobufLongStreamSimpledCoder(); @@ -645,10 +1363,23 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readLongs(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + if (value == null) { + return 0; + } + int len = 0; + for (Object item : value.toArray()) { + len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : (Long) item); + } + return len; + } } public static class ProtobufDoubleStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufDoubleStreamSimpledCoder instance = new ProtobufDoubleStreamSimpledCoder(); @@ -661,11 +1392,16 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readDoubles(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + return value == null ? 0 : (int) value.count() * 8; + } } public static class ProtobufAtomicBooleanStreamSimpledCoder extends SimpledCoder> - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufAtomicBooleanStreamSimpledCoder instance = new ProtobufAtomicBooleanStreamSimpledCoder(); @@ -679,11 +1415,16 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readAtomicBooleans(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + return value == null ? 0 : (int) value.count(); + } } public static class ProtobufAtomicIntegerStreamSimpledCoder extends SimpledCoder> - implements ProtobufPrimitivable { + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufAtomicIntegerStreamSimpledCoder instance = new ProtobufAtomicIntegerStreamSimpledCoder(); @@ -697,10 +1438,23 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readAtomicIntegers(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + if (value == null) { + return 0; + } + int len = 0; + for (Object item : value.toArray()) { + len += ProtobufFactory.computeSInt32SizeNoTag(item == null ? 0 : ((AtomicInteger) item).get()); + } + return len; + } } public static class ProtobufAtomicLongStreamSimpledCoder - extends SimpledCoder> implements ProtobufPrimitivable { + extends SimpledCoder> + implements ProtobufPrimitivable, ProtobufEncodeable> { public static final ProtobufAtomicLongStreamSimpledCoder instance = new ProtobufAtomicLongStreamSimpledCoder(); @@ -713,5 +1467,17 @@ public abstract class ProtobufCoders { public Stream convertFrom(ProtobufReader in) { return in.readAtomicLongs(LIST_CREATOR).stream(); } + + @Override + public int computeSize(Stream value) { + if (value == null) { + return 0; + } + int len = 0; + for (Object item : value.toArray()) { + len += ProtobufFactory.computeSInt64SizeNoTag(item == null ? 0 : ((AtomicLong) item).get()); + } + return len; + } } } diff --git a/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java b/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java new file mode 100644 index 000000000..72adb98c3 --- /dev/null +++ b/src/main/java/org/redkale/convert/pb/ProtobufEncodeable.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.convert.pb; + +import org.redkale.convert.Encodeable; +import org.redkale.convert.Writer; + +/** + * 带tag的反序列化操作类 + * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param Writer输出的子类 + * @param 序列化的数据类型 + */ +public interface ProtobufEncodeable extends Encodeable { + // 计算内容长度 + public int computeSize(T value); + + // 是否需要计算内容长度 + default boolean requireSize() { + return false; + } +} diff --git a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java index 1f4fe80af..94e81e89f 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java @@ -5,7 +5,6 @@ */ package org.redkale.convert.pb; -import java.io.Serializable; import java.lang.reflect.*; import java.util.*; import java.util.concurrent.atomic.*; @@ -26,45 +25,75 @@ public class ProtobufFactory extends ConvertFactory T */ -public class ProtobufObjectEncoder extends ObjectEncoder { +public class ProtobufObjectEncoder extends ObjectEncoder + implements ProtobufEncodeable { protected ProtobufObjectEncoder(Type type) { super(type); @@ -45,4 +46,14 @@ public class ProtobufObjectEncoder extends ObjectEncoder { parent.offerChild(out); } } + + @Override + public int computeSize(T value) { + return 0; + } + + @Override + public final boolean requireSize() { + return true; + } } diff --git a/src/test/java/org/redkale/test/util/SelectColumnTest.java b/src/test/java/org/redkale/test/util/SelectColumnTest.java index dd2801134..9611341da 100644 --- a/src/test/java/org/redkale/test/util/SelectColumnTest.java +++ b/src/test/java/org/redkale/test/util/SelectColumnTest.java @@ -26,11 +26,11 @@ public class SelectColumnTest { SelectColumn sel = SelectColumn.includes(User::getUserId, User::getUserName); SelectColumn sel2 = SelectColumn.includes("userId", "userName"); Assertions.assertTrue(sel.equals(sel2)); - sel.setPatterns(new Pattern[] {Pattern.compile("aaa", 2)}); + sel.setPatterns(new Pattern[] {Pattern.compile("aaa")}); System.out.println(JsonConvert.root().convertTo(sel)); - String json = "{\"flags\":2,\"pattern\":\"aaa\"}"; + String json = "aaa"; Pattern pattern = JsonConvert.root().convertFrom(Pattern.class, json); - Assertions.assertEquals(2, pattern.flags()); + Assertions.assertEquals(0, pattern.flags()); Assertions.assertEquals("aaa", pattern.pattern()); }