From 4695d787c52788b71e39815f9301fe11c750eacf Mon Sep 17 00:00:00 2001 From: redkale Date: Tue, 22 Oct 2024 09:45:02 +0800 Subject: [PATCH] JsonAnyDecoder --- .../org/redkale/convert/ArrayEncoder.java | 2 +- .../redkale/convert/CollectionEncoder.java | 4 +- .../org/redkale/convert/ConvertFactory.java | 7 --- .../java/org/redkale/convert/MapEncoder.java | 4 +- .../org/redkale/convert/OptionalCoder.java | 4 +- src/main/java/org/redkale/convert/Reader.java | 13 ----- .../org/redkale/convert/StreamEncoder.java | 4 +- .../JsonAnyDecoder.java} | 41 ++++++++------- .../JsonAnyEncoder.java} | 17 +++---- .../org/redkale/convert/json/JsonConvert.java | 11 ++-- .../convert/json/JsonElementDecoder.java | 3 +- .../org/redkale/convert/json/JsonFactory.java | 2 + .../org/redkale/convert/json/JsonReader.java | 8 ++- .../convert/pb/ProtobufAnyDecoder.java | 31 +++++++++++ .../convert/pb/ProtobufAnyEncoder.java | 51 +++++++++++++++++++ .../redkale/convert/pb/ProtobufFactory.java | 2 + .../redkale/convert/pb/ProtobufReader.java | 5 -- .../java/org/redkale/net/http/HttpResult.java | 2 +- 18 files changed, 141 insertions(+), 70 deletions(-) rename src/main/java/org/redkale/convert/{AnyDecoder.java => json/JsonAnyDecoder.java} (65%) rename src/main/java/org/redkale/convert/{AnyEncoder.java => json/JsonAnyEncoder.java} (66%) create mode 100644 src/main/java/org/redkale/convert/pb/ProtobufAnyDecoder.java create mode 100644 src/main/java/org/redkale/convert/pb/ProtobufAnyEncoder.java diff --git a/src/main/java/org/redkale/convert/ArrayEncoder.java b/src/main/java/org/redkale/convert/ArrayEncoder.java index b03b8c205..d8df29c08 100644 --- a/src/main/java/org/redkale/convert/ArrayEncoder.java +++ b/src/main/java/org/redkale/convert/ArrayEncoder.java @@ -56,7 +56,7 @@ public class ArrayEncoder implements Encodeable { throw new ConvertException( "ArrayEncoder init componentEncoder error, componentType = " + this.componentType); } - this.anyEncoder = factory.getAnyEncoder(); + this.anyEncoder = factory.loadEncoder(Object.class); this.subTypeFinal = (this.componentType instanceof Class) && Modifier.isFinal(((Class) this.componentType).getModifiers()); } finally { diff --git a/src/main/java/org/redkale/convert/CollectionEncoder.java b/src/main/java/org/redkale/convert/CollectionEncoder.java index 870d70350..373e16d9b 100644 --- a/src/main/java/org/redkale/convert/CollectionEncoder.java +++ b/src/main/java/org/redkale/convert/CollectionEncoder.java @@ -38,12 +38,12 @@ public class CollectionEncoder implements Encodeable { */ protected int features; - private final Encodeable anyEncoder = new AnyEncoder(this); - // ----------------------------------------------------------------------------------- private final ConcurrentHashMap creators = new ConcurrentHashMap(); @@ -1173,9 +1171,6 @@ public abstract class ConvertFactory { } // ---------------------------------------------------------------------- - public final Encodeable getAnyEncoder() { - return (Encodeable) anyEncoder; - } public final void register(Class clazz, C columnHandler) { fieldFuncs.put(Objects.requireNonNull(clazz), Objects.requireNonNull(columnHandler)); @@ -1477,8 +1472,6 @@ public abstract class ConvertFactory { encoder = CompletionHandlerSimpledCoder.instance; } else if (Optional.class == clazz) { encoder = new OptionalCoder(this, type); - } else if (clazz == Object.class) { - return (Encodeable) this.anyEncoder; } else if (!clazz.getName().startsWith("java.") || java.net.HttpCookie.class == clazz || java.util.Map.Entry.class == clazz diff --git a/src/main/java/org/redkale/convert/MapEncoder.java b/src/main/java/org/redkale/convert/MapEncoder.java index 81b2470df..de9a36510 100644 --- a/src/main/java/org/redkale/convert/MapEncoder.java +++ b/src/main/java/org/redkale/convert/MapEncoder.java @@ -46,8 +46,8 @@ public class MapEncoder implements Encodeable extends Simple factory.register(type, this); this.decoder = factory.loadDecoder(this.componentType); if (this.componentType instanceof TypeVariable) { - this.encoder = factory.getAnyEncoder(); + this.encoder = factory.loadEncoder(Object.class); this.componentClass = Object.class; } else { if (componentType instanceof ParameterizedType) { @@ -60,7 +60,7 @@ public class OptionalCoder extends Simple this.componentType = Object.class; this.componentClass = Object.class; this.decoder = factory.loadDecoder(this.componentType); - this.encoder = factory.getAnyEncoder(); + this.encoder = factory.loadEncoder(this.componentType); } } finally { inited = true; diff --git a/src/main/java/org/redkale/convert/Reader.java b/src/main/java/org/redkale/convert/Reader.java index 383db9a56..8d2da9942 100644 --- a/src/main/java/org/redkale/convert/Reader.java +++ b/src/main/java/org/redkale/convert/Reader.java @@ -16,12 +16,6 @@ import org.redkale.annotation.Nullable; */ public abstract class Reader { - public enum ValueType { - STRING, - ARRAY, - MAP; - } - /** * 集合对象为null * @@ -67,13 +61,6 @@ public abstract class Reader { */ public abstract void readColon(); - /** - * 读取下个值的类型 - * - * @return ValueType - */ - public abstract ValueType readType(); - /** * 读取对象的类名, 返回 null 表示对象为null, 返回空字符串表示当前class与返回的class一致,返回非空字符串表示class是当前class的子类。 * diff --git a/src/main/java/org/redkale/convert/StreamEncoder.java b/src/main/java/org/redkale/convert/StreamEncoder.java index 79b394834..3b7848b7a 100644 --- a/src/main/java/org/redkale/convert/StreamEncoder.java +++ b/src/main/java/org/redkale/convert/StreamEncoder.java @@ -38,12 +38,12 @@ public class StreamEncoder implements Encodeable @@ -17,9 +22,9 @@ import org.redkale.util.*; * 详情见: https://redkale.org * * @author zhangjx - * @param Reader + * @param 泛型 */ -public class AnyDecoder implements Decodeable { +public class JsonAnyDecoder implements Decodeable { private static final Type collectionObjectType = new TypeToken>() {}.getType(); @@ -29,7 +34,7 @@ public class AnyDecoder implements Decodeable { private static final Creator mapCreator = Creator.create(LinkedHashMap.class); - protected final Decodeable stringDecoder; + protected final Decodeable stringDecoder; protected final CollectionDecoder collectionDecoder; @@ -40,24 +45,24 @@ public class AnyDecoder implements Decodeable { * * @param factory ConvertFactory */ - public AnyDecoder(final ConvertFactory factory) { + public JsonAnyDecoder(final ConvertFactory factory) { this(mapCreator, mapObjectType, collectionCreator, collectionObjectType, factory.loadDecoder(String.class)); } - protected AnyDecoder( + protected JsonAnyDecoder( Creator mapCreator, Type mapObjectType, Creator listCreator, Type listObjectType, - Decodeable keyDecoder) { + Decodeable keyDecoder) { this.stringDecoder = keyDecoder; this.collectionDecoder = new CollectionDecoder(listObjectType, Object.class, listCreator, this); this.mapDecoder = new MapDecoder(mapObjectType, String.class, Object.class, mapCreator, keyDecoder, this); } @Override - public T convertFrom(Reader in) { - ValueType vt = in.readType(); + public T convertFrom(JsonReader in) { + JsonReader.ValueType vt = in.readType(); if (vt == null) { return null; } @@ -70,12 +75,12 @@ public class AnyDecoder implements Decodeable { return (T) stringFrom(in); } - protected T stringFrom(Reader in) { + protected T stringFrom(JsonReader in) { return (T) this.stringDecoder.convertFrom(in); } @Override public Type getType() { - return void.class; + return Object.class; } } diff --git a/src/main/java/org/redkale/convert/AnyEncoder.java b/src/main/java/org/redkale/convert/json/JsonAnyEncoder.java similarity index 66% rename from src/main/java/org/redkale/convert/AnyEncoder.java rename to src/main/java/org/redkale/convert/json/JsonAnyEncoder.java index 0cbb98b59..749b95733 100644 --- a/src/main/java/org/redkale/convert/AnyEncoder.java +++ b/src/main/java/org/redkale/convert/json/JsonAnyEncoder.java @@ -1,11 +1,11 @@ /* - * 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. + * Copyright (c) 2016-2116 Redkale + * All rights reserved. */ -package org.redkale.convert; +package org.redkale.convert.json; import java.lang.reflect.Type; +import org.redkale.convert.Encodeable; /** * 对不明类型的对象进行序列化; PROTOBUF序列化时将对象的类名写入Writer,JSON则不写入。 @@ -13,20 +13,19 @@ import java.lang.reflect.Type; *

详情见: https://redkale.org * * @author zhangjx - * @param Writer * @param 序列化的泛型类型 */ -public final class AnyEncoder implements Encodeable { +public final class JsonAnyEncoder implements Encodeable { - final ConvertFactory factory; + final JsonFactory factory; - AnyEncoder(ConvertFactory factory) { + JsonAnyEncoder(JsonFactory factory) { this.factory = factory; } @Override @SuppressWarnings("unchecked") - public void convertTo(final W out, final T value) { + public void convertTo(final JsonWriter out, final T value) { if (value == null) { out.writeNull(); } else { diff --git a/src/main/java/org/redkale/convert/json/JsonConvert.java b/src/main/java/org/redkale/convert/json/JsonConvert.java index a530280ca..db9e95480 100644 --- a/src/main/java/org/redkale/convert/json/JsonConvert.java +++ b/src/main/java/org/redkale/convert/json/JsonConvert.java @@ -38,6 +38,8 @@ public class JsonConvert extends TextConvert { private final ThreadLocal readerPool = Utility.withInitialThreadLocal(JsonReader::new); + private final JsonAnyDecoder anyDecoder; + @Nullable private Encodeable lastEncodeable; @@ -46,6 +48,7 @@ public class JsonConvert extends TextConvert { protected JsonConvert(JsonFactory factory, int features) { super(factory, features); + this.anyDecoder = new JsonAnyDecoder(factory); } @Override @@ -269,7 +272,7 @@ public class JsonConvert extends TextConvert { } // final JsonReader in = readerPool.get(); // in.setText(text, offset, length); - Object rs = new AnyDecoder(factory).convertFrom(new JsonReader(text, offset, length)); + Object rs = anyDecoder.convertFrom(new JsonReader(text, offset, length)); // readerPool.accept(in); return (V) rs; } @@ -279,7 +282,7 @@ public class JsonConvert extends TextConvert { if (in == null) { return null; } - return (V) new AnyDecoder(factory).convertFrom(new JsonStreamReader(in)); + return (V) anyDecoder.convertFrom(new JsonStreamReader(in)); } // 返回非null的值是由String、ArrayList、HashMap任意组合的对象 @@ -287,7 +290,7 @@ public class JsonConvert extends TextConvert { if (buffers == null || buffers.length == 0) { return null; } - return (V) new AnyDecoder(factory).convertFrom(new JsonByteBufferReader(buffers)); + return (V) anyDecoder.convertFrom(new JsonByteBufferReader(buffers)); } // 返回非null的值是由String、ArrayList、HashMap任意组合的对象 @@ -295,7 +298,7 @@ public class JsonConvert extends TextConvert { if (reader == null) { return null; } - return (V) new AnyDecoder(factory).convertFrom(reader); + return (V) anyDecoder.convertFrom(reader); } // json数据的数组长度必须和types个数相同 diff --git a/src/main/java/org/redkale/convert/json/JsonElementDecoder.java b/src/main/java/org/redkale/convert/json/JsonElementDecoder.java index c4baa9e07..906d01e6b 100644 --- a/src/main/java/org/redkale/convert/json/JsonElementDecoder.java +++ b/src/main/java/org/redkale/convert/json/JsonElementDecoder.java @@ -5,7 +5,6 @@ package org.redkale.convert.json; import java.lang.reflect.Type; import java.util.*; -import org.redkale.convert.AnyDecoder; import org.redkale.convert.ext.StringSimpledCoder; import org.redkale.util.*; @@ -17,7 +16,7 @@ import org.redkale.util.*; * @author zhangjx * @since 2.8.0 */ -class JsonElementDecoder extends AnyDecoder { +class JsonElementDecoder extends JsonAnyDecoder { private static final Type arrayType = new TypeToken>() {}.getType(); diff --git a/src/main/java/org/redkale/convert/json/JsonFactory.java b/src/main/java/org/redkale/convert/json/JsonFactory.java index 37e6ecaaa..c67485c8c 100644 --- a/src/main/java/org/redkale/convert/json/JsonFactory.java +++ b/src/main/java/org/redkale/convert/json/JsonFactory.java @@ -42,6 +42,8 @@ public final class JsonFactory extends ConvertFactory { @Override protected void initSimpleCoderInRoot() { super.initSimpleCoderInRoot(); + this.register(Object.class, new JsonAnyDecoder(this)); + this.register(Object.class, new JsonAnyEncoder(this)); this.register(InetAddress.class, JsonCoders.InetAddressJsonSimpledCoder.instance); this.register(InetSocketAddress.class, JsonCoders.InetSocketAddressJsonSimpledCoder.instance); this.register(Uint128.class, JsonCoders.Uint128JsonSimpledCoder.instance); diff --git a/src/main/java/org/redkale/convert/json/JsonReader.java b/src/main/java/org/redkale/convert/json/JsonReader.java index 9dac17ee7..cb82a6133 100644 --- a/src/main/java/org/redkale/convert/json/JsonReader.java +++ b/src/main/java/org/redkale/convert/json/JsonReader.java @@ -9,7 +9,6 @@ import java.nio.charset.StandardCharsets; import java.util.*; import org.redkale.convert.*; import static org.redkale.convert.Reader.*; -import org.redkale.convert.Reader.ValueType; import org.redkale.util.ByteTreeNode; import org.redkale.util.Utility; @@ -22,6 +21,12 @@ import org.redkale.util.Utility; */ public class JsonReader extends Reader { + public enum ValueType { + STRING, + ARRAY, + MAP; + } + protected int position = -1; private char[] text; @@ -250,7 +255,6 @@ public class JsonReader extends Reader { return ch == '['; } - @Override public final ValueType readType() { char ch = nextGoodChar(true); if (ch == '{') { diff --git a/src/main/java/org/redkale/convert/pb/ProtobufAnyDecoder.java b/src/main/java/org/redkale/convert/pb/ProtobufAnyDecoder.java new file mode 100644 index 000000000..d7b03ce71 --- /dev/null +++ b/src/main/java/org/redkale/convert/pb/ProtobufAnyDecoder.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.convert.pb; + +import java.lang.reflect.Type; +import org.redkale.convert.Decodeable; + +/** + * + * @author zhangjx + */ +public class ProtobufAnyDecoder implements Decodeable { + + final ProtobufFactory factory; + + ProtobufAnyDecoder(ProtobufFactory factory) { + this.factory = factory; + } + + @Override + public T convertFrom(ProtobufReader in) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Type getType() { + return Object.class; + } +} diff --git a/src/main/java/org/redkale/convert/pb/ProtobufAnyEncoder.java b/src/main/java/org/redkale/convert/pb/ProtobufAnyEncoder.java new file mode 100644 index 000000000..0a24f35a8 --- /dev/null +++ b/src/main/java/org/redkale/convert/pb/ProtobufAnyEncoder.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016-2116 Redkale + * All rights reserved. + */ +package org.redkale.convert.pb; + +import java.lang.reflect.Type; +import org.redkale.convert.Encodeable; + +/** + * 对不明类型的对象进行序列化; PROTOBUF序列化时将对象的类名写入Writer,JSON则不写入。 + * + *

详情见: https://redkale.org + * + * @author zhangjx + * @param 序列化的泛型类型 + */ +public final class ProtobufAnyEncoder implements Encodeable { + + final ProtobufFactory factory; + + ProtobufAnyEncoder(ProtobufFactory factory) { + this.factory = factory; + } + + @Override + @SuppressWarnings("unchecked") + public void convertTo(final ProtobufWriter out, final T value) { + if (value == null) { + out.writeNull(); + } else { + Class clazz = value.getClass(); + if (clazz == Object.class) { + out.writeObjectB(value); + out.writeObjectE(value); + return; + } + factory.loadEncoder(clazz).convertTo(out, value); + } + } + + @Override + public Type getType() { + return Object.class; + } + + @Override + public boolean specifyable() { + 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 50305bbf0..4f3c3c421 100644 --- a/src/main/java/org/redkale/convert/pb/ProtobufFactory.java +++ b/src/main/java/org/redkale/convert/pb/ProtobufFactory.java @@ -77,6 +77,8 @@ public class ProtobufFactory extends ConvertFactory { if (value instanceof byte[]) { out.writeString(new String((byte[]) value, StandardCharsets.UTF_8)); } else { - factory.getAnyEncoder().convertTo(out, value); + factory.loadEncoder(Object.class).convertTo(out, value); } }