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) {