From d997d3a7bb17c3e75736219fffe9557dd0501aa1 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Wed, 20 Jan 2021 17:37:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ConvertSmallString=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/convert/ConvertSmallString.java | 27 +++++++++++++++++++ src/org/redkale/convert/ObjectDecoder.java | 17 ++++++++++-- src/org/redkale/convert/ObjectEncoder.java | 17 ++++++++++-- .../convert/ext/StringSimpledCoder.java | 19 ++++++++++++- src/org/redkale/net/AsyncConnection.java | 12 +++++++-- 5 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 src/org/redkale/convert/ConvertSmallString.java diff --git a/src/org/redkale/convert/ConvertSmallString.java b/src/org/redkale/convert/ConvertSmallString.java new file mode 100644 index 000000000..4fcdd637f --- /dev/null +++ b/src/org/redkale/convert/ConvertSmallString.java @@ -0,0 +1,27 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.convert; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 序列化时标记String字段的值是否为无转义字符且长度不超过255的字符串 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * + * @since 2.3.0 + * + */ +@Target({METHOD, FIELD}) +@Retention(RUNTIME) +public @interface ConvertSmallString { + +} diff --git a/src/org/redkale/convert/ObjectDecoder.java b/src/org/redkale/convert/ObjectDecoder.java index 642fe3f10..c64e25bae 100644 --- a/src/org/redkale/convert/ObjectDecoder.java +++ b/src/org/redkale/convert/ObjectDecoder.java @@ -8,6 +8,7 @@ package org.redkale.convert; import org.redkale.util.Creator; import java.lang.reflect.*; import java.util.*; +import org.redkale.convert.ext.StringSimpledCoder; import org.redkale.util.*; /** @@ -96,7 +97,13 @@ public class ObjectDecoder implements Decodeable { if (factory.isConvertDisabled(field)) continue; ref = factory.findRef(clazz, field); if (ref != null && ref.ignore()) continue; - Decodeable fieldCoder = factory.findFieldCoder(clazz, field.getName()); + ConvertSmallString small = field.getAnnotation(ConvertSmallString.class); + Decodeable fieldCoder; + if (small != null && field.getType() == String.class) { + fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + } else { + fieldCoder = factory.findFieldCoder(clazz, field.getName()); + } if (fieldCoder == null) { Type t = TypeToken.createClassType(TypeToken.getGenericType(field.getGenericType(), this.type), this.type); fieldCoder = factory.loadDecoder(t); @@ -126,7 +133,13 @@ public class ObjectDecoder implements Decodeable { ref = factory.findRef(clazz, method); if (ref != null && ref.ignore()) continue; - Decodeable fieldCoder = factory.findFieldCoder(clazz, ConvertFactory.readGetSetFieldName(method)); + ConvertSmallString small = method.getAnnotation(ConvertSmallString.class); + Decodeable fieldCoder; + if (small != null && method.getReturnType() == String.class) { + fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + } else { + fieldCoder = factory.findFieldCoder(clazz, ConvertFactory.readGetSetFieldName(method)); + } if (fieldCoder == null) { Type t = TypeToken.createClassType(TypeToken.getGenericType(method.getGenericParameterTypes()[0], this.type), this.type); fieldCoder = factory.loadDecoder(t); diff --git a/src/org/redkale/convert/ObjectEncoder.java b/src/org/redkale/convert/ObjectEncoder.java index c01db1165..00f2b6320 100644 --- a/src/org/redkale/convert/ObjectEncoder.java +++ b/src/org/redkale/convert/ObjectEncoder.java @@ -7,6 +7,7 @@ package org.redkale.convert; import java.lang.reflect.*; import java.util.*; +import org.redkale.convert.ext.StringSimpledCoder; import org.redkale.util.*; /** @@ -77,7 +78,13 @@ public class ObjectEncoder implements Encodeable { if (factory.isConvertDisabled(field)) continue; ref = factory.findRef(clazz, field); if (ref != null && ref.ignore()) continue; - Encodeable fieldCoder = factory.findFieldCoder(clazz, field.getName()); + ConvertSmallString small = field.getAnnotation(ConvertSmallString.class); + Encodeable fieldCoder; + if (small != null && field.getType() == String.class) { + fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + } else { + fieldCoder = factory.findFieldCoder(clazz, field.getName()); + } if (fieldCoder == null) { Type t = TypeToken.createClassType(TypeToken.getGenericType(field.getGenericType(), this.type), this.type); fieldCoder = factory.loadEncoder(t); @@ -106,7 +113,13 @@ public class ObjectEncoder implements Encodeable { } ref = factory.findRef(clazz, method); if (ref != null && ref.ignore()) continue; - Encodeable fieldCoder = factory.findFieldCoder(clazz, ConvertFactory.readGetSetFieldName(method)); + ConvertSmallString small = method.getAnnotation(ConvertSmallString.class); + Encodeable fieldCoder; + if (small != null && method.getReturnType() == String.class) { + fieldCoder = StringSimpledCoder.SmallStringSimpledCoder.instance; + } else { + fieldCoder = factory.findFieldCoder(clazz, ConvertFactory.readGetSetFieldName(method)); + } if (fieldCoder == null) { Type t = TypeToken.createClassType(TypeToken.getGenericType(method.getGenericReturnType(), this.type), this.type); fieldCoder = factory.loadEncoder(t); diff --git a/src/org/redkale/convert/ext/StringSimpledCoder.java b/src/org/redkale/convert/ext/StringSimpledCoder.java index 508543684..2932d10c1 100644 --- a/src/org/redkale/convert/ext/StringSimpledCoder.java +++ b/src/org/redkale/convert/ext/StringSimpledCoder.java @@ -12,7 +12,9 @@ import org.redkale.convert.Writer; /** * String 的SimpledCoder实现 * - *

详情见: https://redkale.org + *

+ * 详情见: https://redkale.org + * * @author zhangjx * @param Reader输入的子类型 * @param Writer输出的子类型 @@ -31,4 +33,19 @@ public final class StringSimpledCoder extend return in.readString(); } + public final static class SmallStringSimpledCoder extends SimpledCoder { + + public static final SmallStringSimpledCoder instance = new SmallStringSimpledCoder(); + + @Override + public void convertTo(W out, String value) { + out.writeSmallString(value); + } + + @Override + public String convertFrom(R in) { + return in.readSmallString(); + } + + } } diff --git a/src/org/redkale/net/AsyncConnection.java b/src/org/redkale/net/AsyncConnection.java index b44696d3b..094f0451b 100644 --- a/src/org/redkale/net/AsyncConnection.java +++ b/src/org/redkale/net/AsyncConnection.java @@ -57,8 +57,8 @@ public abstract class AsyncConnection implements AutoCloseable { this(bufferPool, bufferPool, sslContext, livingCounter, closedCounter); } - protected AsyncConnection(Supplier bufferSupplier, Consumer bufferConsumer, SSLContext sslContext, - final AtomicLong livingCounter, final AtomicLong closedCounter) { + protected AsyncConnection(Supplier bufferSupplier, Consumer bufferConsumer, + SSLContext sslContext, final AtomicLong livingCounter, final AtomicLong closedCounter) { Objects.requireNonNull(bufferSupplier); Objects.requireNonNull(bufferConsumer); this.bufferSupplier = bufferSupplier; @@ -135,6 +135,14 @@ public abstract class AsyncConnection implements AutoCloseable { this.readBuffer = buffer; } + public static class Message { + + public String value; + + public Message() { + } + } + public ByteBuffer pollReadBuffer() { ByteBuffer rs = this.readBuffer; if (rs != null) {