From fc09fbba4478fdcbcda7cccfbe39bcd61caeb79f Mon Sep 17 00:00:00 2001 From: chaokunyang Date: Fri, 6 Oct 2023 18:00:03 +0800 Subject: [PATCH 1/5] add generic auto cast for fury deserialization --- .../fury-core/src/main/java/io/fury/Fury.java | 26 +++++++++---------- .../main/java/io/fury/ThreadLocalFury.java | 8 +++--- .../src/main/java/io/fury/ThreadSafeFury.java | 8 +++--- .../java/io/fury/pool/ThreadPoolFury.java | 8 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/java/fury-core/src/main/java/io/fury/Fury.java b/java/fury-core/src/main/java/io/fury/Fury.java index 563353b0db..6c3fc0fb33 100644 --- a/java/fury-core/src/main/java/io/fury/Fury.java +++ b/java/fury-core/src/main/java/io/fury/Fury.java @@ -70,6 +70,7 @@ * @author chaokunyang */ @NotThreadSafe +@SuppressWarnings("unchecked") public final class Fury { private static final Logger LOG = LoggerFactory.getLogger(Fury.class); @@ -618,11 +619,11 @@ public long readLong(MemoryBuffer buffer) { } /** Deserialize obj from a byte array. */ - public Object deserialize(byte[] bytes) { + public T deserialize(byte[] bytes) { return deserialize(MemoryUtils.wrap(bytes), null); } - public Object deserialize(byte[] bytes, Iterable outOfBandBuffers) { + public T deserialize(byte[] bytes, Iterable outOfBandBuffers) { return deserialize(MemoryUtils.wrap(bytes), outOfBandBuffers); } @@ -630,12 +631,12 @@ public Object deserialize(byte[] bytes, Iterable outOfBandBuffers) * Deserialize obj from a off-heap buffer specified by address and * size. */ - public Object deserialize(long address, int size) { + public T deserialize(long address, int size) { return deserialize(MemoryUtils.buffer(address, size), null); } /** Deserialize obj from a buffer. */ - public Object deserialize(MemoryBuffer buffer) { + public T deserialize(MemoryBuffer buffer) { return deserialize(buffer, null); } @@ -652,7 +653,7 @@ public Object deserialize(MemoryBuffer buffer) { * It is an error for outOfBandBuffers to be null if the serialized stream was * produced with a non-null `bufferCallback`. */ - public Object deserialize(MemoryBuffer buffer, Iterable outOfBandBuffers) { + public T deserialize(MemoryBuffer buffer, Iterable outOfBandBuffers) { try { jitContext.lock(); byte bitmap = buffer.readByte(); @@ -689,7 +690,7 @@ public Object deserialize(MemoryBuffer buffer, Iterable outOfBandB } obj = readRef(buffer); } - return obj; + return (T) obj; } finally { resetRead(); jitContext.unlock(); @@ -1059,7 +1060,7 @@ public void serializeJavaObjectAndClass(OutputStream outputStream, Object obj) { * Deserialize class info and java object from binary, serialization should use {@link * #serializeJavaObjectAndClass}. */ - public Object deserializeJavaObjectAndClass(byte[] data) { + public T deserializeJavaObjectAndClass(byte[] data) { return deserializeJavaObjectAndClass(MemoryBuffer.fromByteArray(data)); } @@ -1067,13 +1068,13 @@ public Object deserializeJavaObjectAndClass(byte[] data) { * Deserialize class info and java object from binary, serialization should use {@link * #serializeJavaObjectAndClass}. */ - public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) { + public T deserializeJavaObjectAndClass(MemoryBuffer buffer) { try { jitContext.lock(); if (config.shareMetaContext()) { classResolver.readClassDefs(buffer); } - return readRef(buffer); + return (T) readRef(buffer); } finally { resetRead(); jitContext.unlock(); @@ -1084,7 +1085,7 @@ public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) { * Deserialize class info and java object from binary, serialization should use {@link * #serializeJavaObjectAndClass}. */ - public Object deserializeJavaObjectAndClass(InputStream inputStream) { + public T deserializeJavaObjectAndClass(InputStream inputStream) { return deserializeFromStream(inputStream, this::deserializeJavaObjectAndClass); } @@ -1117,8 +1118,7 @@ private void serializeToStream(OutputStream outputStream, Consumer } } - private Object deserializeFromStream( - InputStream inputStream, Function function) { + private T deserializeFromStream(InputStream inputStream, Function function) { buffer.readerIndex(0); try { boolean isBis = inputStream.getClass() == ByteArrayInputStream.class; @@ -1135,7 +1135,7 @@ private Object deserializeFromStream( read = inputStream.read(buffer.getHeapMemory(), 4, size); Preconditions.checkArgument(read == size); } - Object o = function.apply(buffer); + T o = function.apply(buffer); if (isBis) { inputStream.skip(buffer.readerIndex()); buffer.pointTo(oldBytes, 0, oldBytes.length); diff --git a/java/fury-core/src/main/java/io/fury/ThreadLocalFury.java b/java/fury-core/src/main/java/io/fury/ThreadLocalFury.java index ad0e0436e9..cce0e53156 100644 --- a/java/fury-core/src/main/java/io/fury/ThreadLocalFury.java +++ b/java/fury-core/src/main/java/io/fury/ThreadLocalFury.java @@ -69,19 +69,19 @@ public MemoryBuffer serialize(MemoryBuffer buffer, Object obj) { return bindingThreadLocal.get().get().serialize(buffer, obj); } - public Object deserialize(byte[] bytes) { + public T deserialize(byte[] bytes) { return bindingThreadLocal.get().get().deserialize(bytes); } - public Object deserialize(long address, int size) { + public T deserialize(long address, int size) { return bindingThreadLocal.get().get().deserialize(address, size); } - public Object deserialize(MemoryBuffer buffer) { + public T deserialize(MemoryBuffer buffer) { return bindingThreadLocal.get().get().deserialize(buffer); } - public Object deserialize(ByteBuffer byteBuffer) { + public T deserialize(ByteBuffer byteBuffer) { return bindingThreadLocal.get().get().deserialize(MemoryUtils.wrap(byteBuffer)); } diff --git a/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java b/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java index 530d663c13..7bd8f72e62 100644 --- a/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java +++ b/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java @@ -39,13 +39,13 @@ public interface ThreadSafeFury { MemoryBuffer serialize(MemoryBuffer buffer, Object obj); - Object deserialize(byte[] bytes); + T deserialize(byte[] bytes); - Object deserialize(long address, int size); + T deserialize(long address, int size); - Object deserialize(MemoryBuffer buffer); + T deserialize(MemoryBuffer buffer); - Object deserialize(ByteBuffer byteBuffer); + T deserialize(ByteBuffer byteBuffer); /** * Set classLoader of serializer for current thread only. diff --git a/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java b/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java index 2a7634a0a8..56ed4de343 100644 --- a/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java +++ b/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java @@ -71,7 +71,7 @@ public MemoryBuffer serialize(MemoryBuffer buffer, Object obj) { } } - public Object deserialize(byte[] bytes) { + public T deserialize(byte[] bytes) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); @@ -81,7 +81,7 @@ public Object deserialize(byte[] bytes) { } } - public Object deserialize(long address, int size) { + public T deserialize(long address, int size) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); @@ -91,7 +91,7 @@ public Object deserialize(long address, int size) { } } - public Object deserialize(MemoryBuffer buffer) { + public T deserialize(MemoryBuffer buffer) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); @@ -101,7 +101,7 @@ public Object deserialize(MemoryBuffer buffer) { } } - public Object deserialize(ByteBuffer byteBuffer) { + public T deserialize(ByteBuffer byteBuffer) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); From d31732e24c40a7b370fd099c8d20cad81f2cdf76 Mon Sep 17 00:00:00 2001 From: chaokunyang Date: Fri, 6 Oct 2023 18:01:18 +0800 Subject: [PATCH 2/5] remove unnecessary generics --- java/fury-core/src/test/java/io/fury/FuryTestBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/fury-core/src/test/java/io/fury/FuryTestBase.java b/java/fury-core/src/test/java/io/fury/FuryTestBase.java index 6803ffeb0e..d8860420c5 100644 --- a/java/fury-core/src/test/java/io/fury/FuryTestBase.java +++ b/java/fury-core/src/test/java/io/fury/FuryTestBase.java @@ -201,7 +201,7 @@ public static Object serDeCheck(Fury fury, Object obj) { public static T serDe(Fury fury, T obj) { try { byte[] bytes = fury.serialize(obj); - return (T) (fury.deserialize(bytes)); + return fury.deserialize(bytes); } catch (Throwable t) { // Catch for add breakpoint for debugging. throw t; From 686cdfdc871ed323b46761bc5a99d851cc2c4a26 Mon Sep 17 00:00:00 2001 From: chaokunyang Date: Fri, 6 Oct 2023 18:22:26 +0800 Subject: [PATCH 3/5] add autocast doc and tests --- java/fury-core/src/main/java/io/fury/Fury.java | 18 +++++++++++++++++- .../src/test/java/io/fury/FuryTest.java | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/java/fury-core/src/main/java/io/fury/Fury.java b/java/fury-core/src/main/java/io/fury/Fury.java index 6c3fc0fb33..87b194aaf6 100644 --- a/java/fury-core/src/main/java/io/fury/Fury.java +++ b/java/fury-core/src/main/java/io/fury/Fury.java @@ -618,7 +618,23 @@ public long readLong(MemoryBuffer buffer) { return LongSerializer.readLong(buffer, longEncoding); } - /** Deserialize obj from a byte array. */ + /** + * Deserialize obj from a byte array. Note declared result type must be a class or + * superclass/interface of the serialized object, otherwise a {@link ClassCastException} will be + * thrown. + * + *

For example, if you serialized an object of type `Integer`, then your declared deserialized + * type is `String`, the deserialization will just throw a {@link ClassCastException}. + * + *

{@code
+   * byte[] bytes = fury.serialize(1);
+   * String o = fury.deserialize(bytes); // throw ClassCastException.
+   * }
+ * + * @param bytes serialized data. + * @param result type of the data. + * @return deserialized object. + */ public T deserialize(byte[] bytes) { return deserialize(MemoryUtils.wrap(bytes), null); } diff --git a/java/fury-core/src/test/java/io/fury/FuryTest.java b/java/fury-core/src/test/java/io/fury/FuryTest.java index bcbd90bc72..5f24dd27a6 100644 --- a/java/fury-core/src/test/java/io/fury/FuryTest.java +++ b/java/fury-core/src/test/java/io/fury/FuryTest.java @@ -16,6 +16,7 @@ package io.fury; +import static io.fury.FuryTestBase.getJavaFury; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertThrows; @@ -535,4 +536,18 @@ public void testJavaOutputStream() throws IOException { assertEquals(newObj, beanA); } } + + @Test + public void testDeserializationAutotypeCast() { + Fury fury = getJavaFury(); + byte[] bytes = fury.serialize(1); + Integer i = fury.deserialize(bytes); + Assert.assertEquals(i, 1); + Assert.assertThrows( + ClassCastException.class, + () -> { + String str = fury.deserialize(bytes); + System.out.println(str); + }); + } } From e86ea911c119840cb7dc6ba3f252f3e30069d9d6 Mon Sep 17 00:00:00 2001 From: chaokunyang Date: Fri, 6 Oct 2023 22:11:46 +0800 Subject: [PATCH 4/5] revert and add new deserialization method --- .../io/fury/benchmark/state/JsonbState.java | 7 ---- .../fury-core/src/main/java/io/fury/Fury.java | 35 ++++++++++++------- .../main/java/io/fury/ThreadLocalFury.java | 12 ++++--- .../src/main/java/io/fury/ThreadSafeFury.java | 10 +++--- .../java/io/fury/pool/ThreadPoolFury.java | 18 +++++++--- .../src/test/java/io/fury/FuryTest.java | 5 ++- .../src/test/java/io/fury/FuryTestBase.java | 2 +- .../test/java/io/fury/ThreadSafeFuryTest.java | 1 + 8 files changed, 55 insertions(+), 35 deletions(-) diff --git a/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java b/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java index 1d943eade9..acf684f57c 100644 --- a/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java +++ b/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java @@ -239,12 +239,5 @@ public static void main(String[] args) { state.setup(); state.bufferType = BufferType.directBuffer; state.setup(); - - ; - JSONObject json = new JSONObject(); - json.put("k", 1); - Fury fury = Fury.builder().requireClassRegistration(false).build(); - byte[] bytes = fury.serialize(json); - System.out.println(fury.deserialize(bytes)); } } diff --git a/java/fury-core/src/main/java/io/fury/Fury.java b/java/fury-core/src/main/java/io/fury/Fury.java index 87b194aaf6..3030847d3e 100644 --- a/java/fury-core/src/main/java/io/fury/Fury.java +++ b/java/fury-core/src/main/java/io/fury/Fury.java @@ -635,11 +635,21 @@ public long readLong(MemoryBuffer buffer) { * @param result type of the data. * @return deserialized object. */ - public T deserialize(byte[] bytes) { + public T deserializeTyped(byte[] bytes) { + return (T) deserialize(MemoryUtils.wrap(bytes), null); + } + + /** + * Deserialize obj from a byte array. + * + * @param bytes serialized data. + * @return deserialized object. + */ + public Object deserialize(byte[] bytes) { return deserialize(MemoryUtils.wrap(bytes), null); } - public T deserialize(byte[] bytes, Iterable outOfBandBuffers) { + public Object deserialize(byte[] bytes, Iterable outOfBandBuffers) { return deserialize(MemoryUtils.wrap(bytes), outOfBandBuffers); } @@ -647,12 +657,12 @@ public T deserialize(byte[] bytes, Iterable outOfBandBuffers) * Deserialize obj from a off-heap buffer specified by address and * size. */ - public T deserialize(long address, int size) { + public Object deserialize(long address, int size) { return deserialize(MemoryUtils.buffer(address, size), null); } /** Deserialize obj from a buffer. */ - public T deserialize(MemoryBuffer buffer) { + public Object deserialize(MemoryBuffer buffer) { return deserialize(buffer, null); } @@ -669,7 +679,7 @@ public T deserialize(MemoryBuffer buffer) { * It is an error for outOfBandBuffers to be null if the serialized stream was * produced with a non-null `bufferCallback`. */ - public T deserialize(MemoryBuffer buffer, Iterable outOfBandBuffers) { + public Object deserialize(MemoryBuffer buffer, Iterable outOfBandBuffers) { try { jitContext.lock(); byte bitmap = buffer.readByte(); @@ -706,7 +716,7 @@ public T deserialize(MemoryBuffer buffer, Iterable outOfBandBu } obj = readRef(buffer); } - return (T) obj; + return obj; } finally { resetRead(); jitContext.unlock(); @@ -1076,7 +1086,7 @@ public void serializeJavaObjectAndClass(OutputStream outputStream, Object obj) { * Deserialize class info and java object from binary, serialization should use {@link * #serializeJavaObjectAndClass}. */ - public T deserializeJavaObjectAndClass(byte[] data) { + public Object deserializeJavaObjectAndClass(byte[] data) { return deserializeJavaObjectAndClass(MemoryBuffer.fromByteArray(data)); } @@ -1084,13 +1094,13 @@ public T deserializeJavaObjectAndClass(byte[] data) { * Deserialize class info and java object from binary, serialization should use {@link * #serializeJavaObjectAndClass}. */ - public T deserializeJavaObjectAndClass(MemoryBuffer buffer) { + public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) { try { jitContext.lock(); if (config.shareMetaContext()) { classResolver.readClassDefs(buffer); } - return (T) readRef(buffer); + return readRef(buffer); } finally { resetRead(); jitContext.unlock(); @@ -1101,7 +1111,7 @@ public T deserializeJavaObjectAndClass(MemoryBuffer buffer) { * Deserialize class info and java object from binary, serialization should use {@link * #serializeJavaObjectAndClass}. */ - public T deserializeJavaObjectAndClass(InputStream inputStream) { + public Object deserializeJavaObjectAndClass(InputStream inputStream) { return deserializeFromStream(inputStream, this::deserializeJavaObjectAndClass); } @@ -1134,7 +1144,8 @@ private void serializeToStream(OutputStream outputStream, Consumer } } - private T deserializeFromStream(InputStream inputStream, Function function) { + private Object deserializeFromStream( + InputStream inputStream, Function function) { buffer.readerIndex(0); try { boolean isBis = inputStream.getClass() == ByteArrayInputStream.class; @@ -1151,7 +1162,7 @@ private T deserializeFromStream(InputStream inputStream, Function T deserialize(byte[] bytes) { + public T deserializeTyped(byte[] bytes) { + return bindingThreadLocal.get().get().deserializeTyped(bytes); + } + + public Object deserialize(byte[] bytes) { return bindingThreadLocal.get().get().deserialize(bytes); } - public T deserialize(long address, int size) { + public Object deserialize(long address, int size) { return bindingThreadLocal.get().get().deserialize(address, size); } - public T deserialize(MemoryBuffer buffer) { + public Object deserialize(MemoryBuffer buffer) { return bindingThreadLocal.get().get().deserialize(buffer); } - public T deserialize(ByteBuffer byteBuffer) { + public Object deserialize(ByteBuffer byteBuffer) { return bindingThreadLocal.get().get().deserialize(MemoryUtils.wrap(byteBuffer)); } diff --git a/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java b/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java index 7bd8f72e62..0eebc8c863 100644 --- a/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java +++ b/java/fury-core/src/main/java/io/fury/ThreadSafeFury.java @@ -39,13 +39,15 @@ public interface ThreadSafeFury { MemoryBuffer serialize(MemoryBuffer buffer, Object obj); - T deserialize(byte[] bytes); + T deserializeTyped(byte[] bytes); - T deserialize(long address, int size); + Object deserialize(byte[] bytes); - T deserialize(MemoryBuffer buffer); + Object deserialize(long address, int size); - T deserialize(ByteBuffer byteBuffer); + Object deserialize(MemoryBuffer buffer); + + Object deserialize(ByteBuffer byteBuffer); /** * Set classLoader of serializer for current thread only. diff --git a/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java b/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java index 56ed4de343..8591cd0379 100644 --- a/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java +++ b/java/fury-core/src/main/java/io/fury/pool/ThreadPoolFury.java @@ -71,7 +71,17 @@ public MemoryBuffer serialize(MemoryBuffer buffer, Object obj) { } } - public T deserialize(byte[] bytes) { + public T deserializeTyped(byte[] bytes) { + Fury fury = null; + try { + fury = furyPooledObjectFactory.getFury(); + return fury.deserializeTyped(bytes); + } finally { + furyPooledObjectFactory.returnFury(fury); + } + } + + public Object deserialize(byte[] bytes) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); @@ -81,7 +91,7 @@ public T deserialize(byte[] bytes) { } } - public T deserialize(long address, int size) { + public Object deserialize(long address, int size) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); @@ -91,7 +101,7 @@ public T deserialize(long address, int size) { } } - public T deserialize(MemoryBuffer buffer) { + public Object deserialize(MemoryBuffer buffer) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); @@ -101,7 +111,7 @@ public T deserialize(MemoryBuffer buffer) { } } - public T deserialize(ByteBuffer byteBuffer) { + public Object deserialize(ByteBuffer byteBuffer) { Fury fury = null; try { fury = furyPooledObjectFactory.getFury(); diff --git a/java/fury-core/src/test/java/io/fury/FuryTest.java b/java/fury-core/src/test/java/io/fury/FuryTest.java index 5f24dd27a6..8f02ffa267 100644 --- a/java/fury-core/src/test/java/io/fury/FuryTest.java +++ b/java/fury-core/src/test/java/io/fury/FuryTest.java @@ -16,7 +16,6 @@ package io.fury; -import static io.fury.FuryTestBase.getJavaFury; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertThrows; @@ -541,12 +540,12 @@ public void testJavaOutputStream() throws IOException { public void testDeserializationAutotypeCast() { Fury fury = getJavaFury(); byte[] bytes = fury.serialize(1); - Integer i = fury.deserialize(bytes); + Integer i = fury.deserializeTyped(bytes); Assert.assertEquals(i, 1); Assert.assertThrows( ClassCastException.class, () -> { - String str = fury.deserialize(bytes); + String str = fury.deserializeTyped(bytes); System.out.println(str); }); } diff --git a/java/fury-core/src/test/java/io/fury/FuryTestBase.java b/java/fury-core/src/test/java/io/fury/FuryTestBase.java index d8860420c5..6803ffeb0e 100644 --- a/java/fury-core/src/test/java/io/fury/FuryTestBase.java +++ b/java/fury-core/src/test/java/io/fury/FuryTestBase.java @@ -201,7 +201,7 @@ public static Object serDeCheck(Fury fury, Object obj) { public static T serDe(Fury fury, T obj) { try { byte[] bytes = fury.serialize(obj); - return fury.deserialize(bytes); + return (T) (fury.deserialize(bytes)); } catch (Throwable t) { // Catch for add breakpoint for debugging. throw t; diff --git a/java/fury-core/src/test/java/io/fury/ThreadSafeFuryTest.java b/java/fury-core/src/test/java/io/fury/ThreadSafeFuryTest.java index a21ef9a787..9bc0297eb1 100644 --- a/java/fury-core/src/test/java/io/fury/ThreadSafeFuryTest.java +++ b/java/fury-core/src/test/java/io/fury/ThreadSafeFuryTest.java @@ -86,6 +86,7 @@ public void testSerialize() throws Exception { try { fury.setClassLoader(beanA.getClass().getClassLoader()); assertEquals(fury.deserialize(fury.serialize(beanA)), beanA); + assertEquals(fury.deserializeTyped(fury.serialize(beanA)), beanA); } catch (Exception e) { hasException = true; e.printStackTrace(); From a1b19942672667254ff3427c79c7166d5110fb2a Mon Sep 17 00:00:00 2001 From: chaokunyang Date: Fri, 6 Oct 2023 22:13:49 +0800 Subject: [PATCH 5/5] lint code --- .../src/main/java/io/fury/benchmark/state/JsonbState.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java b/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java index acf684f57c..c4c98401b9 100644 --- a/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java +++ b/java/fury-benchmark/src/main/java/io/fury/benchmark/state/JsonbState.java @@ -18,7 +18,6 @@ import com.alibaba.fastjson2.JSONB; import com.alibaba.fastjson2.JSONFactory; -import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONReader; import com.alibaba.fastjson2.JSONWriter; import com.alibaba.fastjson2.reader.ObjectReaderProvider;