diff --git a/src/main/java/org/redkale/convert/TextConvert.java b/src/main/java/org/redkale/convert/TextConvert.java index 9e1fa9fdc..9607c438a 100644 --- a/src/main/java/org/redkale/convert/TextConvert.java +++ b/src/main/java/org/redkale/convert/TextConvert.java @@ -29,9 +29,24 @@ public abstract class TextConvert extends Co public abstract T convertFrom(final Type type, final String text); + /** + * 序列化 + * + * @see org.redkale.convert.json.JsonConvert#convertTo(java.lang.reflect.Type, java.lang.Object) + * @param value Object + * @return String + */ public final String convertTo(final Object value) { return convertTo((Type) null, value); } + /** + * 序列化 + * + * @see org.redkale.convert.json.JsonConvert#convertTo(java.lang.reflect.Type, java.lang.Object) + * @param type Type + * @param value Object + * @return String + */ public abstract String convertTo(final Type type, final Object value); } diff --git a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java index 5b2613333..8d6bdae06 100644 --- a/src/main/java/org/redkale/convert/json/JsonBytesWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonBytesWriter.java @@ -5,12 +5,11 @@ */ package org.redkale.convert.json; -import static org.redkale.convert.json.JsonWriter.*; - import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.function.Consumer; import org.redkale.convert.*; +import static org.redkale.convert.json.JsonWriter.*; import org.redkale.util.*; /** @@ -27,6 +26,8 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { private static final byte[] BYTES_FALSEVALUE = "false".getBytes(); + private static final byte[] BYTES_NULL = new byte[] {'n', 'u', 'l', 'l'}; + private static final int TENTHOUSAND_MAX = 10001; private static final byte[][] TENTHOUSAND_BYTES = new byte[TENTHOUSAND_MAX][]; @@ -105,10 +106,15 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { array.directFrom(content, count); } + @Override + public void writeNull() { + writeTo(BYTES_NULL); + } + @Override public final void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) { if (this.comma) { - writeTo(','); + writeTo(BYTE_COMMA); } if (member != null) { byte[] bs = member.getJsonFieldNameBytes(); @@ -117,7 +123,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { count += bs.length; } else { writeLatin1To(true, fieldName); - writeTo(':'); + writeTo(BYTE_COLON); } } @@ -165,10 +171,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { int len = bs.length; if (quote) { byte[] src = expand(len + 2); - src[count++] = '"'; + src[count++] = BYTE_DQUOTE; System.arraycopy(bs, 0, src, count, bs.length); count += len; - src[count++] = '"'; + src[count++] = BYTE_DQUOTE; } else { byte[] src = expand(len); System.arraycopy(bs, 0, src, count, bs.length); @@ -230,10 +236,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { byte[] src = expand(len1 + len2 + 2); System.arraycopy(bs1, 0, src, count, len1); count += len1; - src[count++] = '"'; + src[count++] = BYTE_DQUOTE; System.arraycopy(bs2, 0, src, count, len2); count += len2; - src[count++] = '"'; + src[count++] = BYTE_DQUOTE; } @Override @@ -249,7 +255,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { count += len1; System.arraycopy(bs2, 0, src, count, len2); count += len2; - src[count++] = '}'; + src[count++] = BYTE_RBRACE; } @Override @@ -265,7 +271,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { count += len1; System.arraycopy(bs2, 0, src, count, len2); count += len2; - src[count++] = '}'; + src[count++] = BYTE_RBRACE; } @Override @@ -281,7 +287,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { count += len1; System.arraycopy(bs2, 0, src, count, len2); count += len2; - src[count++] = '}'; + src[count++] = BYTE_RBRACE; } @Override @@ -289,12 +295,12 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { if (value == null && nullable()) { writeTo(fieldBytes); writeNull(); - writeTo('}'); + writeTo(BYTE_RBRACE); return; } if (value == null || (tiny() && value.isEmpty())) { expand(1); - content[count++] = '}'; + content[count++] = BYTE_RBRACE; } else { byte[] bs1 = fieldBytes; byte[] bs2 = Utility.latin1ByteArray(value); @@ -304,11 +310,11 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { int c = count; System.arraycopy(bs1, 0, src, c, len1); c += len1; - src[c++] = '"'; + src[c++] = BYTE_DQUOTE; System.arraycopy(bs2, 0, src, c, len2); c += len2; - src[c++] = '"'; - src[c++] = '}'; + src[c++] = BYTE_DQUOTE; + src[c++] = BYTE_RBRACE; count = c; } } @@ -316,16 +322,16 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { @Override // firstFieldBytes 必须带{开头 public void writeObjectByOnlyOneLatin1FieldValue(final byte[] firstFieldBytes, final String value) { if (value == null && nullable()) { - writeTo('{'); + writeTo(BYTE_LBRACE); writeTo(firstFieldBytes); writeNull(); - writeTo('}'); + writeTo(BYTE_RBRACE); return; } if (value == null || (tiny() && value.isEmpty())) { expand(2); - content[count++] = '{'; - content[count++] = '}'; + content[count++] = BYTE_LBRACE; + content[count++] = BYTE_RBRACE; } else { byte[] bs1 = firstFieldBytes; byte[] bs2 = Utility.latin1ByteArray(value); @@ -335,11 +341,11 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { int c = count; System.arraycopy(bs1, 0, src, c, len1); c += len1; - src[c++] = '"'; + src[c++] = BYTE_DQUOTE; System.arraycopy(bs2, 0, src, c, len2); c += len2; - src[c++] = '"'; - src[c++] = '}'; + src[c++] = BYTE_DQUOTE; + src[c++] = BYTE_RBRACE; count = c; } } @@ -368,7 +374,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { count += len3; System.arraycopy(bs4, 0, src, count, len4); count += len4; - src[count++] = '}'; + src[count++] = BYTE_RBRACE; } public JsonBytesWriter clear() { @@ -403,7 +409,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { byte[] bytes = expand(value.length * 2 + 2); int curr = count; if (quote) { - bytes[curr++] = '"'; + bytes[curr++] = BYTE_DQUOTE; } for (byte b : value) { if (b == '"') { @@ -430,7 +436,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { } } if (quote) { - bytes[curr++] = '"'; + bytes[curr++] = BYTE_DQUOTE; } count = curr; } @@ -453,7 +459,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { byte[] bytes = expand(value.length() * 4 + 2); int curr = count; if (quote) { - bytes[curr++] = '"'; + bytes[curr++] = BYTE_DQUOTE; } int len = value.length(); for (int i = 0; i < len; i++) { @@ -500,7 +506,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple { } } if (quote) { - bytes[curr++] = '"'; + bytes[curr++] = BYTE_DQUOTE; } count = curr; } diff --git a/src/main/java/org/redkale/convert/json/JsonStreamWriter.java b/src/main/java/org/redkale/convert/json/JsonStreamWriter.java index b8da7a3d9..def9f8dfb 100644 --- a/src/main/java/org/redkale/convert/json/JsonStreamWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonStreamWriter.java @@ -36,6 +36,15 @@ class JsonStreamWriter extends JsonByteBufferWriter { return false; } + @Override + public void writeTo(final byte ch) { + try { + out.write(ch); + } catch (IOException e) { + throw new ConvertException(e); + } + } + @Override public void writeTo(final char ch) { if (ch > Byte.MAX_VALUE) { diff --git a/src/main/java/org/redkale/convert/json/JsonWriter.java b/src/main/java/org/redkale/convert/json/JsonWriter.java index 3eddbaf96..b63280a81 100644 --- a/src/main/java/org/redkale/convert/json/JsonWriter.java +++ b/src/main/java/org/redkale/convert/json/JsonWriter.java @@ -22,6 +22,22 @@ public abstract class JsonWriter extends Writer { "redkale.convert.json.writer.buffer.defsize", Integer.getInteger("redkale.convert.writer.buffer.defsize", 1024)); + private static final char[] CHARS_NULL = new char[] {'n', 'u', 'l', 'l'}; + + protected static final byte BYTE_COMMA = ','; + + protected static final byte BYTE_COLON = ':'; + + protected static final byte BYTE_LBRACE = '{'; + + protected static final byte BYTE_RBRACE = '}'; + + protected static final byte BYTE_LBRACKET = '['; + + protected static final byte BYTE_RBRACKET = ']'; + + protected static final byte BYTE_DQUOTE = '"'; + protected JsonWriter() { this.features = JsonFactory.root().getFeatures(); } @@ -108,13 +124,13 @@ public abstract class JsonWriter extends Writer { @Override // 只容许JsonBytesWriter重写此方法 public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) { if (this.comma) { - writeTo(','); + writeTo(BYTE_COMMA); } if (member != null) { writeTo(member.getJsonFieldNameChars()); } else { writeLatin1To(true, fieldName); - writeTo(':'); + writeTo(BYTE_COLON); } } @@ -186,52 +202,52 @@ public abstract class JsonWriter extends Writer { @Override public final int writeObjectB(Object obj) { super.writeObjectB(obj); - writeTo('{'); + writeTo(BYTE_LBRACE); return -1; } @Override public final void writeObjectE(Object obj) { - writeTo('}'); + writeTo(BYTE_RBRACE); } @Override - public final void writeNull() { - writeTo('n', 'u', 'l', 'l'); + public void writeNull() { + writeTo(CHARS_NULL); } @Override public final int writeArrayB( int size, Encodeable arrayEncoder, Encodeable componentEncoder, Object obj) { - writeTo('['); + writeTo(BYTE_LBRACKET); return -1; } @Override public final void writeArrayMark() { - writeTo(','); + writeTo(BYTE_COMMA); } @Override public final void writeArrayE() { - writeTo(']'); + writeTo(BYTE_RBRACKET); } @Override public final int writeMapB( int size, Encodeable keyEncoder, Encodeable valueEncoder, Object obj) { - writeTo('{'); + writeTo(BYTE_LBRACE); return -1; } @Override public final void writeMapMark() { - writeTo(':'); + writeTo(BYTE_COLON); } @Override public final void writeMapE() { - writeTo('}'); + writeTo(BYTE_RBRACE); } static final char[] DigitTens = { diff --git a/src/main/java/org/redkale/net/http/HttpRequest.java b/src/main/java/org/redkale/net/http/HttpRequest.java index b07248b44..3c664c89c 100644 --- a/src/main/java/org/redkale/net/http/HttpRequest.java +++ b/src/main/java/org/redkale/net/http/HttpRequest.java @@ -176,10 +176,6 @@ public class HttpRequest extends Request { // 主要给chunked和unzip用的 private ByteArray array; - private String lastPathString; - - private byte[] lastPathBytes; - private final ByteArray bodyBytes; private final ByteArray headerBytes; @@ -784,8 +780,6 @@ public class HttpRequest extends Request { : context.loadUriPath(bytes, qst, latin1, charset); int qlen = size - qst - 1; this.queryBytes = bytes.getBytes(qst + 1, qlen); - this.lastPathString = null; - this.lastPathBytes = null; try { addParameter(bytes, false, qst + 1, qlen); } catch (Exception e) { @@ -796,21 +790,8 @@ public class HttpRequest extends Request { } else { // 没有带?参数 if (decodeable) { // 需要转义 this.requestPath = toDecodeString(bytes, 0, bytes.length(), charset); - this.lastPathString = null; - this.lastPathBytes = null; - } else if (context.lazyHeader) { - byte[] lastURIBytes = lastPathBytes; - if (lastURIBytes != null && lastURIBytes.length == size && bytes.deepEquals(lastURIBytes)) { - this.requestPath = this.lastPathString; - } else { - this.requestPath = context.loadUriPath(bytes, latin1, charset); - this.lastPathString = this.requestPath; - this.lastPathBytes = bytes.getBytes(); - } } else { this.requestPath = context.loadUriPath(bytes, latin1, charset); - this.lastPathString = null; - this.lastPathBytes = null; } this.queryBytes = EMPTY_BYTES; } diff --git a/src/test/java/org/redkale/test/scheduled/ScheduledTest.java b/src/test/java/org/redkale/test/scheduled/ScheduledTest.java index a6de95a98..b0d70ef24 100644 --- a/src/test/java/org/redkale/test/scheduled/ScheduledTest.java +++ b/src/test/java/org/redkale/test/scheduled/ScheduledTest.java @@ -25,7 +25,7 @@ public class ScheduledTest { System.out.println("开始执行"); Utility.sleep(2000); manager.stop("task2"); - Utility.sleep(1010); + Utility.sleep(1001); manager.unschedule(service); manager.destroy(null); Assertions.assertEquals(3, service.count1.get());