This commit is contained in:
redkale
2024-09-16 11:53:36 +08:00
parent a65f4318f5
commit fcff5ccf7e
6 changed files with 87 additions and 60 deletions

View File

@@ -29,9 +29,24 @@ public abstract class TextConvert<R extends Reader, W extends Writer> extends Co
public abstract <T> T convertFrom(final Type type, final String text); public abstract <T> 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) { public final String convertTo(final Object value) {
return convertTo((Type) null, 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); public abstract String convertTo(final Type type, final Object value);
} }

View File

@@ -5,12 +5,11 @@
*/ */
package org.redkale.convert.json; package org.redkale.convert.json;
import static org.redkale.convert.json.JsonWriter.*;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.redkale.convert.*; import org.redkale.convert.*;
import static org.redkale.convert.json.JsonWriter.*;
import org.redkale.util.*; 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_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 int TENTHOUSAND_MAX = 10001;
private static final byte[][] TENTHOUSAND_BYTES = new byte[TENTHOUSAND_MAX][]; 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); array.directFrom(content, count);
} }
@Override
public void writeNull() {
writeTo(BYTES_NULL);
}
@Override @Override
public final void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) { public final void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) {
if (this.comma) { if (this.comma) {
writeTo(','); writeTo(BYTE_COMMA);
} }
if (member != null) { if (member != null) {
byte[] bs = member.getJsonFieldNameBytes(); byte[] bs = member.getJsonFieldNameBytes();
@@ -117,7 +123,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
count += bs.length; count += bs.length;
} else { } else {
writeLatin1To(true, fieldName); writeLatin1To(true, fieldName);
writeTo(':'); writeTo(BYTE_COLON);
} }
} }
@@ -165,10 +171,10 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
int len = bs.length; int len = bs.length;
if (quote) { if (quote) {
byte[] src = expand(len + 2); byte[] src = expand(len + 2);
src[count++] = '"'; src[count++] = BYTE_DQUOTE;
System.arraycopy(bs, 0, src, count, bs.length); System.arraycopy(bs, 0, src, count, bs.length);
count += len; count += len;
src[count++] = '"'; src[count++] = BYTE_DQUOTE;
} else { } else {
byte[] src = expand(len); byte[] src = expand(len);
System.arraycopy(bs, 0, src, count, bs.length); 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); byte[] src = expand(len1 + len2 + 2);
System.arraycopy(bs1, 0, src, count, len1); System.arraycopy(bs1, 0, src, count, len1);
count += len1; count += len1;
src[count++] = '"'; src[count++] = BYTE_DQUOTE;
System.arraycopy(bs2, 0, src, count, len2); System.arraycopy(bs2, 0, src, count, len2);
count += len2; count += len2;
src[count++] = '"'; src[count++] = BYTE_DQUOTE;
} }
@Override @Override
@@ -249,7 +255,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
count += len1; count += len1;
System.arraycopy(bs2, 0, src, count, len2); System.arraycopy(bs2, 0, src, count, len2);
count += len2; count += len2;
src[count++] = '}'; src[count++] = BYTE_RBRACE;
} }
@Override @Override
@@ -265,7 +271,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
count += len1; count += len1;
System.arraycopy(bs2, 0, src, count, len2); System.arraycopy(bs2, 0, src, count, len2);
count += len2; count += len2;
src[count++] = '}'; src[count++] = BYTE_RBRACE;
} }
@Override @Override
@@ -281,7 +287,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
count += len1; count += len1;
System.arraycopy(bs2, 0, src, count, len2); System.arraycopy(bs2, 0, src, count, len2);
count += len2; count += len2;
src[count++] = '}'; src[count++] = BYTE_RBRACE;
} }
@Override @Override
@@ -289,12 +295,12 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
if (value == null && nullable()) { if (value == null && nullable()) {
writeTo(fieldBytes); writeTo(fieldBytes);
writeNull(); writeNull();
writeTo('}'); writeTo(BYTE_RBRACE);
return; return;
} }
if (value == null || (tiny() && value.isEmpty())) { if (value == null || (tiny() && value.isEmpty())) {
expand(1); expand(1);
content[count++] = '}'; content[count++] = BYTE_RBRACE;
} else { } else {
byte[] bs1 = fieldBytes; byte[] bs1 = fieldBytes;
byte[] bs2 = Utility.latin1ByteArray(value); byte[] bs2 = Utility.latin1ByteArray(value);
@@ -304,11 +310,11 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
int c = count; int c = count;
System.arraycopy(bs1, 0, src, c, len1); System.arraycopy(bs1, 0, src, c, len1);
c += len1; c += len1;
src[c++] = '"'; src[c++] = BYTE_DQUOTE;
System.arraycopy(bs2, 0, src, c, len2); System.arraycopy(bs2, 0, src, c, len2);
c += len2; c += len2;
src[c++] = '"'; src[c++] = BYTE_DQUOTE;
src[c++] = '}'; src[c++] = BYTE_RBRACE;
count = c; count = c;
} }
} }
@@ -316,16 +322,16 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
@Override // firstFieldBytes 必须带{开头 @Override // firstFieldBytes 必须带{开头
public void writeObjectByOnlyOneLatin1FieldValue(final byte[] firstFieldBytes, final String value) { public void writeObjectByOnlyOneLatin1FieldValue(final byte[] firstFieldBytes, final String value) {
if (value == null && nullable()) { if (value == null && nullable()) {
writeTo('{'); writeTo(BYTE_LBRACE);
writeTo(firstFieldBytes); writeTo(firstFieldBytes);
writeNull(); writeNull();
writeTo('}'); writeTo(BYTE_RBRACE);
return; return;
} }
if (value == null || (tiny() && value.isEmpty())) { if (value == null || (tiny() && value.isEmpty())) {
expand(2); expand(2);
content[count++] = '{'; content[count++] = BYTE_LBRACE;
content[count++] = '}'; content[count++] = BYTE_RBRACE;
} else { } else {
byte[] bs1 = firstFieldBytes; byte[] bs1 = firstFieldBytes;
byte[] bs2 = Utility.latin1ByteArray(value); byte[] bs2 = Utility.latin1ByteArray(value);
@@ -335,11 +341,11 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
int c = count; int c = count;
System.arraycopy(bs1, 0, src, c, len1); System.arraycopy(bs1, 0, src, c, len1);
c += len1; c += len1;
src[c++] = '"'; src[c++] = BYTE_DQUOTE;
System.arraycopy(bs2, 0, src, c, len2); System.arraycopy(bs2, 0, src, c, len2);
c += len2; c += len2;
src[c++] = '"'; src[c++] = BYTE_DQUOTE;
src[c++] = '}'; src[c++] = BYTE_RBRACE;
count = c; count = c;
} }
} }
@@ -368,7 +374,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
count += len3; count += len3;
System.arraycopy(bs4, 0, src, count, len4); System.arraycopy(bs4, 0, src, count, len4);
count += len4; count += len4;
src[count++] = '}'; src[count++] = BYTE_RBRACE;
} }
public JsonBytesWriter clear() { public JsonBytesWriter clear() {
@@ -403,7 +409,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
byte[] bytes = expand(value.length * 2 + 2); byte[] bytes = expand(value.length * 2 + 2);
int curr = count; int curr = count;
if (quote) { if (quote) {
bytes[curr++] = '"'; bytes[curr++] = BYTE_DQUOTE;
} }
for (byte b : value) { for (byte b : value) {
if (b == '"') { if (b == '"') {
@@ -430,7 +436,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
} }
} }
if (quote) { if (quote) {
bytes[curr++] = '"'; bytes[curr++] = BYTE_DQUOTE;
} }
count = curr; count = curr;
} }
@@ -453,7 +459,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
byte[] bytes = expand(value.length() * 4 + 2); byte[] bytes = expand(value.length() * 4 + 2);
int curr = count; int curr = count;
if (quote) { if (quote) {
bytes[curr++] = '"'; bytes[curr++] = BYTE_DQUOTE;
} }
int len = value.length(); int len = value.length();
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
@@ -500,7 +506,7 @@ public class JsonBytesWriter extends JsonWriter implements ByteTuple {
} }
} }
if (quote) { if (quote) {
bytes[curr++] = '"'; bytes[curr++] = BYTE_DQUOTE;
} }
count = curr; count = curr;
} }

View File

@@ -36,6 +36,15 @@ class JsonStreamWriter extends JsonByteBufferWriter {
return false; return false;
} }
@Override
public void writeTo(final byte ch) {
try {
out.write(ch);
} catch (IOException e) {
throw new ConvertException(e);
}
}
@Override @Override
public void writeTo(final char ch) { public void writeTo(final char ch) {
if (ch > Byte.MAX_VALUE) { if (ch > Byte.MAX_VALUE) {

View File

@@ -22,6 +22,22 @@ public abstract class JsonWriter extends Writer {
"redkale.convert.json.writer.buffer.defsize", "redkale.convert.json.writer.buffer.defsize",
Integer.getInteger("redkale.convert.writer.buffer.defsize", 1024)); 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() { protected JsonWriter() {
this.features = JsonFactory.root().getFeatures(); this.features = JsonFactory.root().getFeatures();
} }
@@ -108,13 +124,13 @@ public abstract class JsonWriter extends Writer {
@Override // 只容许JsonBytesWriter重写此方法 @Override // 只容许JsonBytesWriter重写此方法
public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) { public void writeFieldName(EnMember member, String fieldName, Type fieldType, int fieldPos) {
if (this.comma) { if (this.comma) {
writeTo(','); writeTo(BYTE_COMMA);
} }
if (member != null) { if (member != null) {
writeTo(member.getJsonFieldNameChars()); writeTo(member.getJsonFieldNameChars());
} else { } else {
writeLatin1To(true, fieldName); writeLatin1To(true, fieldName);
writeTo(':'); writeTo(BYTE_COLON);
} }
} }
@@ -186,52 +202,52 @@ public abstract class JsonWriter extends Writer {
@Override @Override
public final int writeObjectB(Object obj) { public final int writeObjectB(Object obj) {
super.writeObjectB(obj); super.writeObjectB(obj);
writeTo('{'); writeTo(BYTE_LBRACE);
return -1; return -1;
} }
@Override @Override
public final void writeObjectE(Object obj) { public final void writeObjectE(Object obj) {
writeTo('}'); writeTo(BYTE_RBRACE);
} }
@Override @Override
public final void writeNull() { public void writeNull() {
writeTo('n', 'u', 'l', 'l'); writeTo(CHARS_NULL);
} }
@Override @Override
public final int writeArrayB( public final int writeArrayB(
int size, Encodeable arrayEncoder, Encodeable<Writer, Object> componentEncoder, Object obj) { int size, Encodeable arrayEncoder, Encodeable<Writer, Object> componentEncoder, Object obj) {
writeTo('['); writeTo(BYTE_LBRACKET);
return -1; return -1;
} }
@Override @Override
public final void writeArrayMark() { public final void writeArrayMark() {
writeTo(','); writeTo(BYTE_COMMA);
} }
@Override @Override
public final void writeArrayE() { public final void writeArrayE() {
writeTo(']'); writeTo(BYTE_RBRACKET);
} }
@Override @Override
public final int writeMapB( public final int writeMapB(
int size, Encodeable<Writer, Object> keyEncoder, Encodeable<Writer, Object> valueEncoder, Object obj) { int size, Encodeable<Writer, Object> keyEncoder, Encodeable<Writer, Object> valueEncoder, Object obj) {
writeTo('{'); writeTo(BYTE_LBRACE);
return -1; return -1;
} }
@Override @Override
public final void writeMapMark() { public final void writeMapMark() {
writeTo(':'); writeTo(BYTE_COLON);
} }
@Override @Override
public final void writeMapE() { public final void writeMapE() {
writeTo('}'); writeTo(BYTE_RBRACE);
} }
static final char[] DigitTens = { static final char[] DigitTens = {

View File

@@ -176,10 +176,6 @@ public class HttpRequest extends Request<HttpContext> {
// 主要给chunked和unzip用的 // 主要给chunked和unzip用的
private ByteArray array; private ByteArray array;
private String lastPathString;
private byte[] lastPathBytes;
private final ByteArray bodyBytes; private final ByteArray bodyBytes;
private final ByteArray headerBytes; private final ByteArray headerBytes;
@@ -784,8 +780,6 @@ public class HttpRequest extends Request<HttpContext> {
: context.loadUriPath(bytes, qst, latin1, charset); : context.loadUriPath(bytes, qst, latin1, charset);
int qlen = size - qst - 1; int qlen = size - qst - 1;
this.queryBytes = bytes.getBytes(qst + 1, qlen); this.queryBytes = bytes.getBytes(qst + 1, qlen);
this.lastPathString = null;
this.lastPathBytes = null;
try { try {
addParameter(bytes, false, qst + 1, qlen); addParameter(bytes, false, qst + 1, qlen);
} catch (Exception e) { } catch (Exception e) {
@@ -796,21 +790,8 @@ public class HttpRequest extends Request<HttpContext> {
} else { // 没有带?参数 } else { // 没有带?参数
if (decodeable) { // 需要转义 if (decodeable) { // 需要转义
this.requestPath = toDecodeString(bytes, 0, bytes.length(), charset); 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 { } else {
this.requestPath = context.loadUriPath(bytes, latin1, charset); this.requestPath = context.loadUriPath(bytes, latin1, charset);
this.lastPathString = null;
this.lastPathBytes = null;
} }
this.queryBytes = EMPTY_BYTES; this.queryBytes = EMPTY_BYTES;
} }

View File

@@ -25,7 +25,7 @@ public class ScheduledTest {
System.out.println("开始执行"); System.out.println("开始执行");
Utility.sleep(2000); Utility.sleep(2000);
manager.stop("task2"); manager.stop("task2");
Utility.sleep(1010); Utility.sleep(1001);
manager.unschedule(service); manager.unschedule(service);
manager.destroy(null); manager.destroy(null);
Assertions.assertEquals(3, service.count1.get()); Assertions.assertEquals(3, service.count1.get());