This is an automated email from the ASF dual-hosted git repository.

rainyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-hessian-lite.git


The following commit(s) were added to refs/heads/master by this push:
     new caff4e14 perf: adjust handle-used xxxSerializers from overriding 
`writeObject` method to overriding `writeReplace` method (#92)
caff4e14 is described below

commit caff4e147c9c3ec8c8ef7705763afee6122179fa
Author: Ares_xue <[email protected]>
AuthorDate: Wed Sep 24 23:54:45 2025 +0800

    perf: adjust handle-used xxxSerializers from overriding `writeObject` 
method to overriding `writeReplace` method (#92)
    
    * fix: CalendarSerializer causes ref count errors, refer to 
com.alibaba.com.caucho.hessian.io.WriteReplaceSerializer for repair
    
    * refactor: The xxxSerializers that used HessianHandle implementation to 
serialize object implement writeReplace to decrease resource occupation.
    
    * revert: Rollback of incompatible code
    
    * fix: Replenish a license header (ASF)
    
    * clean: remove redundant Calendar test case.
    clean: remove unused local variables.
    
    * refactor: The JapaneseDateSerializer that used HessianHandle 
implementation to serialize object implement writeReplace to decrease resource 
occupation.
    
    * refactor: The ZoneIdSerializer that used HessianHandle implementation to 
serialize object implement writeReplace to decrease resource occupation.
    
    * refactor: Add reference checks for xxxSerializers that need to be checked.
    
    * refactor: Change the Serializer that directly writes a new replaced 
object writeObject (does not implement writeReplace) to implement the 
writeReplace interface to reduce resource usage.
    
    * clean: Remove redundant Null checks
    
    * fix: The length may be less than 
0(com.alibaba.com.caucho.hessian.io.Hessian2Input#readObject:2356)
    
    * refactor: Add the throw exception to the signature of the writeReplace 
method
    
    * refactor: The exception thrown by writeReplace should be IOException.
    
    * fix: Since AnnotationSerializer supports references, 
AnnotationDeserializer must set in.setRef(ref, annotation) accordingly after 
in.addRef(null); otherwise it will result in a reference to null. I have also 
checked other in.addRef(null).
    
    * fix: Fix WeekFieldsDeserializer's handling of ref
    
    * test: add testCollection for Modified xxxSerializer
    
    * perf: When Annotation deserializing allocate init capacity directly 
according to the expected size to avoid resize.
    
    ---------
    
    Co-authored-by: xuebing <[email protected]>
---
 .../com/caucho/hessian/io/AbstractSerializer.java  |  2 +-
 .../caucho/hessian/io/AnnotationDeserializer.java  | 22 ++++---
 .../com/caucho/hessian/io/BitSetSerializer.java    | 12 +---
 .../com/caucho/hessian/io/ByteArraySerializer.java |  5 +-
 .../com/caucho/hessian/io/ClassSerializer.java     | 31 +++++-----
 .../caucho/hessian/io/CollectionDeserializer.java  | 12 ++--
 .../com/caucho/hessian/io/EnumSetSerializer.java   | 16 ++---
 .../caucho/hessian/io/InetAddressSerializer.java   | 13 +---
 .../caucho/hessian/io/InputStreamSerializer.java   |  6 +-
 .../com/caucho/hessian/io/LocaleSerializer.java    | 13 +---
 .../com/caucho/hessian/io/MapDeserializer.java     |  2 +-
 .../caucho/hessian/io/ObjectHandleSerializer.java  | 23 +++----
 .../com/caucho/hessian/io/SqlDateSerializer.java   | 33 +++++-----
 .../caucho/hessian/io/StringValueSerializer.java   | 33 +++++-----
 .../hessian/io/atomic/LongAdderSerializer.java     |  3 +
 .../chronology/AbstractChronologySerializer.java   | 11 +---
 .../ChronoLocalDateTimeImplSerializer.java         | 11 +---
 .../io/chronology/ChronoPeriodImplSerializer.java  | 11 +---
 .../ChronoZonedDateTimeImplSerializer.java         | 11 +---
 .../io/chronology/HijrahDateSerializer.java        | 11 +---
 ...Seriailzer.java => JapaneseDateSerializer.java} | 14 ++---
 .../io/chronology/JapaneseEraSerializer.java       | 11 +---
 .../io/chronology/MinguoDateSerializer.java        | 11 +---
 .../io/chronology/ThaiBuddhistDateSerializer.java  | 11 +---
 .../hessian/io/java8/DurationSerializer.java       | 12 +---
 .../caucho/hessian/io/java8/InstantSerializer.java | 12 +---
 .../hessian/io/java8/LocalDateSerializer.java      | 14 ++---
 .../hessian/io/java8/LocalDateTimeSerializer.java  | 13 ++--
 .../hessian/io/java8/LocalTimeSerializer.java      | 12 ++--
 .../hessian/io/java8/MonthDaySerializer.java       | 12 +---
 .../hessian/io/java8/OffsetDateTimeSerializer.java | 12 +---
 .../hessian/io/java8/OffsetTimeSerializer.java     | 12 +---
 .../caucho/hessian/io/java8/PeriodSerializer.java  | 12 +---
 .../SynchronizedRandomAccessListSerializer.java    | 11 +---
 .../UnmodifiableRandomAccessListSerializer.java    | 11 +---
 .../hessian/io/java8/WeekFieldsDeserializer.java   |  4 +-
 .../hessian/io/java8/YearMonthSerializer.java      | 12 +---
 .../caucho/hessian/io/java8/YearSerializer.java    | 12 +---
 .../caucho/hessian/io/java8/ZoneIdSerializer.java  | 10 +--
 .../hessian/io/java8/ZoneOffsetSerializer.java     | 12 +---
 .../hessian/io/java8/ZonedDateTimeSerializer.java  | 12 +---
 ...erializer.java => ImmutableListSerializer.java} | 14 ++---
 ...Serializer.java => ImmutableMapSerializer.java} | 14 ++---
 ...Serializer.java => ImmutableSetSerializer.java} | 14 ++---
 .../caucho/hessian/io/java9/List12Serializer.java  | 37 -----------
 .../caucho/hessian/io/java9/Map1Serializer.java    | 37 -----------
 .../caucho/hessian/io/java9/Set12Serializer.java   | 37 -----------
 .../caucho/hessian/io/java9/SubListSerializer.java | 37 -----------
 .../hessian/io/socket/Inet4AddressSerializer.java  |  3 +
 .../hessian/io/socket/Inet6AddressSerializer.java  |  3 +
 .../io/socket/InetSocketAddressSerializer.java     |  3 +
 .../caucho/hessian/io/socket/URISerializer.java    |  3 +
 .../socket/UnixDomainSocketAddressSerializer.java  |  3 +
 .../resources/META-INF/dubbo/hessian/serializers   | 16 ++---
 .../apache/dubbo/hessian/java11/ImmutableTest.java | 52 ++++++++++++++++
 .../apache/dubbo/hessian/java17/RecordTest.java    | 72 ++++++++++++++++++++++
 .../apache/dubbo/hessian/java17/StreamTest.java    |  9 +++
 .../java17/UnixDomainSocketAddressTest.java        | 10 +++
 .../hessian/java17/base/SerializeTestBase.java     | 21 +++++++
 .../com/caucho/hessian/io/AnnotationTest.java      | 10 +++
 .../com/caucho/hessian/io/BigDecimalTest.java      | 10 +++
 .../com/caucho/hessian/io/BigIntegerTest.java      | 10 +++
 .../caucho/hessian/io/BitSetSerializerTest.java    | 13 ++++
 .../alibaba/com/caucho/hessian/io/ClockTest.java   | 10 +++
 .../hessian/io/CollectionSerializerTest.java       | 21 +++++++
 .../com/caucho/hessian/io/CollectionsTest.java     | 27 ++++++++
 .../hessian/io/ConcurrentLinkedDequeTest.java      | 19 ++++++
 .../hessian/io/ConcurrentSkipListMapTest.java      | 13 ++++
 .../com/caucho/hessian/io/CurrencyTest.java        | 10 +++
 .../caucho/hessian/io/DateFormatSymbolsTest.java   | 22 +++++++
 .../alibaba/com/caucho/hessian/io/EnumSetTest.java | 10 +++
 .../alibaba/com/caucho/hessian/io/FileTest.java    | 10 +++
 .../com/caucho/hessian/io/Hessian2UUIDTest.java    | 15 +++++
 .../hessian/io/HessianJavaSerializeTest.java       | 46 ++++++++++++++
 .../caucho/hessian/io/LinkedTransferQueueTest.java | 19 ++++++
 .../caucho/hessian/io/LocaleSerializerTest.java    | 10 +++
 .../alibaba/com/caucho/hessian/io/LocaleTest.java  | 10 +++
 .../com/caucho/hessian/io/NumberFormatTest.java    | 21 +++++++
 .../hessian/io/PriorityBlockingQueueTest.java      | 20 ++++++
 .../com/caucho/hessian/io/PropertiesTest.java      | 12 ++++
 .../com/caucho/hessian/io/SimpleTimeZoneTest.java  | 10 +++
 .../com/caucho/hessian/io/StringBufferTest.java    | 17 +++++
 .../com/caucho/hessian/io/StringBuilderTest.java   | 17 +++++
 .../caucho/hessian/io/SynchronousQueueTest.java    | 19 ++++++
 .../com/caucho/hessian/io/ThrowableTest.java       | 19 ++++++
 .../alibaba/com/caucho/hessian/io/TreeMapTest.java | 13 ++++
 .../alibaba/com/caucho/hessian/io/TreeSetTest.java | 14 +++++
 .../com/alibaba/com/caucho/hessian/io/URITest.java | 10 +++
 .../alibaba/com/caucho/hessian/io/VectorTest.java  | 14 +++++
 .../com/caucho/hessian/io/WeekFieldsTest.java      | 10 +++
 .../caucho/hessian/io/atomic/LongAdderTest.java    | 18 ++++++
 .../caucho/hessian/io/base/SerializeTestBase.java  | 20 +++++-
 .../caucho/hessian/io/issue73/SerializeTest.java   | 29 +++++++++
 93 files changed, 910 insertions(+), 546 deletions(-)

diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java
index 456dbc14..d5447b96 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AbstractSerializer.java
@@ -106,7 +106,7 @@ abstract public class AbstractSerializer implements 
Serializer {
         }
     }
 
-    protected Object writeReplace(Object obj) {
+    protected Object writeReplace(Object obj) throws IOException {
         return null;
     }
 
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AnnotationDeserializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AnnotationDeserializer.java
index 7b04ccf8..c6ca0fed 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AnnotationDeserializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/AnnotationDeserializer.java
@@ -88,10 +88,13 @@ public class AnnotationDeserializer extends 
AbstractMapDeserializer {
 
             in.readMapEnd();
 
-            return Proxy.newProxyInstance(_annType.getClassLoader(),
-                    new Class[]{_annType},
-                    new AnnotationInvocationHandler(_annType, valueMap));
+            Object annotation = 
Proxy.newProxyInstance(_annType.getClassLoader(),
+                new Class[]{_annType},
+                new AnnotationInvocationHandler(_annType, valueMap));
 
+            in.setRef(ref, annotation);
+
+            return annotation;
         } catch (IOException e) {
             throw e;
         } catch (Exception e) {
@@ -105,9 +108,9 @@ public class AnnotationDeserializer extends 
AbstractMapDeserializer {
         String[] fieldNames = (String[]) fields;
 
         try {
-            in.addRef(null);
+            int ref = in.addRef(null);
 
-            HashMap<String, Object> valueMap = new HashMap<String, Object>(8);
+            HashMap<String, Object> valueMap = new 
HashMap<>(MapUtil.capacity(fieldNames.length));
 
             for (int i = 0; i < fieldNames.length; i++) {
                 String name = fieldNames[i];
@@ -115,10 +118,13 @@ public class AnnotationDeserializer extends 
AbstractMapDeserializer {
                 valueMap.put(name, in.readObject());
             }
 
-            return Proxy.newProxyInstance(_annType.getClassLoader(),
-                    new Class[]{_annType},
-                    new AnnotationInvocationHandler(_annType, valueMap));
+            Object annotation = 
Proxy.newProxyInstance(_annType.getClassLoader(),
+                new Class[]{_annType},
+                new AnnotationInvocationHandler(_annType, valueMap));
+
+            in.setRef(ref, annotation);
 
+            return annotation;
         } catch (IOException e) {
             throw e;
         } catch (Exception e) {
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BitSetSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BitSetSerializer.java
index bc5099a4..2c55ec3b 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BitSetSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/BitSetSerializer.java
@@ -49,7 +49,6 @@
 package com.alibaba.com.caucho.hessian.io;
 
 
-import java.io.IOException;
 import java.util.BitSet;
 
 /**
@@ -63,14 +62,7 @@ public class BitSetSerializer extends AbstractSerializer {
     }
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out)
-            throws IOException {
-        if (obj == null)
-            out.writeNull();
-        else {
-            BitSet bitSet = (BitSet) obj;
-
-            out.writeObject(new BitSetHandle(bitSet.toLongArray()));
-        }
+    public Object writeReplace(Object obj){
+        return new BitSetHandle(((BitSet) obj).toLongArray());
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ByteArraySerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ByteArraySerializer.java
index 6f15715c..c8649c02 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ByteArraySerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ByteArraySerializer.java
@@ -70,9 +70,6 @@ public class ByteArraySerializer extends AbstractSerializer
             throws IOException {
         byte[] data = (byte[]) obj;
 
-        if (data != null)
-            out.writeBytes(data, 0, data.length);
-        else
-            out.writeNull();
+        out.writeBytes(data, 0, data.length);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java
index b65411e5..d8d62822 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ClassSerializer.java
@@ -56,28 +56,25 @@ import java.io.IOException;
 public class ClassSerializer extends AbstractSerializer {
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
+
         Class cl = (Class) obj;
+        int ref = out.writeObjectBegin("java.lang.Class");
 
-        if (cl == null) {
-            out.writeNull();
-        } else if (out.addRef(obj)) {
-            return;
+        if (ref < -1) {
+            out.writeString("name");
+            out.writeString(cl.getName());
+            out.writeMapEnd();
         } else {
-            int ref = out.writeObjectBegin("java.lang.Class");
-
-            if (ref < -1) {
+            if (ref == -1) {
+                out.writeInt(1);
                 out.writeString("name");
-                out.writeString(cl.getName());
-                out.writeMapEnd();
-            } else {
-                if (ref == -1) {
-                    out.writeInt(1);
-                    out.writeString("name");
-                    out.writeObjectBegin("java.lang.Class");
-                }
-
-                out.writeString(cl.getName());
+                out.writeObjectBegin("java.lang.Class");
             }
+
+            out.writeString(cl.getName());
         }
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
index 3d1447cb..fceb98a7 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/CollectionDeserializer.java
@@ -129,9 +129,9 @@ public class CollectionDeserializer extends 
AbstractListDeserializer {
             throws IOException {
         Collection list = null;
 
-        if (_type == null)
-            list = new ArrayList(expectedSize);
-        else if (!_type.isInterface()) {
+        if (_type == null) {
+            list = expectedSize <= 0 ? new ArrayList() : new 
ArrayList(expectedSize);
+        } else if (!_type.isInterface()) {
             try {
                 list = (Collection) _type.newInstance();
             } catch (Exception e) {
@@ -143,9 +143,9 @@ public class CollectionDeserializer extends 
AbstractListDeserializer {
             list = new TreeSet();
         else if (Set.class.isAssignableFrom(_type))
             list = new HashSet(MapUtil.capacity(expectedSize));
-        else if (Collection.class.isAssignableFrom(_type))
-            list = new ArrayList(expectedSize);
-        else {
+        else if (Collection.class.isAssignableFrom(_type)) {
+            list = expectedSize <= 0 ? new ArrayList() : new 
ArrayList(expectedSize);
+        } else {
             try {
                 list = (Collection) _type.newInstance();
             } catch (Exception e) {
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java
index c512a507..585d99fd 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/EnumSetSerializer.java
@@ -17,9 +17,9 @@
 package com.alibaba.com.caucho.hessian.io;
 
 import com.alibaba.com.caucho.hessian.HessianException;
+import java.io.IOException;
 import sun.misc.Unsafe;
 
-import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.EnumSet;
 import java.util.logging.Level;
@@ -67,15 +67,11 @@ public class EnumSetSerializer extends AbstractSerializer {
     }
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-        } else {
-            EnumSet enumSet = (EnumSet) obj;
-            Class type = getElementClass(enumSet);
-            Object[] objects = enumSet.toArray();
-            out.writeObject(new EnumSetHandler(type, objects));
-        }
+    public Object writeReplace(Object obj) throws IOException {
+        EnumSet enumSet = (EnumSet) obj;
+        Class type = getElementClass(enumSet);
+        Object[] objects = enumSet.toArray();
+        return new EnumSetHandler(type, objects);
     }
 
     private Class<?> getElementClass(EnumSet enumSet) throws IOException {
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InetAddressSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InetAddressSerializer.java
index c0785a6e..0a70ce6b 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InetAddressSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InetAddressSerializer.java
@@ -48,7 +48,6 @@
 
 package com.alibaba.com.caucho.hessian.io;
 
-import java.io.IOException;
 import java.net.InetAddress;
 
 /**
@@ -62,14 +61,8 @@ public class InetAddressSerializer extends 
AbstractSerializer {
     }
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out)
-            throws IOException {
-        if (obj == null)
-            out.writeNull();
-        else {
-            InetAddress addr = (InetAddress) obj;
-            out.writeObject(new InetAddressHandle(addr.getHostName(),
-                    addr.getAddress()));
-        }
+    public Object writeReplace(Object obj) {
+        InetAddress addr = (InetAddress) obj;
+        return new InetAddressHandle(addr.getHostName(), addr.getAddress());
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java
index ecb51652..5cd4c580 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/InputStreamSerializer.java
@@ -62,10 +62,6 @@ public class InputStreamSerializer extends 
AbstractSerializer {
             throws IOException {
         InputStream is = (InputStream) obj;
 
-        if (is == null)
-            out.writeNull();
-        else {
-            out.writeByteStream(is);
-        }
+        out.writeByteStream(is);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.java
index 41138d8a..f165f4e3 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/LocaleSerializer.java
@@ -49,7 +49,6 @@
 package com.alibaba.com.caucho.hessian.io;
 
 
-import java.io.IOException;
 import java.util.Locale;
 
 /**
@@ -57,14 +56,8 @@ import java.util.Locale;
  */
 public class LocaleSerializer extends AbstractSerializer {
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out)
-            throws IOException {
-        if (obj == null)
-            out.writeNull();
-        else {
-            Locale locale = (Locale) obj;
-
-            out.writeObject(new LocaleHandle(locale.toString()));
-        }
+    public Object writeReplace(Object obj) {
+        Locale locale = (Locale) obj;
+        return new LocaleHandle(locale.toString());
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java
index 45f99d4c..253540f7 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/MapDeserializer.java
@@ -152,7 +152,7 @@ public class MapDeserializer extends 
AbstractMapDeserializer {
         String[] fieldNames = (String[]) fields;
         Map<Object, Object> map = createMap(fieldNames.length);
 
-        int ref = in.addRef(map);
+        in.addRef(map);
 
         for (int i = 0; i < fieldNames.length; i++) {
             String name = fieldNames[i];
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectHandleSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectHandleSerializer.java
index b135aa37..dfc969ea 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectHandleSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/ObjectHandleSerializer.java
@@ -58,21 +58,18 @@ public class ObjectHandleSerializer extends 
AbstractSerializer {
 
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
-        if (obj == null)
-            out.writeNull();
-        else {
-            if (out.addRef(obj))
-                return;
+        if (out.addRef(obj)) {
+            return;
+        }
 
-            int ref = out.writeObjectBegin("object");
+        int ref = out.writeObjectBegin("object");
 
-            if (ref < -1) {
-                out.writeMapEnd();
-            } else {
-                if (ref == -1) {
-                    out.writeInt(0);
-                    out.writeObjectBegin("object");
-                }
+        if (ref < -1) {
+            out.writeMapEnd();
+        } else {
+            if (ref == -1) {
+                out.writeInt(0);
+                out.writeObjectBegin("object");
             }
         }
     }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java
index c812c7ed..ddc6afa1 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/SqlDateSerializer.java
@@ -57,29 +57,26 @@ import java.util.Date;
 public class SqlDateSerializer extends AbstractSerializer {
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
-        if (obj == null)
-            out.writeNull();
-        else {
-            Class cl = obj.getClass();
+        if (out.addRef(obj)) {
+            return;
+        }
 
-            if (out.addRef(obj))
-                return;
+        Class cl = obj.getClass();
 
-            int ref = out.writeObjectBegin(cl.getName());
+        int ref = out.writeObjectBegin(cl.getName());
 
-            if (ref < -1) {
+        if (ref < -1) {
+            out.writeString("value");
+            out.writeUTCDate(((Date) obj).getTime());
+            out.writeMapEnd();
+        } else {
+            if (ref == -1) {
+                out.writeInt(1);
                 out.writeString("value");
-                out.writeUTCDate(((Date) obj).getTime());
-                out.writeMapEnd();
-            } else {
-                if (ref == -1) {
-                    out.writeInt(1);
-                    out.writeString("value");
-                    out.writeObjectBegin(cl.getName());
-                }
-
-                out.writeUTCDate(((Date) obj).getTime());
+                out.writeObjectBegin(cl.getName());
             }
+
+            out.writeUTCDate(((Date) obj).getTime());
         }
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java
index 42ac4108..82dcb7bd 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/StringValueSerializer.java
@@ -58,29 +58,26 @@ public class StringValueSerializer extends 
AbstractSerializer {
 
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
-        if (obj == null)
-            out.writeNull();
-        else {
-            if (out.addRef(obj))
-                return;
+        if (out.addRef(obj)) {
+            return;
+        }
 
-            Class cl = obj.getClass();
+        Class cl = obj.getClass();
 
-            int ref = out.writeObjectBegin(cl.getName());
+        int ref = out.writeObjectBegin(cl.getName());
 
-            if (ref < -1) {
+        if (ref < -1) {
+            out.writeString("value");
+            out.writeString(obj.toString());
+            out.writeMapEnd();
+        } else {
+            if (ref == -1) {
+                out.writeInt(1);
                 out.writeString("value");
-                out.writeString(obj.toString());
-                out.writeMapEnd();
-            } else {
-                if (ref == -1) {
-                    out.writeInt(1);
-                    out.writeString("value");
-                    out.writeObjectBegin(cl.getName());
-                }
-
-                out.writeString(obj.toString());
+                out.writeObjectBegin(cl.getName());
             }
+
+            out.writeString(obj.toString());
         }
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderSerializer.java
index 2fa26299..716ae221 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderSerializer.java
@@ -30,6 +30,9 @@ public class LongAdderSerializer extends AbstractSerializer {
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
 
         String replacedClName = 
"java.util.concurrent.atomic.LongAdder$SerializationProxy";
 
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/AbstractChronologySerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/AbstractChronologySerializer.java
index dd8ff7b2..aef32626 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/AbstractChronologySerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/AbstractChronologySerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.AbstractChronology;
 
 public class AbstractChronologySerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new AbstractChronologyHandle((AbstractChronology) 
obj));
+    public Object writeReplace(Object obj) {
+        return new AbstractChronologyHandle((AbstractChronology) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoLocalDateTimeImplSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoLocalDateTimeImplSerializer.java
index 53507405..a0742e93 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoLocalDateTimeImplSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoLocalDateTimeImplSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.ChronoLocalDateTime;
 
 public class ChronoLocalDateTimeImplSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new 
ChronoLocalDateTimeImplHandle((ChronoLocalDateTime) obj));
+    public Object writeReplace(Object obj) {
+        return new ChronoLocalDateTimeImplHandle((ChronoLocalDateTime) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoPeriodImplSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoPeriodImplSerializer.java
index 83a1804b..d950220d 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoPeriodImplSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoPeriodImplSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.ChronoPeriod;
 
 public class ChronoPeriodImplSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ChronoPeriodImplHandle((ChronoPeriod) obj));
+    public Object writeReplace(Object obj) {
+        return new ChronoPeriodImplHandle((ChronoPeriod) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoZonedDateTimeImplSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoZonedDateTimeImplSerializer.java
index 4f1e5489..c4aa313b 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoZonedDateTimeImplSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ChronoZonedDateTimeImplSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.ChronoZonedDateTime;
 
 public class ChronoZonedDateTimeImplSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new 
ChronoZonedDateTimeImplHandle((ChronoZonedDateTime) obj));
+    public Object writeReplace(Object obj) {
+        return new ChronoZonedDateTimeImplHandle((ChronoZonedDateTime) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/HijrahDateSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/HijrahDateSerializer.java
index 220efded..f26f6ae7 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/HijrahDateSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/HijrahDateSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.HijrahDate;
 
 public class HijrahDateSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new HijrahDateHandle((HijrahDate) obj));
+    public Object writeReplace(Object obj) {
+        return new HijrahDateHandle((HijrahDate) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseDateSeriailzer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseDateSerializer.java
similarity index 70%
rename from 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseDateSeriailzer.java
rename to 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseDateSerializer.java
index 659bbd1a..2eb540bd 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseDateSeriailzer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseDateSerializer.java
@@ -16,21 +16,15 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.JapaneseDate;
 
-public class JapaneseDateSeriailzer <T> extends AbstractSerializer {
+public class JapaneseDateSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new JapaneseDateHandle((JapaneseDate) obj));
+    public Object writeReplace(Object obj) {
+        return new JapaneseDateHandle((JapaneseDate) obj);
     }
+
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseEraSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseEraSerializer.java
index b910b8cf..0fe64dbb 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseEraSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/JapaneseEraSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.JapaneseEra;
 
 public class JapaneseEraSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new JapaneseEraHandle((JapaneseEra) obj));
+    public Object writeReplace(Object obj) {
+        return new JapaneseEraHandle((JapaneseEra) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/MinguoDateSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/MinguoDateSerializer.java
index 74a95f64..a921da84 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/MinguoDateSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/MinguoDateSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.MinguoDate;
 
 public class MinguoDateSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new MinguoDateHandle((MinguoDate) obj));
+    public Object writeReplace(Object obj) {
+        return new MinguoDateHandle((MinguoDate) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ThaiBuddhistDateSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ThaiBuddhistDateSerializer.java
index 978c5fc9..befd08b8 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ThaiBuddhistDateSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/chronology/ThaiBuddhistDateSerializer.java
@@ -16,21 +16,14 @@
  */
 package com.alibaba.com.caucho.hessian.io.chronology;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.time.chrono.ThaiBuddhistDate;
 
 public class ThaiBuddhistDateSerializer <T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ThaiBuddhistDateHandle((ThaiBuddhistDate) obj));
+    public Object writeReplace(Object obj) {
+        return new ThaiBuddhistDateHandle((ThaiBuddhistDate) obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationSerializer.java
index ba30a6ee..719f4cd9 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/DurationSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class DurationSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new DurationHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new DurationHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantSerializer.java
index d31c4854..b15744a2 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/InstantSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class InstantSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new InstantHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new InstantHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateSerializer.java
index 99c1a0b9..67aff600 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateSerializer.java
@@ -28,18 +28,13 @@ public class LocalDateSerializer<T> extends 
AbstractSerializer {
 
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
         if (SerializationConfig.isCompactMode()) {
             if (out.addRef(obj)) {
                 return;
             }
 
             Class<?> cl = obj.getClass();
-            
+
             int ref = out.writeObjectBegin(cl.getName());
 
             LocalDate localDate = (LocalDate) obj;
@@ -55,8 +50,13 @@ public class LocalDateSerializer<T> extends 
AbstractSerializer {
                 out.writeLong(localDate.toEpochDay());
             }
         } else {
-            out.writeObject(new LocalDateHandle(obj));
+            super.writeObject(obj, out);
         }
     }
+
+    @Override
+    protected Object writeReplace(Object obj) {
+        return new LocalDateHandle(obj);
+    }
     
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeSerializer.java
index d72848bf..4abae3e8 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalDateTimeSerializer.java
@@ -26,11 +26,6 @@ public class LocalDateTimeSerializer<T> extends 
AbstractSerializer {
 
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
         if (SerializationConfig.isCompactMode()) {
             if (out.addRef(obj)) {
                 return;
@@ -59,7 +54,13 @@ public class LocalDateTimeSerializer<T> extends 
AbstractSerializer {
                 out.writeLong(localDateTime.toLocalTime().toNanoOfDay());
             }   
         } else {
-            out.writeObject(new LocalDateTimeHandle(obj));
+            super.writeObject(obj, out);
         }
     }
+
+    @Override
+    protected Object writeReplace(Object obj) {
+        return new LocalDateTimeHandle(obj);
+    }
+
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeSerializer.java
index f8c1d09c..c62b3fb4 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/LocalTimeSerializer.java
@@ -26,11 +26,6 @@ public class LocalTimeSerializer<T> extends 
AbstractSerializer {
 
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
         if (SerializationConfig.isCompactMode()) {
             if (out.addRef(obj)) {
                 return;
@@ -53,8 +48,13 @@ public class LocalTimeSerializer<T> extends 
AbstractSerializer {
                 out.writeLong(localTime.toNanoOfDay());
             }
         } else {
-            out.writeObject(new LocalTimeHandle(obj));
+            super.writeObject(obj, out);
         }
     }
 
+    @Override
+    protected Object writeReplace(Object obj) {
+        return new LocalTimeHandle(obj);
+    }
+
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDaySerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDaySerializer.java
index 708cd043..6bc55bc9 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDaySerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/MonthDaySerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class MonthDaySerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new MonthDayHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new MonthDayHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeSerializer.java
index 63726d62..4337cd69 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetDateTimeSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class OffsetDateTimeSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new OffsetDateTimeHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new OffsetDateTimeHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeSerializer.java
index 25317324..1df9c81f 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/OffsetTimeSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class OffsetTimeSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new OffsetTimeHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new OffsetTimeHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodSerializer.java
index b7edfecc..276b53f4 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/PeriodSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class PeriodSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new PeriodHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new PeriodHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/SynchronizedRandomAccessListSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/SynchronizedRandomAccessListSerializer.java
index 13fcbcca..882854de 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/SynchronizedRandomAccessListSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/SynchronizedRandomAccessListSerializer.java
@@ -16,10 +16,8 @@
  */
 package com.alibaba.com.caucho.hessian.io.java8;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -27,12 +25,7 @@ import java.util.LinkedList;
 public class SynchronizedRandomAccessListSerializer <T> extends 
AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(Collections.synchronizedList(new 
LinkedList<T>((Collection<T>) obj)));
+    protected Object writeReplace(Object obj) {
+        return Collections.synchronizedList(new LinkedList<T>((Collection<T>) 
obj));
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/UnmodifiableRandomAccessListSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/UnmodifiableRandomAccessListSerializer.java
index d5eb553b..79447faa 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/UnmodifiableRandomAccessListSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/UnmodifiableRandomAccessListSerializer.java
@@ -16,10 +16,8 @@
  */
 package com.alibaba.com.caucho.hessian.io.java8;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -27,12 +25,7 @@ import java.util.LinkedList;
 public class UnmodifiableRandomAccessListSerializer<T> extends 
AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(Collections.unmodifiableList(new 
LinkedList<T>((Collection<T>) obj)));
+    protected Object writeReplace(Object obj) {
+        return Collections.unmodifiableList(new LinkedList<T>((Collection<T>) 
obj));
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/WeekFieldsDeserializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/WeekFieldsDeserializer.java
index f65bc454..e414a47a 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/WeekFieldsDeserializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/WeekFieldsDeserializer.java
@@ -49,6 +49,8 @@ public class WeekFieldsDeserializer extends 
AbstractDeserializer {
                              String[] fieldNames)
             throws IOException {
         try {
+            int ref = in.addRef(null);
+
             DayOfWeek firstDayOfWeek = null;
             int minimalDays = 0;
             for (String fieldName : fieldNames) {
@@ -62,7 +64,7 @@ public class WeekFieldsDeserializer extends 
AbstractDeserializer {
             }
 
             Object obj = WeekFields.of(firstDayOfWeek, minimalDays);
-            in.addRef(obj);
+            in.setRef(ref, obj);
 
             return obj;
         } catch (IOException e) {
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthSerializer.java
index dc120920..1996c1bf 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearMonthSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class YearMonthSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new YearMonthHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new YearMonthHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearSerializer.java
index 2973fc9b..ce96e9e0 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/YearSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class YearSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new YearHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new YearHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java
index 18a03d3b..6675cccd 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneIdSerializer.java
@@ -18,10 +18,8 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 
 public class ZoneIdSerializer extends AbstractSerializer {
 
@@ -32,12 +30,8 @@ public class ZoneIdSerializer extends AbstractSerializer {
     }
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-        } else {
-            out.writeObject(new ZoneIdHandle(obj));
-        }
+    protected Object writeReplace(Object obj) {
+        return new ZoneIdHandle(obj);
     }
 
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetSerializer.java
index 72a28c2c..de7bb57d 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZoneOffsetSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class ZoneOffsetSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ZoneOffsetHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new ZoneOffsetHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeSerializer.java
index 32dd460d..1c4652e6 100755
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java8/ZonedDateTimeSerializer.java
@@ -18,20 +18,12 @@
 package com.alibaba.com.caucho.hessian.io.java8;
 
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
-
 public class ZonedDateTimeSerializer<T> extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ZonedDateTimeHandle(obj));
+    public Object writeReplace(Object obj) {
+        return new ZonedDateTimeHandle(obj);
     }
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ListNSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableListSerializer.java
similarity index 72%
rename from 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ListNSerializer.java
rename to 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableListSerializer.java
index 0279f300..359f8928 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ListNSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableListSerializer.java
@@ -16,22 +16,16 @@
  */
 package com.alibaba.com.caucho.hessian.io.java9;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-public class ListNSerializer extends AbstractSerializer {
+public class ImmutableListSerializer extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ArrayList<>((List) obj));
+    protected Object writeReplace(Object obj) {
+        return new ArrayList<>((List) obj);
     }
+
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/MapNSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableMapSerializer.java
similarity index 72%
rename from 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/MapNSerializer.java
rename to 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableMapSerializer.java
index 7d799148..819b36a2 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/MapNSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableMapSerializer.java
@@ -16,22 +16,16 @@
  */
 package com.alibaba.com.caucho.hessian.io.java9;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
-public class MapNSerializer extends AbstractSerializer {
+public class ImmutableMapSerializer extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new HashMap<>((Map) obj));
+    protected Object writeReplace(Object obj) {
+        return new HashMap<>((Map) obj);
     }
+
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/SetNSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableSetSerializer.java
similarity index 72%
rename from 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/SetNSerializer.java
rename to 
hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableSetSerializer.java
index 9fdf0f72..0ca7ed2d 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/SetNSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/ImmutableSetSerializer.java
@@ -16,22 +16,16 @@
  */
 package com.alibaba.com.caucho.hessian.io.java9;
 
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
 import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
 
-import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
 
-public class SetNSerializer extends AbstractSerializer {
+public class ImmutableSetSerializer extends AbstractSerializer {
 
     @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new HashSet<>((Set) obj));
+    protected Object writeReplace(Object obj) {
+        return new HashSet<>((Set) obj);
     }
+
 }
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/List12Serializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/List12Serializer.java
deleted file mode 100644
index 4a661766..00000000
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/List12Serializer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.alibaba.com.caucho.hessian.io.java9;
-
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
-import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class List12Serializer extends AbstractSerializer {
-
-    @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ArrayList<>((List) obj));
-    }
-}
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/Map1Serializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/Map1Serializer.java
deleted file mode 100644
index 4831716e..00000000
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/Map1Serializer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.alibaba.com.caucho.hessian.io.java9;
-
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
-import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Map1Serializer extends AbstractSerializer {
-
-    @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new HashMap<>((Map) obj));
-    }
-}
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/Set12Serializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/Set12Serializer.java
deleted file mode 100644
index 85291139..00000000
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/Set12Serializer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.alibaba.com.caucho.hessian.io.java9;
-
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
-import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
-
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-
-public class Set12Serializer extends AbstractSerializer {
-
-    @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new HashSet<>((Set) obj));
-    }
-}
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/SubListSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/SubListSerializer.java
deleted file mode 100644
index db35c9e1..00000000
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/java9/SubListSerializer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.alibaba.com.caucho.hessian.io.java9;
-
-import com.alibaba.com.caucho.hessian.io.AbstractHessianOutput;
-import com.alibaba.com.caucho.hessian.io.AbstractSerializer;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class SubListSerializer extends AbstractSerializer {
-
-    @Override
-    public void writeObject(Object obj, AbstractHessianOutput out) throws 
IOException {
-        if (obj == null) {
-            out.writeNull();
-            return;
-        }
-
-        out.writeObject(new ArrayList<>((List) obj));
-    }
-}
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet4AddressSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet4AddressSerializer.java
index db67c9c8..d5a81a8b 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet4AddressSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet4AddressSerializer.java
@@ -27,6 +27,9 @@ public class Inet4AddressSerializer extends 
AbstractSerializer {
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
 
         String replacedClName = "java.net.InetAddress";
 
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressSerializer.java
index ea96026b..918db384 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressSerializer.java
@@ -28,6 +28,9 @@ public class Inet6AddressSerializer extends 
AbstractSerializer {
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
 
         String replacedClName = "java.net.Inet6Address";
 
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/InetSocketAddressSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/InetSocketAddressSerializer.java
index 51c52e3f..34a1ec0f 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/InetSocketAddressSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/InetSocketAddressSerializer.java
@@ -27,6 +27,9 @@ public class InetSocketAddressSerializer extends 
AbstractSerializer {
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
 
         String replacedClName = "java.net.InetSocketAddress";
 
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/URISerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/URISerializer.java
index 05de4259..ac76aa55 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/URISerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/URISerializer.java
@@ -27,6 +27,9 @@ public class URISerializer extends AbstractSerializer {
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
 
         String replacedClName = "java.net.URI";
 
diff --git 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/UnixDomainSocketAddressSerializer.java
 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/UnixDomainSocketAddressSerializer.java
index 4f8fba63..35a002ad 100644
--- 
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/UnixDomainSocketAddressSerializer.java
+++ 
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/UnixDomainSocketAddressSerializer.java
@@ -42,6 +42,9 @@ public class UnixDomainSocketAddressSerializer extends 
AbstractSerializer {
     @Override
     public void writeObject(Object obj, AbstractHessianOutput out)
             throws IOException {
+        if (out.addRef(obj)) {
+            return;
+        }
 
         String replacedClName = "java.net.UnixDomainSocketAddress$Ser";
 
diff --git a/hessian-lite/src/main/resources/META-INF/dubbo/hessian/serializers 
b/hessian-lite/src/main/resources/META-INF/dubbo/hessian/serializers
index 67d647ea..8d69a927 100644
--- a/hessian-lite/src/main/resources/META-INF/dubbo/hessian/serializers
+++ b/hessian-lite/src/main/resources/META-INF/dubbo/hessian/serializers
@@ -16,13 +16,13 @@ 
java.time.YearMonth=com.alibaba.com.caucho.hessian.io.java8.YearMonthSerializer
 
java.time.ZonedDateTime=com.alibaba.com.caucho.hessian.io.java8.ZonedDateTimeSerializer
 java.time.ZoneId=com.alibaba.com.caucho.hessian.io.java8.ZoneIdSerializer
 
java.time.ZoneOffset=com.alibaba.com.caucho.hessian.io.java8.ZoneOffsetSerializer
-java.util.ImmutableCollections$List12=com.alibaba.com.caucho.hessian.io.java9.List12Serializer
-java.util.ImmutableCollections$ListN=com.alibaba.com.caucho.hessian.io.java9.ListNSerializer
-java.util.ImmutableCollections$Map1=com.alibaba.com.caucho.hessian.io.java9.Map1Serializer
-java.util.ImmutableCollections$MapN=com.alibaba.com.caucho.hessian.io.java9.MapNSerializer
-java.util.ImmutableCollections$Set12=com.alibaba.com.caucho.hessian.io.java9.Set12Serializer
-java.util.ImmutableCollections$SetN=com.alibaba.com.caucho.hessian.io.java9.SetNSerializer
-java.util.ImmutableCollections$SubList=com.alibaba.com.caucho.hessian.io.java9.SubListSerializer
+java.util.ImmutableCollections$List12=com.alibaba.com.caucho.hessian.io.java9.ImmutableListSerializer
+java.util.ImmutableCollections$ListN=com.alibaba.com.caucho.hessian.io.java9.ImmutableListSerializer
+java.util.ImmutableCollections$Map1=com.alibaba.com.caucho.hessian.io.java9.ImmutableMapSerializer
+java.util.ImmutableCollections$MapN=com.alibaba.com.caucho.hessian.io.java9.ImmutableMapSerializer
+java.util.ImmutableCollections$Set12=com.alibaba.com.caucho.hessian.io.java9.ImmutableSetSerializer
+java.util.ImmutableCollections$SetN=com.alibaba.com.caucho.hessian.io.java9.ImmutableSetSerializer
+java.util.ImmutableCollections$SubList=com.alibaba.com.caucho.hessian.io.java9.ImmutableListSerializer
 
java.util.Collections$UnmodifiableRandomAccessList=com.alibaba.com.caucho.hessian.io.java8.UnmodifiableRandomAccessListSerializer
 
java.util.Collections$SynchronizedRandomAccessList=com.alibaba.com.caucho.hessian.io.java8.SynchronizedRandomAccessListSerializer
 
java.time.chrono.HijrahChronology=com.alibaba.com.caucho.hessian.io.chronology.AbstractChronologySerializer
@@ -33,7 +33,7 @@ 
java.time.chrono.ThaiBuddhistChronology=com.alibaba.com.caucho.hessian.io.chrono
 
java.time.chrono.ChronoLocalDateTimeImpl=com.alibaba.com.caucho.hessian.io.chronology.ChronoLocalDateTimeImplSerializer
 
java.time.chrono.ChronoPeriodImpl=com.alibaba.com.caucho.hessian.io.chronology.ChronoPeriodImplSerializer
 
java.time.chrono.ChronoZonedDateTimeImpl=com.alibaba.com.caucho.hessian.io.chronology.ChronoZonedDateTimeImplSerializer
-java.time.chrono.JapaneseDate=com.alibaba.com.caucho.hessian.io.chronology.JapaneseDateSeriailzer
+java.time.chrono.JapaneseDate=com.alibaba.com.caucho.hessian.io.chronology.JapaneseDateSerializer
 
java.time.chrono.JapaneseEra=com.alibaba.com.caucho.hessian.io.chronology.JapaneseEraSerializer
 
java.time.chrono.HijrahDate=com.alibaba.com.caucho.hessian.io.chronology.HijrahDateSerializer
 
java.time.chrono.MinguoDate=com.alibaba.com.caucho.hessian.io.chronology.MinguoDateSerializer
diff --git 
a/java-11-test/src/test/java/org/apache/dubbo/hessian/java11/ImmutableTest.java 
b/java-11-test/src/test/java/org/apache/dubbo/hessian/java11/ImmutableTest.java
index f69f803a..eb60a64c 100644
--- 
a/java-11-test/src/test/java/org/apache/dubbo/hessian/java11/ImmutableTest.java
+++ 
b/java-11-test/src/test/java/org/apache/dubbo/hessian/java11/ImmutableTest.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -98,4 +99,55 @@ public class ImmutableTest extends SerializeTestBase {
             return Objects.hash(a, b, c);
         }
     }
+
+    @Test
+    public void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        assertImmutableList(list, List.of());
+        assertImmutableList(list, List.of(1));
+        assertImmutableList(list, List.of(1, 2));
+        assertImmutableList(list, List.of(1, 2, 3));
+
+        assertImmutableMap(list, Map.of());
+        assertImmutableMap(list, Map.of(1, 2));
+        assertImmutableMap(list, Map.of(1, 2, 3, 4));
+        assertImmutableMap(list, Map.of(1, 2, 3, 4, 5, 6));
+
+        assertImmutableSet(list, Set.of());
+        assertImmutableSet(list, Set.of(1));
+        assertImmutableSet(list, Set.of(1, 2));
+        assertImmutableSet(list, Set.of(1, 2, 3));
+    }
+
+    private void assertImmutableList(List<Object> list, List<?> immutableList) 
throws IOException {
+        list.clear();
+        list.add(immutableList);
+        list.add(immutableList);
+        List<Object> result = baseHessian2Serialize(list);
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(immutableList, result.get(0));
+    }
+
+    private void assertImmutableMap(List<Object> list, Map<Object, Object> 
map) throws IOException {
+        list.clear();
+        list.add(map);
+        list.add(map);
+        List<Object> result = baseHessian2Serialize(list);
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(map, result.get(0));
+    }
+
+    private void assertImmutableSet(List<Object> list, Set<Object> set) throws 
IOException {
+        list.clear();
+        list.add(set);
+        list.add(set);
+        List<Object> result = baseHessian2Serialize(list);
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.iterator().next(), 
result.iterator().next());
+        Assertions.assertEquals(set, result.get(0));
+    }
+
 }
diff --git 
a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/RecordTest.java 
b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/RecordTest.java
index e4f69bd8..807ead75 100644
--- a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/RecordTest.java
+++ b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/RecordTest.java
@@ -26,6 +26,7 @@ import org.junit.jupiter.api.Test;
 import java.io.IOException;
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.IntStream;
@@ -295,4 +296,75 @@ public class RecordTest extends SerializeTestBase {
         List<Sample> samples = Arrays.asList(sample1, sample2, sample3, 
sample4);
         testEquals(samples);
     }
+
+    @Test
+    public void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        var record = new RecordRectangle("one", 2, 3L, 4.0);
+        testCollection(list, record);
+
+        var emptyRecord = new EmptyRecord();
+        testCollection(list, emptyRecord);
+
+        var recordPoint = new RecordPoint(1, 1);
+        testCollection(list, recordPoint);
+
+        // 参考上面的所有方法都执行testCollection
+        var recordWithConstructor = new RecordWithConstructor("ten");
+        testCollection(list, recordWithConstructor);
+
+        var recordOfRecord = new RecordOfRecord(new RecordRectangle("one", 2, 
3L, 4.0));
+        testCollection(list, recordOfRecord);
+
+        var arr = new RecordPoint[100];
+        IntStream.range(0, 100).forEach(i -> arr[i] = new RecordPoint(i, i + 
1));
+        testCollection(list, arr);
+
+        var recordWithArray = new RecordWithArray(new RecordRectangle[]{new 
RecordRectangle("one", 2, 3L, 4.0)});
+        testCollection(list, recordWithArray);
+
+        var recordWithNull = new RecordWithNull(null, null, null);
+        testCollection(list, recordWithNull);
+
+        var recordWithDefaultValues = new RecordWithDefaultValues(
+            (byte) 0, (short) 0, 0, 0l, 0.0f, 0.0d, '\u0000', false);
+        testCollection(list, recordWithDefaultValues);
+
+        var r = new R(1L, 1, "foo");
+        testCollection(list, r);
+
+        var r1 = new R1(1, 1L, "foo");
+        testCollection(list, r1);
+
+        var r2 = new R2("foo", 1, 1L);
+        testCollection(list, r2);
+
+        var r3 = new R3("foo");
+        testCollection(list, r3);
+
+        var r4 = new R4("foo", 1, 1L, null);
+        testCollection(list, r4);
+
+        var r5 = new R5("foo", 1, 1L,
+                false, (byte) 0, (short) 0, '\u0000', 0, 0L, 0.0f, 0.0d,
+                null, null, null, null, null, null, null, null);
+        testCollection(list, r5);
+
+        var recordWithSuperType = new RecordWithSuperType(1L);
+        testCollection(list, recordWithSuperType);
+
+        PackagePrivateRecord packagePrivateRecord = new 
PackagePrivateRecord(1, "s1");
+        testCollection(list, packagePrivateRecord);
+
+        PrivateRecord privateRecord = new PrivateRecord("s2", 2);
+        testCollection(list, privateRecord);
+
+        Sample sample1 = new Sample("1", X.A);
+        Sample sample2 = new Sample("2", X.A);
+        Sample sample3 = new Sample("3", X.A);
+        Sample sample4 = new Sample("4", X.B);
+        List<Sample> samples = Arrays.asList(sample1, sample2, sample3, 
sample4);
+        testCollection(list, samples);
+    }
 }
diff --git 
a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/StreamTest.java 
b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/StreamTest.java
index 7556edba..25653555 100644
--- a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/StreamTest.java
+++ b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/StreamTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.hessian.java17;
 
+import java.util.ArrayList;
 import org.apache.dubbo.hessian.java17.base.SerializeTestBase;
 
 import org.junit.jupiter.api.Assertions;
@@ -31,4 +32,12 @@ public class StreamTest extends SerializeTestBase {
         List<Integer> list = Stream.of(1, 2, 3).toList();
         Assertions.assertEquals(list, baseHessian2Serialize(list));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        List<Integer> streamList = Stream.of(1, 2, 3).toList();
+        testCollection(list, streamList);
+    }
 }
diff --git 
a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/UnixDomainSocketAddressTest.java
 
b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/UnixDomainSocketAddressTest.java
index 642c6fb7..62b37a3f 100644
--- 
a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/UnixDomainSocketAddressTest.java
+++ 
b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/UnixDomainSocketAddressTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.net.UnixDomainSocketAddress;
+import java.util.ArrayList;
+import java.util.List;
 
 public class UnixDomainSocketAddressTest extends SerializeTestBase {
     @Test
@@ -30,4 +32,12 @@ public class UnixDomainSocketAddressTest extends 
SerializeTestBase {
         UnixDomainSocketAddress unixDomainSocketAddress = 
UnixDomainSocketAddress.of("/etc/test");
         Assertions.assertEquals(unixDomainSocketAddress, 
baseHessian2Serialize(unixDomainSocketAddress));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        UnixDomainSocketAddress unixDomainSocketAddress = 
UnixDomainSocketAddress.of("/etc/test");
+        testCollection(list, unixDomainSocketAddress);
+    }
 }
diff --git 
a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/base/SerializeTestBase.java
 
b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/base/SerializeTestBase.java
index 22b45dee..a1bcb0ae 100644
--- 
a/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/base/SerializeTestBase.java
+++ 
b/java-17-test/src/test/java/org/apache/dubbo/hessian/java17/base/SerializeTestBase.java
@@ -22,6 +22,8 @@ import com.alibaba.com.caucho.hessian.io.Hessian2Output;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.List;
+import org.junit.jupiter.api.Assertions;
 
 /**
  * hessian base serialize utils
@@ -60,4 +62,23 @@ public class SerializeTestBase {
         Hessian2Input input = new Hessian2Input(bin);
         return input.readObject(cl);
     }
+
+    protected <T> void testCollection(List<Object> list, T t) throws 
IOException {
+        try {
+            list.clear();
+            list.add(t);
+            list.add(t);
+            List<Object> result = baseHessian2Serialize(list);
+            Assertions.assertEquals(list.size(), result.size());
+            Assertions.assertSame(result.get(0), result.get(1));
+            if (t instanceof Object[]) {
+                Assertions.assertArrayEquals((Object[]) t, (Object[]) 
result.get(0));
+            } else {
+                Assertions.assertEquals(t, result.get(0));
+            }
+        } finally {
+            list.clear();
+        }
+    }
+
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/AnnotationTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/AnnotationTest.java
index 3b247848..464e2b61 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/AnnotationTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/AnnotationTest.java
@@ -25,6 +25,8 @@ import java.io.IOException;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
+import java.util.ArrayList;
+import java.util.List;
 
 public class AnnotationTest extends SerializeTestBase {
     @Test
@@ -36,6 +38,14 @@ public class AnnotationTest extends SerializeTestBase {
         Assertions.assertEquals(annotation, testAnnotation);
     }
 
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        TestAnnotation annotation = 
AnnotatedClass.class.getAnnotation(TestAnnotation.class);
+        testCollection(list, annotation);
+    }
+
     @TestAnnotation(byteValue = 1, intValue = 2, shortValue = 3, floatValue = 
4.0f, doubleValue = 5.0, value = "test")
     public static class AnnotatedClass {
     }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigDecimalTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigDecimalTest.java
index 5b2a733d..b627851f 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigDecimalTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigDecimalTest.java
@@ -24,6 +24,8 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 public class BigDecimalTest extends SerializeTestBase {
     @Test
@@ -44,4 +46,12 @@ public class BigDecimalTest extends SerializeTestBase {
         Assertions.assertEquals(obj, hessian4ToHessian3(obj));
         Assertions.assertEquals(obj, hessian3ToHessian4(obj));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        BigDecimal originalBigDecimal = new BigDecimal("123.456");
+        testCollection(list, originalBigDecimal);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigIntegerTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigIntegerTest.java
index 20274efa..8fc847d1 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigIntegerTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BigIntegerTest.java
@@ -24,6 +24,8 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
 
 public class BigIntegerTest extends SerializeTestBase {
     @Test
@@ -44,4 +46,12 @@ public class BigIntegerTest extends SerializeTestBase {
         Assertions.assertEquals(obj, hessian4ToHessian3(obj));
         Assertions.assertEquals(obj, hessian3ToHessian4(obj));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        BigInteger originalBigInteger = new BigInteger("1234567890");
+        testCollection(list, originalBigInteger);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BitSetSerializerTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BitSetSerializerTest.java
index 84e2b640..0f285959 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BitSetSerializerTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/BitSetSerializerTest.java
@@ -21,7 +21,9 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.BitSet;
+import java.util.List;
 
 public class BitSetSerializerTest extends SerializeTestBase {
 
@@ -38,6 +40,17 @@ public class BitSetSerializerTest extends SerializeTestBase {
         assertBitSet(BitSet.valueOf(words));
     }
 
+    @Test
+    public void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        BitSet bitSet = new BitSet();
+        bitSet.set(1);
+        bitSet.set(3);
+        bitSet.set(5);
+        testCollection(list, bitSet);
+    }
+
     private void assertBitSet(BitSet bitSet) throws IOException {
         Assertions.assertEquals(bitSet, baseHessian2Serialize(bitSet));
         Assertions.assertEquals(bitSet, hessian4ToHessian3(bitSet));
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ClockTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ClockTest.java
index d60f9ab9..ccf0e94e 100644
--- a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ClockTest.java
+++ b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ClockTest.java
@@ -26,6 +26,8 @@ import org.junit.jupiter.api.condition.JRE;
 import java.io.IOException;
 import java.time.Clock;
 import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.List;
 
 public class ClockTest extends SerializeTestBase {
     @Test
@@ -46,4 +48,12 @@ public class ClockTest extends SerializeTestBase {
         Assertions.assertEquals(obj.getZone(), 
hessian4ToHessian3(obj).getZone());
         Assertions.assertEquals(obj.getZone(), 
hessian3ToHessian4(obj).getZone());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        Clock originalClock = Clock.system(ZoneId.of("Asia/Shanghai"));
+        testCollection(list, originalClock);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
index 7c4a1433..1330466e 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionSerializerTest.java
@@ -18,6 +18,7 @@ package com.alibaba.com.caucho.hessian.io;
 
 import com.alibaba.com.caucho.hessian.io.base.SerializeTestBase;
 import com.alibaba.com.caucho.hessian.io.beans.SubUser;
+import java.util.ArrayList;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -105,4 +106,24 @@ public class CollectionSerializerTest extends 
SerializeTestBase {
         List deserialize = baseHessian2Serialize(vector);
         Assertions.assertTrue(deserialize.equals(vector));
     }
+
+    @Test
+    public void testCollection() throws Exception {
+        List<Object> list = new ArrayList<>();
+
+        Set set = new HashSet();
+        set.add(1111);
+        set.add(2222);
+        testCollection(list, set);
+
+        Vector vector = new Vector();
+        vector.add(1111);
+        vector.add(2222);
+        testCollection(list, vector);
+
+        List<String> stringList = new ArrayList<>();
+        stringList.add("1111");
+        stringList.add("2222");
+        testCollection(list, stringList);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionsTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionsTest.java
index 6b80d59b..b273af7e 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionsTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CollectionsTest.java
@@ -146,4 +146,31 @@ public class CollectionsTest extends SerializeTestBase {
         Assertions.assertEquals(copiesList.subList(1, 2), 
hessian3ToHessian3(copiesList.subList(1, 2)));
         Assertions.assertEquals(copiesList.subList(1, 2), 
hessian4ToHessian3(copiesList.subList(1, 2)));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        List<Integer> arrayList = new ArrayList<>();
+        arrayList.add(1);
+        arrayList.add(2);
+        arrayList.add(3);
+        List<Integer> unmodifiableList = 
Collections.unmodifiableList(arrayList);
+        testCollection(list, unmodifiableList);
+
+        List<Integer> linkedList = new LinkedList<>();
+        linkedList.add(1);
+        linkedList.add(2);
+        linkedList.add(3);
+        unmodifiableList = Collections.unmodifiableList(linkedList);
+        testCollection(list, unmodifiableList);
+
+        List<Integer> synchronizedList = 
Collections.synchronizedList(arrayList);
+        testCollection(list, synchronizedList);
+        synchronizedList = Collections.synchronizedList(linkedList);
+        testCollection(list, synchronizedList);
+
+        List<Integer> copiesList = Collections.nCopies(3, 1);
+        testCollection(list, copiesList);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentLinkedDequeTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentLinkedDequeTest.java
index 909f0d23..0f2389be 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentLinkedDequeTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentLinkedDequeTest.java
@@ -24,6 +24,7 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.ConcurrentLinkedDeque;
 
 public class ConcurrentLinkedDequeTest extends SerializeTestBase {
@@ -58,4 +59,22 @@ public class ConcurrentLinkedDequeTest extends 
SerializeTestBase {
         Assertions.assertEquals(new ArrayList<>(originalDeque), new 
ArrayList<>(hessian3ToHessian3(originalDeque)));
         Assertions.assertEquals(new ArrayList<>(originalDeque), new 
ArrayList<>(hessian3ToHessian4(originalDeque)));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        ConcurrentLinkedDeque<String> originalDeque = new 
ConcurrentLinkedDeque<>();
+        originalDeque.add("one");
+        originalDeque.add("two");
+        originalDeque.add("three");
+
+        List<ConcurrentLinkedDeque<String>> list = new ArrayList<>();
+        list.add(originalDeque);
+        list.add(originalDeque);
+
+        List<ConcurrentLinkedDeque<String>> result = 
baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(new ArrayList<>(originalDeque), new 
ArrayList<>(result.get(0)));
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentSkipListMapTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentSkipListMapTest.java
index a133ab2c..0b6cb030 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentSkipListMapTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ConcurrentSkipListMapTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentSkipListMap;
 
@@ -74,4 +76,15 @@ public class ConcurrentSkipListMapTest extends 
SerializeTestBase {
             Assertions.assertEquals(v, resultEntry.getValue());
         });
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        ConcurrentSkipListMap<String, Integer> originalMap = new 
ConcurrentSkipListMap<>();
+        originalMap.put("one", 1);
+        originalMap.put("two", 2);
+        originalMap.put("three", 3);
+        list.add(originalMap);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CurrencyTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CurrencyTest.java
index 43e2f2c5..b872dc7b 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CurrencyTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/CurrencyTest.java
@@ -23,7 +23,9 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Currency;
+import java.util.List;
 
 public class CurrencyTest extends SerializeTestBase {
 
@@ -48,4 +50,12 @@ public class CurrencyTest extends SerializeTestBase {
         Assertions.assertEquals(currency, hessian3ToHessian4(currency));
         Assertions.assertEquals(currency, hessian4ToHessian3(currency));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        Currency currency = Currency.getInstance("USD");
+        testCollection(list, currency);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/DateFormatSymbolsTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/DateFormatSymbolsTest.java
index 0d471b64..60aee540 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/DateFormatSymbolsTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/DateFormatSymbolsTest.java
@@ -24,6 +24,8 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.text.DateFormatSymbols;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 public class DateFormatSymbolsTest extends SerializeTestBase {
@@ -73,4 +75,24 @@ public class DateFormatSymbolsTest extends SerializeTestBase 
{
         Assertions.assertArrayEquals(obj.getWeekdays(), 
hessian3ToHessian4(obj).getWeekdays());
         Assertions.assertArrayEquals(obj.getShortWeekdays(), 
hessian3ToHessian4(obj).getShortWeekdays());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        DateFormatSymbols originalDateFormatSymbols = new 
DateFormatSymbols(Locale.US);
+
+        List<DateFormatSymbols> list = new ArrayList<>();
+        list.add(originalDateFormatSymbols);
+        list.add(originalDateFormatSymbols);
+
+        List<DateFormatSymbols> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        
Assertions.assertArrayEquals(originalDateFormatSymbols.getAmPmStrings(), 
result.get(0).getAmPmStrings());
+        Assertions.assertArrayEquals(originalDateFormatSymbols.getEras(), 
result.get(0).getEras());
+        Assertions.assertArrayEquals(originalDateFormatSymbols.getMonths(), 
result.get(0).getMonths());
+        
Assertions.assertArrayEquals(originalDateFormatSymbols.getShortMonths(), 
result.get(0).getShortMonths());
+        Assertions.assertArrayEquals(originalDateFormatSymbols.getWeekdays(), 
result.get(0).getWeekdays());
+        
Assertions.assertArrayEquals(originalDateFormatSymbols.getShortWeekdays(), 
result.get(0).getShortWeekdays());
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/EnumSetTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/EnumSetTest.java
index f40113dc..190bbbc0 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/EnumSetTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/EnumSetTest.java
@@ -23,7 +23,9 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.EnumSet;
+import java.util.List;
 
 enum TestEnumSet {
     ONE, TWO, THREE
@@ -80,4 +82,12 @@ public class EnumSetTest extends SerializeTestBase {
         Assertions.assertEquals(largeEnumSet, 
hessian3ToHessian4(largeEnumSet));
         Assertions.assertEquals(largeEnumSet, 
hessian4ToHessian3(largeEnumSet));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        EnumSet<TestEnumSet> originalEnumSet = EnumSet.of(TestEnumSet.ONE, 
TestEnumSet.TWO);
+        testCollection(list, originalEnumSet);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/FileTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/FileTest.java
index d2c4ce85..c67735a1 100644
--- a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/FileTest.java
+++ b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/FileTest.java
@@ -24,6 +24,8 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class FileTest extends SerializeTestBase {
     @Test
@@ -44,4 +46,12 @@ public class FileTest extends SerializeTestBase {
         Assertions.assertEquals(obj, hessian4ToHessian3(obj));
         Assertions.assertEquals(obj, hessian3ToHessian4(obj));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        File originalFile = new File("test.txt");
+        testCollection(list, originalFile);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2UUIDTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2UUIDTest.java
index b3c7a0de..667d93d2 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2UUIDTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/Hessian2UUIDTest.java
@@ -97,4 +97,19 @@ public class Hessian2UUIDTest extends SerializeTestBase {
                assertEquals(actual, hessian3ToHessian4(actual));
        }
 
+       @Test
+       public void testCollection() throws IOException {
+               UUID uuid = UUID.randomUUID();
+
+               List<UUID> list = new ArrayList<>();
+               list.add(uuid);
+               list.add(uuid);
+
+               List<UUID> result = baseHessian2Serialize(list);
+
+               assertEquals(list.size(), result.size());
+               assertEquals(uuid, result.get(0));
+               assertEquals(uuid, result.get(1));
+               assertEquals(result.get(0), result.get(1));
+       }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
index acdd2f55..651ab643 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/HessianJavaSerializeTest.java
@@ -164,4 +164,50 @@ public class HessianJavaSerializeTest extends 
SerializeTestBase {
         Assertions.assertEquals(dData, hessian3ToHessian4(fData));
     }
 
+    @Test
+    public void testCollection() throws Exception {
+        BaseUser baseUser = new BaseUser();
+        baseUser.setUserId(1);
+        baseUser.setUserName("tom");
+        List<BaseUser> baseUserList = new ArrayList<>();
+        baseUserList.add(baseUser);
+        baseUserList.add(baseUser);
+        List<BaseUser> result = baseHessian2Serialize(baseUserList);
+        Assertions.assertEquals(baseUserList.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals("tom", result.get(0).getUserName());
+
+        SubUser subUser = new SubUser();
+        subUser.setUserId(1);
+        subUser.setUserName("tom");
+        List<SubUser> subUserList = new ArrayList<>();
+        subUserList.add(subUser);
+        subUserList.add(subUser);
+        List<SubUser> subUserResult = baseHessian2Serialize(subUserList);
+        Assertions.assertEquals(subUserList.size(), subUserResult.size());
+        Assertions.assertSame(subUserResult.get(0), subUserResult.get(1));
+        Assertions.assertEquals("tom", subUserResult.get(0).getUserName());
+
+        List<Integer> list = new ArrayList<>();
+        list.add(null);
+        list.add(null);
+        list.add(3);
+        subUser.setAgeList(list);
+        subUserResult = baseHessian2Serialize(subUserList);
+        Assertions.assertEquals(subUserList.size(), subUserResult.size());
+        Assertions.assertSame(subUserResult.get(0), subUserResult.get(1));
+        Assertions.assertEquals("tom", subUserResult.get(0).getUserName());
+
+        GrandsonUser grandsonUser = new GrandsonUser();
+        grandsonUser.setUserId(1);
+        grandsonUser.setUserName("tom");
+        List<GrandsonUser> grandsonUserList = new ArrayList<>();
+        grandsonUserList.add(grandsonUser);
+        grandsonUserList.add(grandsonUser);
+        List<GrandsonUser> grandsonUserResult = 
baseHessian2Serialize(grandsonUserList);
+        Assertions.assertEquals(grandsonUserList.size(), 
grandsonUserResult.size());
+        Assertions.assertSame(grandsonUserResult.get(0), 
grandsonUserResult.get(1));
+        Assertions.assertEquals("tom", 
grandsonUserResult.get(0).getUserName());
+    }
+
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LinkedTransferQueueTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LinkedTransferQueueTest.java
index 1d3f5ceb..7173b52c 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LinkedTransferQueueTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LinkedTransferQueueTest.java
@@ -24,6 +24,7 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.LinkedTransferQueue;
 
 public class LinkedTransferQueueTest extends SerializeTestBase {
@@ -55,4 +56,22 @@ public class LinkedTransferQueueTest extends 
SerializeTestBase {
         Assertions.assertEquals(new ArrayList<>(obj), new 
ArrayList<>(hessian4ToHessian3(obj)));
         Assertions.assertEquals(new ArrayList<>(obj), new 
ArrayList<>(hessian3ToHessian4(obj)));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        LinkedTransferQueue<Integer> originalLinkedTransferQueue = new 
LinkedTransferQueue<>();
+        originalLinkedTransferQueue.offer(1);
+        originalLinkedTransferQueue.offer(2);
+        originalLinkedTransferQueue.offer(3);
+
+        List<LinkedTransferQueue<Integer>> list = new ArrayList<>();
+        list.add(originalLinkedTransferQueue);
+        list.add(originalLinkedTransferQueue);
+
+        List<LinkedTransferQueue<Integer>> result = 
baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(new ArrayList<>(originalLinkedTransferQueue), 
new ArrayList<>(result.get(0)));
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java
index f4a57075..5f616ce3 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleSerializerTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 public class LocaleSerializerTest extends SerializeTestBase {
@@ -49,6 +51,14 @@ public class LocaleSerializerTest extends SerializeTestBase {
         assertLocaleCompact(new Locale("zh-hant", "CN", "GBK"));
     }
 
+    @Test
+    public void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        Locale locale = new Locale("zh", "CN", "Hans");
+        testCollection(list, locale);
+    }
+
     private void assertLocale(Locale locale) throws IOException {
         Assertions.assertEquals(locale, baseHessian2Serialize(locale));
     }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleTest.java
index 054b68cd..9e97d05c 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/LocaleTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 public class LocaleTest extends SerializeTestBase {
@@ -44,4 +46,12 @@ public class LocaleTest extends SerializeTestBase {
         Assertions.assertEquals(obj, hessian4ToHessian3(obj));
         Assertions.assertEquals(obj, hessian3ToHessian4(obj));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        Locale locale = Locale.US;
+        testCollection(list, locale);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/NumberFormatTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/NumberFormatTest.java
index d5cdd71f..4b938a14 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/NumberFormatTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/NumberFormatTest.java
@@ -24,6 +24,8 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 public class NumberFormatTest extends SerializeTestBase {
@@ -78,4 +80,23 @@ public class NumberFormatTest extends SerializeTestBase {
         // TODO Support currency
 //        Assertions.assertEquals(obj.getCurrency(), 
hessian3ToHessian4(obj).getCurrency());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        NumberFormat originalNumberFormat = 
NumberFormat.getInstance(Locale.US);
+
+        List<NumberFormat> list = new ArrayList<>();
+        list.add(originalNumberFormat);
+        list.add(originalNumberFormat);
+
+        List<NumberFormat> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        
Assertions.assertEquals(originalNumberFormat.getMaximumFractionDigits(), 
result.get(0).getMaximumFractionDigits());
+        
Assertions.assertEquals(originalNumberFormat.getMaximumIntegerDigits(), 
result.get(0).getMaximumIntegerDigits());
+        
Assertions.assertEquals(originalNumberFormat.getMinimumFractionDigits(), 
result.get(0).getMinimumFractionDigits());
+        
Assertions.assertEquals(originalNumberFormat.getMinimumIntegerDigits(), 
result.get(0).getMinimumIntegerDigits());
+        Assertions.assertEquals(originalNumberFormat.getRoundingMode(), 
result.get(0).getRoundingMode());
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PriorityBlockingQueueTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PriorityBlockingQueueTest.java
index 8e6a6689..ce2b307f 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PriorityBlockingQueueTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PriorityBlockingQueueTest.java
@@ -24,6 +24,7 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.PriorityBlockingQueue;
 
 public class PriorityBlockingQueueTest extends SerializeTestBase {
@@ -58,4 +59,23 @@ public class PriorityBlockingQueueTest extends 
SerializeTestBase {
         Assertions.assertEquals(new 
ArrayList<>(originalPriorityBlockingQueue), new 
ArrayList<>(hessian3ToHessian3(originalPriorityBlockingQueue)));
         Assertions.assertEquals(new 
ArrayList<>(originalPriorityBlockingQueue), new 
ArrayList<>(hessian3ToHessian4(originalPriorityBlockingQueue)));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        PriorityBlockingQueue<Integer> originalPriorityBlockingQueue = new 
PriorityBlockingQueue<>(16, Integer::compareTo);
+        originalPriorityBlockingQueue.add(1);
+        originalPriorityBlockingQueue.add(2);
+        originalPriorityBlockingQueue.add(4);
+        originalPriorityBlockingQueue.add(-1);
+
+        List<PriorityBlockingQueue<Integer>> list = new ArrayList<>();
+        list.add(originalPriorityBlockingQueue);
+        list.add(originalPriorityBlockingQueue);
+
+        List<PriorityBlockingQueue<Integer>> result = 
baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(new 
ArrayList<>(originalPriorityBlockingQueue), new ArrayList<>(result.get(0)));
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PropertiesTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PropertiesTest.java
index db357cf1..19533e8e 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PropertiesTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/PropertiesTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Properties;
 
 public class PropertiesTest extends SerializeTestBase {
@@ -48,4 +50,14 @@ public class PropertiesTest extends SerializeTestBase {
         Assertions.assertEquals(obj, hessian4ToHessian3(obj));
         Assertions.assertEquals(obj, hessian3ToHessian4(obj));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        Properties originalProperties = new Properties();
+        originalProperties.setProperty("key1", "value1");
+        originalProperties.setProperty("key2", "value2");
+        testCollection(list, originalProperties);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SimpleTimeZoneTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SimpleTimeZoneTest.java
index 1b6b25ae..501d91fd 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SimpleTimeZoneTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SimpleTimeZoneTest.java
@@ -21,6 +21,8 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.SimpleTimeZone;
 
 public class SimpleTimeZoneTest extends SerializeTestBase {
@@ -32,4 +34,12 @@ public class SimpleTimeZoneTest extends SerializeTestBase {
 
         Assertions.assertEquals(originalTimeZone, result);
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        SimpleTimeZone originalTimeZone = new SimpleTimeZone(3600000, "ID");
+        testCollection(list, originalTimeZone);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBufferTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBufferTest.java
index 43f0cb82..d314e5fa 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBufferTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBufferTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class StringBufferTest extends SerializeTestBase {
     @Test
@@ -43,4 +45,19 @@ public class StringBufferTest extends SerializeTestBase {
         Assertions.assertEquals(obj.toString(), 
hessian4ToHessian3(obj).toString());
         Assertions.assertEquals(obj.toString(), 
hessian3ToHessian4(obj).toString());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        StringBuffer originalStringBuffer = new StringBuffer("Hello, World!");
+
+        List<StringBuffer> list = new ArrayList<>();
+        list.add(originalStringBuffer);
+        list.add(originalStringBuffer);
+
+        List<StringBuffer> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(originalStringBuffer.toString(), 
result.get(0).toString());
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBuilderTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBuilderTest.java
index 1bdfaf4b..d2ce611e 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBuilderTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/StringBuilderTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class StringBuilderTest extends SerializeTestBase {
     @Test
@@ -43,4 +45,19 @@ public class StringBuilderTest extends SerializeTestBase {
         Assertions.assertEquals(obj.toString(), 
hessian4ToHessian3(obj).toString());
         Assertions.assertEquals(obj.toString(), 
hessian3ToHessian4(obj).toString());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        StringBuilder originalStringBuilder = new StringBuilder("test");
+
+        List<StringBuilder> list = new ArrayList<>();
+        list.add(originalStringBuilder);
+        list.add(originalStringBuilder);
+
+        List<StringBuilder> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(originalStringBuilder.toString(), 
result.get(0).toString());
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SynchronousQueueTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SynchronousQueueTest.java
index 9add2939..5832f2c6 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SynchronousQueueTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/SynchronousQueueTest.java
@@ -24,6 +24,7 @@ import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.SynchronousQueue;
 
 public class SynchronousQueueTest extends SerializeTestBase {
@@ -55,4 +56,22 @@ public class SynchronousQueueTest extends SerializeTestBase {
         Assertions.assertEquals(new ArrayList<>(obj), new 
ArrayList<>(hessian4ToHessian3(obj)));
         Assertions.assertEquals(new ArrayList<>(obj), new 
ArrayList<>(hessian3ToHessian4(obj)));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        SynchronousQueue<Integer> originalSynchronousQueue = new 
SynchronousQueue<>();
+        originalSynchronousQueue.offer(1);
+        originalSynchronousQueue.offer(2);
+        originalSynchronousQueue.offer(3);
+
+        List<SynchronousQueue<Integer>> list = new ArrayList<>();
+        list.add(originalSynchronousQueue);
+        list.add(originalSynchronousQueue);
+
+        List<SynchronousQueue<Integer>> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(new ArrayList<>(originalSynchronousQueue), new 
ArrayList<>(result.get(0)));
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ThrowableTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ThrowableTest.java
index daf96fb1..d7a143a2 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ThrowableTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/ThrowableTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class ThrowableTest extends SerializeTestBase {
     @Test
@@ -55,4 +57,21 @@ public class ThrowableTest extends SerializeTestBase {
         Assertions.assertEquals(throwable.getMessage(), 
hessian3ToHessian4(throwable).getMessage());
         Assertions.assertEquals(throwable.getLocalizedMessage(), 
hessian3ToHessian4(throwable).getLocalizedMessage());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        Throwable throwable = new Throwable("test");
+
+        List<Throwable> list = new ArrayList<>();
+        list.add(throwable);
+        list.add(throwable);
+
+        List<Throwable> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertArrayEquals(throwable.getStackTrace(), 
result.get(0).getStackTrace());
+        Assertions.assertEquals(throwable.getMessage(), 
result.get(0).getMessage());
+        Assertions.assertEquals(throwable.getLocalizedMessage(), 
result.get(0).getLocalizedMessage());
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeMapTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeMapTest.java
index 45e67063..2e44578d 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeMapTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeMapTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -77,4 +79,15 @@ public class TreeMapTest extends SerializeTestBase {
             Assertions.assertEquals(v, resultEntry.getValue());
         });
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        TreeMap<String, Integer> originalTreeMap = new TreeMap<>();
+        originalTreeMap.put("one", 1);
+        originalTreeMap.put("two", 2);
+        originalTreeMap.put("three", 3);
+        testCollection(list, originalTreeMap);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeSetTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeSetTest.java
index 1c261148..8285cc6e 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeSetTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/TreeSetTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.TreeSet;
 
 public class TreeSetTest extends SerializeTestBase {
@@ -58,4 +60,16 @@ public class TreeSetTest extends SerializeTestBase {
         Assertions.assertEquals(treeSet, hessian3ToHessian3(treeSet));
         Assertions.assertEquals(treeSet, hessian3ToHessian4(treeSet));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        TreeSet<Integer> treeSet = new TreeSet<>(Integer::compareTo);
+        treeSet.add(1);
+        treeSet.add(2);
+        treeSet.add(4);
+        treeSet.add(-1);
+        testCollection(list, treeSet);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/URITest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/URITest.java
index 8df93287..eff66626 100644
--- a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/URITest.java
+++ b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/URITest.java
@@ -25,6 +25,8 @@ import org.junit.jupiter.api.condition.JRE;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
 
 public class URITest extends SerializeTestBase {
     @Test
@@ -56,4 +58,12 @@ public class URITest extends SerializeTestBase {
 
         Assertions.assertEquals(originalURI.toString(), result.toString());
     }
+
+    @Test
+    void testCollection() throws IOException, URISyntaxException {
+        List<Object> list = new ArrayList<>();
+
+        URI originalURI = new 
URI("http://username:[email protected]:8080/path/to/resource?param1=value1&param2=value2#fragment";);
+        testCollection(list, originalURI);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/VectorTest.java 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/VectorTest.java
index 49e3a204..095f37cd 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/VectorTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/VectorTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.condition.EnabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Vector;
 
 public class VectorTest extends SerializeTestBase {
@@ -57,4 +59,16 @@ public class VectorTest extends SerializeTestBase {
         Assertions.assertEquals(treeSet, hessian3ToHessian3(treeSet));
         Assertions.assertEquals(treeSet, hessian3ToHessian4(treeSet));
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        Vector<Integer> vector = new Vector<>();
+        vector.add(1);
+        vector.add(2);
+        vector.add(4);
+        vector.add(-1);
+        testCollection(list, vector);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/WeekFieldsTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/WeekFieldsTest.java
index 205525fc..778ed2ab 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/WeekFieldsTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/WeekFieldsTest.java
@@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.time.temporal.WeekFields;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 public class WeekFieldsTest extends SerializeTestBase {
@@ -33,4 +35,12 @@ public class WeekFieldsTest extends SerializeTestBase {
 
         Assertions.assertEquals(originalWeekFields, result);
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        WeekFields originalWeekFields = WeekFields.of(Locale.FRANCE);
+        testCollection(list, originalWeekFields);
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderTest.java
index 44278f6d..4aaf8287 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/atomic/LongAdderTest.java
@@ -21,6 +21,8 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.atomic.LongAdder;
 
 public class LongAdderTest extends SerializeTestBase {
@@ -31,4 +33,20 @@ public class LongAdderTest extends SerializeTestBase {
 
         Assertions.assertEquals(longAdder.longValue(), 
baseHessian2Serialize(longAdder).longValue());
     }
+
+    @Test
+    void testCollection() throws IOException {
+        LongAdder longAdder = new LongAdder();
+        longAdder.add(1);
+
+        List<LongAdder> list = new ArrayList<>();
+        list.add(longAdder);
+        list.add(longAdder);
+
+        List<LongAdder> result = baseHessian2Serialize(list);
+
+        Assertions.assertEquals(list.size(), result.size());
+        Assertions.assertSame(result.get(0), result.get(1));
+        Assertions.assertEquals(longAdder.longValue(), 
result.get(0).longValue());
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java
index e661f98b..582fbcb4 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/base/SerializeTestBase.java
@@ -22,6 +22,8 @@ import com.alibaba.com.caucho.hessian.io.Hessian2Output;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.List;
+import org.junit.jupiter.api.Assertions;
 
 /**
  * hessian base serialize utils
@@ -85,5 +87,21 @@ public class SerializeTestBase {
         return (T) input.readObject();
     }
 
-
+    protected <T> void testCollection(List<Object> list, T t) throws 
IOException {
+        try {
+            list.clear();
+            list.add(t);
+            list.add(t);
+            List<Object> result = baseHessian2Serialize(list);
+            Assertions.assertEquals(list.size(), result.size());
+            Assertions.assertSame(result.get(0), result.get(1));
+            if (t instanceof Object[]) {
+                Assertions.assertArrayEquals((Object[]) t, (Object[]) 
result.get(0));
+            } else {
+                Assertions.assertEquals(t, result.get(0));
+            }
+        } finally {
+            list.clear();
+        }
+    }
 }
diff --git 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/issue73/SerializeTest.java
 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/issue73/SerializeTest.java
index 992149ed..dea14967 100644
--- 
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/issue73/SerializeTest.java
+++ 
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/issue73/SerializeTest.java
@@ -17,6 +17,7 @@
 package com.alibaba.com.caucho.hessian.io.issue73;
 
 import com.alibaba.com.caucho.hessian.io.base.SerializeTestBase;
+import java.util.ArrayList;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -57,4 +58,32 @@ public class SerializeTest extends SerializeTestBase {
         Assertions.assertEquals(result, hessian3ToHessian4(result));
 
     }
+
+    @Test
+    void testCollection() throws IOException {
+        List<Object> list = new ArrayList<>();
+
+        ComplainDto complainDto = new ComplainDto();
+        complainDto.setAppealReason("1");
+        complainDto.setAppealState(2);
+        complainDto.setAppealType((byte) 3);
+        complainDto.setClass1Name("4");
+        complainDto.setClass2Name("5");
+        complainDto.setClass3Name("6");
+        complainDto.setComplainDate("7");
+        complainDto.setComplainOi(Arrays.asList("8"));
+        complainDto.setComplainOrderId("9");
+        complainDto.setComplainResult("10");
+        complainDto.setComplainStatus((byte) 11);
+        complainDto.setComplainStatusName("12");
+        complainDto.setCustomerName("13");
+        complainDto.setRemark("14");
+        complainDto.setShowType(Boolean.TRUE);
+        complainDto.setSurplusDate("15");
+        complainDto.setTotal(BigDecimal.valueOf(16L));
+        complainDto.setTotalType((byte) 17);
+        complainDto.setUserAccessory(Arrays.asList("18"));
+        testCollection(list, complainDto);
+    }
+
 }

Reply via email to