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

liujun pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.3 by this push:
     new 225ca9d232 [3.3] Update hessian-lite to 4.0.0 & Set hessian 
serialization back (#13974)
225ca9d232 is described below

commit 225ca9d232ea647fca20fa628d2e7b8517d37ad2
Author: Albumen Kevin <[email protected]>
AuthorDate: Wed May 22 10:13:57 2024 +0800

    [3.3] Update hessian-lite to 4.0.0 & Set hessian serialization back (#13974)
---
 .github/workflows/build-and-test-pr.yml            |   1 -
 .../dubbo/common/CommonScopeModelInitializer.java  |   2 +
 .../dubbo/common/serialization/ClassHolder.java    |  46 ++++++++++
 .../common/utils/DefaultSerializeClassChecker.java |  21 ++++-
 .../utils/SerializeSecurityConfigurator.java       |  18 +++-
 .../dubbo/config/context/ConfigManagerTest.java    |   2 +-
 .../apache/dubbo/config/ProtocolConfigTest.java    |   4 +-
 .../dubbo-demo-native-consumer/pom.xml             |  10 +--
 .../dubbo/demo/graalvm/consumer/Application.java   |   4 +-
 .../dubbo-demo-native-provider/pom.xml             |   9 +-
 .../dubbo/demo/graalvm/provider/Application.java   |   4 +-
 dubbo-dependencies-bom/pom.xml                     |   4 +-
 dubbo-distribution/dubbo-all-shaded/pom.xml        |   2 +-
 dubbo-distribution/dubbo-all/pom.xml               |   2 +-
 .../apache/dubbo/aot/generate/AotProcessor.java    |  55 ++++++++++++
 dubbo-rpc/dubbo-rpc-api/pom.xml                    |   2 +-
 .../support/PreferSerializationProviderImpl.java   |   2 +-
 .../dubbo-serialization-hessian2/pom.xml           |   8 +-
 .../hessian2/Hessian2SerializerFactory.java        |  10 ++-
 .../HessianReflectionTypeDescriberRegistrar.java   | 100 +++++++++++++++++++++
 .../aot/HessianResourceDescriberRegistrar.java     |  36 ++++++++
 ....dubbo.aot.api.ReflectionTypeDescriberRegistrar |   1 +
 ...apache.dubbo.aot.api.ResourceDescriberRegistrar |   1 +
 ...org.apache.dubbo.common.serialize.Serialization |   2 +-
 .../hessian2/Hessian2SerializationTest.java        |  15 +++-
 .../dubbo-serialization-jdk/pom.xml                |   2 +-
 26 files changed, 328 insertions(+), 35 deletions(-)

diff --git a/.github/workflows/build-and-test-pr.yml 
b/.github/workflows/build-and-test-pr.yml
index 0c85032f64..025e3a8c32 100644
--- a/.github/workflows/build-and-test-pr.yml
+++ b/.github/workflows/build-and-test-pr.yml
@@ -199,7 +199,6 @@ jobs:
     env:
       DISABLE_FILE_SYSTEM_TEST: true
       CURRENT_ROLE: ${{ matrix.case-role }}
-      DUBBO_DEFAULT_SERIALIZATION: fastjson2
     steps:
       - uses: actions/checkout@v3
         with:
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
index 023830cd26..65aa66702f 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/CommonScopeModelInitializer.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 import org.apache.dubbo.common.config.ConfigurationCache;
 import org.apache.dubbo.common.convert.ConverterUtil;
 import org.apache.dubbo.common.lang.ShutdownHookCallbacks;
+import org.apache.dubbo.common.serialization.ClassHolder;
 import org.apache.dubbo.common.ssl.CertManager;
 import org.apache.dubbo.common.status.reporter.FrameworkStatusReportService;
 import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
@@ -40,6 +41,7 @@ public class CommonScopeModelInitializer implements 
ScopeModelInitializer {
         beanFactory.registerBean(SerializeSecurityManager.class);
         beanFactory.registerBean(DefaultSerializeClassChecker.class);
         beanFactory.registerBean(CertManager.class);
+        beanFactory.registerBean(ClassHolder.class);
     }
 
     @Override
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/serialization/ClassHolder.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/serialization/ClassHolder.java
new file mode 100644
index 0000000000..4dd61511e4
--- /dev/null
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/serialization/ClassHolder.java
@@ -0,0 +1,46 @@
+/*
+ * 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 org.apache.dubbo.common.serialization;
+
+import org.apache.dubbo.common.utils.ConcurrentHashSet;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ClassHolder {
+    private final Map<String, Set<Class<?>>> classCache = new 
ConcurrentHashMap<>();
+
+    public void storeClass(Class<?> clazz) {
+        classCache
+                .computeIfAbsent(clazz.getName(), k -> new 
ConcurrentHashSet<>())
+                .add(clazz);
+    }
+
+    public Class<?> loadClass(String className, ClassLoader classLoader) {
+        Set<Class<?>> classList = classCache.get(className);
+        if (classList == null) {
+            return null;
+        }
+        for (Class<?> clazz : classList) {
+            if (classLoader.equals(clazz.getClassLoader())) {
+                return clazz;
+            }
+        }
+        return null;
+    }
+}
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
index 7155a1eaa9..029f654abd 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
@@ -16,8 +16,10 @@
  */
 package org.apache.dubbo.common.utils;
 
+import org.apache.dubbo.common.aot.NativeDetector;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.serialization.ClassHolder;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 
 import java.io.Serializable;
@@ -40,6 +42,7 @@ public class DefaultSerializeClassChecker implements 
AllowClassNotifyListener {
     private volatile boolean checkSerializable = true;
 
     private final SerializeSecurityManager serializeSecurityManager;
+    private final ClassHolder classHolder;
     private volatile long[] allowPrefixes = new long[0];
 
     private volatile long[] disAllowPrefixes = new long[0];
@@ -47,6 +50,8 @@ public class DefaultSerializeClassChecker implements 
AllowClassNotifyListener {
     public DefaultSerializeClassChecker(FrameworkModel frameworkModel) {
         serializeSecurityManager = 
frameworkModel.getBeanFactory().getOrRegisterBean(SerializeSecurityManager.class);
         serializeSecurityManager.registerListener(this);
+        classHolder =
+                NativeDetector.inNativeImage() ? 
frameworkModel.getBeanFactory().getBean(ClassHolder.class) : null;
     }
 
     @Override
@@ -120,7 +125,7 @@ public class DefaultSerializeClassChecker implements 
AllowClassNotifyListener {
 
     private Class<?> loadClass0(ClassLoader classLoader, String className) 
throws ClassNotFoundException {
         if (checkStatus == SerializeCheckStatus.DISABLE) {
-            return ClassUtils.forName(className, classLoader);
+            return classForName(classLoader, className);
         }
 
         long hash = MAGIC_HASH_CODE;
@@ -133,7 +138,7 @@ public class DefaultSerializeClassChecker implements 
AllowClassNotifyListener {
             hash *= MAGIC_PRIME;
 
             if (Arrays.binarySearch(allowPrefixes, hash) >= 0) {
-                return ClassUtils.forName(className, classLoader);
+                return classForName(classLoader, className);
             }
         }
 
@@ -190,7 +195,7 @@ public class DefaultSerializeClassChecker implements 
AllowClassNotifyListener {
             }
         }
 
-        Class<?> clazz = ClassUtils.forName(className, classLoader);
+        Class<?> clazz = classForName(classLoader, className);
         if (serializeSecurityManager.getWarnedClasses().add(className)) {
             logger.warn(
                     PROTOCOL_UNTRUSTED_SERIALIZE_CLASS,
@@ -204,6 +209,16 @@ public class DefaultSerializeClassChecker implements 
AllowClassNotifyListener {
         return clazz;
     }
 
+    private Class<?> classForName(ClassLoader classLoader, String className) 
throws ClassNotFoundException {
+        if (classHolder != null) {
+            Class<?> aClass = classHolder.loadClass(className, classLoader);
+            if (aClass != null) {
+                return aClass;
+            }
+        }
+        return ClassUtils.forName(className, classLoader);
+    }
+
     public static DefaultSerializeClassChecker getInstance() {
         return 
FrameworkModel.defaultModel().getBeanFactory().getBean(DefaultSerializeClassChecker.class);
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/SerializeSecurityConfigurator.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/SerializeSecurityConfigurator.java
index 468e412b2c..ea80a698a6 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/SerializeSecurityConfigurator.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/SerializeSecurityConfigurator.java
@@ -16,9 +16,11 @@
  */
 package org.apache.dubbo.common.utils;
 
+import org.apache.dubbo.common.aot.NativeDetector;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.serialization.ClassHolder;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ModuleModel;
@@ -52,6 +54,8 @@ public class SerializeSecurityConfigurator implements 
ScopeClassLoaderListener<M
 
     private final ModuleModel moduleModel;
 
+    private final ClassHolder classHolder;
+
     private volatile boolean autoTrustSerializeClass = true;
 
     private volatile int trustSerializeClassLevel = Integer.MAX_VALUE;
@@ -62,6 +66,8 @@ public class SerializeSecurityConfigurator implements 
ScopeClassLoaderListener<M
 
         FrameworkModel frameworkModel = 
moduleModel.getApplicationModel().getFrameworkModel();
         serializeSecurityManager = 
frameworkModel.getBeanFactory().getBean(SerializeSecurityManager.class);
+        classHolder =
+                NativeDetector.inNativeImage() ? 
frameworkModel.getBeanFactory().getBean(ClassHolder.class) : null;
 
         refreshStatus();
         refreshCheck();
@@ -210,7 +216,7 @@ public class SerializeSecurityConfigurator implements 
ScopeClassLoaderListener<M
         Set<Type> markedClass = new HashSet<>();
         checkClass(markedClass, clazz);
 
-        addToAllow(clazz.getName());
+        addToAllow(clazz);
 
         Method[] methodsToExport = clazz.getMethods();
 
@@ -291,7 +297,7 @@ public class SerializeSecurityConfigurator implements 
ScopeClassLoaderListener<M
             return;
         }
 
-        addToAllow(clazz.getName());
+        addToAllow(clazz);
 
         if (ClassUtils.isSimpleType(clazz) || clazz.isPrimitive() || 
clazz.isArray()) {
             return;
@@ -337,11 +343,17 @@ public class SerializeSecurityConfigurator implements 
ScopeClassLoaderListener<M
         }
     }
 
-    private void addToAllow(String className) {
+    private void addToAllow(Class<?> clazz) {
+        if (classHolder != null) {
+            classHolder.storeClass(clazz);
+        }
+
+        String className = clazz.getName();
         // ignore jdk
         if (className.startsWith("java.")
                 || className.startsWith("javax.")
                 || className.startsWith("com.sun.")
+                || className.startsWith("jakarta.")
                 || className.startsWith("sun.")
                 || className.startsWith("jdk.")) {
             serializeSecurityManager.addToAllowed(className);
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
index bcccd7e133..9b2966a05b 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
@@ -481,7 +481,7 @@ class ConfigManagerTest {
     public static class TestPreferSerializationProvider implements 
PreferSerializationProvider {
         @Override
         public String getPreferSerialization() {
-            return "fastjson2,hessian2";
+            return "hessian2";
         }
     }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
index 3c86651c6c..c10c8eefc2 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
@@ -389,7 +389,7 @@ class ProtocolConfigTest {
         assertNull(protocolConfig.getPreferSerialization());
 
         protocolConfig.checkDefault();
-        assertThat(protocolConfig.getPreferSerialization(), 
equalTo("fastjson2,hessian2"));
+        assertThat(protocolConfig.getPreferSerialization(), 
equalTo("hessian2,fastjson2"));
 
         protocolConfig = new ProtocolConfig();
         protocolConfig.setSerialization("x-serialization");
@@ -405,7 +405,7 @@ class ProtocolConfigTest {
         assertNull(protocolConfig.getPreferSerialization());
 
         protocolConfig.refresh();
-        assertThat(protocolConfig.getPreferSerialization(), 
equalTo("fastjson2,hessian2"));
+        assertThat(protocolConfig.getPreferSerialization(), 
equalTo("hessian2,fastjson2"));
 
         protocolConfig = new ProtocolConfig();
         protocolConfig.setSerialization("x-serialization");
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml 
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
index ab13f35f2d..ed2db22077 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/pom.xml
@@ -122,6 +122,11 @@
       <artifactId>dubbo-serialization-fastjson2</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo</groupId>
+      <artifactId>dubbo-serialization-hessian2</artifactId>
+      <version>${project.version}</version>
+    </dependency>
 
     <dependency>
       <groupId>org.apache.dubbo</groupId>
@@ -134,11 +139,6 @@
       <version>${project.version}</version>
     </dependency>
 
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>fastjson</artifactId>
-    </dependency>
-
     <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-native</artifactId>
diff --git 
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/org/apache/dubbo/demo/graalvm/consumer/Application.java
 
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/org/apache/dubbo/demo/graalvm/consumer/Application.java
index cbe1fd58af..1c9ebb64e5 100644
--- 
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/org/apache/dubbo/demo/graalvm/consumer/Application.java
+++ 
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-consumer/src/main/java/org/apache/dubbo/demo/graalvm/consumer/Application.java
@@ -36,7 +36,7 @@ public class Application {
     public static void main(String[] args) {
         
SystemPropertyConfigUtils.setSystemProperty(DubboProperty.DUBBO_APPLICATION_LOGGER,
 "logback");
         System.setProperty("native", "true");
-        
SystemPropertyConfigUtils.setSystemProperty(DubboProperty.DUBBO_PREFER_JSON_FRAMEWORK_NAME,
 "fastjson");
+        
SystemPropertyConfigUtils.setSystemProperty(DubboProperty.DUBBO_PREFER_JSON_FRAMEWORK_NAME,
 "fastjson2");
         runWithBootstrap();
     }
 
@@ -55,7 +55,7 @@ public class Application {
         reference.setGeneric("false");
 
         ProtocolConfig protocolConfig = new 
ProtocolConfig(CommonConstants.DUBBO, -1);
-        protocolConfig.setSerialization("fastjson2");
+        protocolConfig.setSerialization("hessian2");
         bootstrap
                 .application(applicationConfig)
                 .registry(new RegistryConfig(REGISTRY_URL))
diff --git a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml 
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
index 39471b6dbd..bf312f5965 100644
--- a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
+++ b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/pom.xml
@@ -122,6 +122,11 @@
       <artifactId>dubbo-serialization-fastjson2</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo</groupId>
+      <artifactId>dubbo-serialization-hessian2</artifactId>
+      <version>${project.version}</version>
+    </dependency>
 
     <dependency>
       <groupId>org.apache.dubbo</groupId>
@@ -133,10 +138,6 @@
       <artifactId>dubbo-filter-validation</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>fastjson</artifactId>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.dubbo</groupId>
diff --git 
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java
 
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java
index 8294638eca..c0a4e9e4fd 100644
--- 
a/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java
+++ 
b/dubbo-demo/dubbo-demo-native/dubbo-demo-native-provider/src/main/java/org/apache/dubbo/demo/graalvm/provider/Application.java
@@ -36,7 +36,7 @@ public class Application {
     public static void main(String[] args) throws Exception {
         
SystemPropertyConfigUtils.setSystemProperty(DubboProperty.DUBBO_APPLICATION_LOGGER,
 "logback");
         System.setProperty("native", "true");
-        
SystemPropertyConfigUtils.setSystemProperty(DubboProperty.DUBBO_PREFER_JSON_FRAMEWORK_NAME,
 "fastjson");
+        
SystemPropertyConfigUtils.setSystemProperty(DubboProperty.DUBBO_PREFER_JSON_FRAMEWORK_NAME,
 "fastjson2");
         startWithBootstrap();
         System.in.read();
     }
@@ -60,7 +60,7 @@ public class Application {
         service.setRef(new DemoServiceImpl());
 
         ProtocolConfig protocolConfig = new 
ProtocolConfig(CommonConstants.DUBBO, -1);
-        protocolConfig.setSerialization("fastjson2");
+        protocolConfig.setSerialization("hessian2");
         bootstrap
                 .application(applicationConfig)
                 .registry(new RegistryConfig(REGISTRY_URL))
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index d50b16f3cc..d538054c7b 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -167,7 +167,7 @@
     <jaxb_version>2.2.7</jaxb_version>
     <activation_version>1.2.0</activation_version>
     <test_container_version>1.19.7</test_container_version>
-    <hessian_lite_version>3.2.13</hessian_lite_version>
+    <hessian_lite_version>4.0.0</hessian_lite_version>
     <swagger_version>1.6.14</swagger_version>
 
     <snappy_java_version>1.1.10.5</snappy_java_version>
@@ -364,7 +364,7 @@
         <version>${hessian_version}</version>
       </dependency>
       <dependency>
-        <groupId>com.alibaba</groupId>
+        <groupId>org.apache.dubbo</groupId>
         <artifactId>hessian-lite</artifactId>
         <version>${hessian_lite_version}</version>
       </dependency>
diff --git a/dubbo-distribution/dubbo-all-shaded/pom.xml 
b/dubbo-distribution/dubbo-all-shaded/pom.xml
index f9207588e3..b7426c4d7b 100644
--- a/dubbo-distribution/dubbo-all-shaded/pom.xml
+++ b/dubbo-distribution/dubbo-all-shaded/pom.xml
@@ -427,7 +427,7 @@
       <artifactId>snakeyaml</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.alibaba</groupId>
+      <groupId>org.apache.dubbo</groupId>
       <artifactId>hessian-lite</artifactId>
     </dependency>
     <dependency>
diff --git a/dubbo-distribution/dubbo-all/pom.xml 
b/dubbo-distribution/dubbo-all/pom.xml
index dceb0307b1..15de10a518 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -456,7 +456,7 @@
       <artifactId>snakeyaml</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.alibaba</groupId>
+      <groupId>org.apache.dubbo</groupId>
       <artifactId>hessian-lite</artifactId>
     </dependency>
     <dependency>
diff --git 
a/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java
 
b/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java
index f924e4a714..d1bb9bc931 100644
--- 
a/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java
+++ 
b/dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/AotProcessor.java
@@ -19,6 +19,9 @@ package org.apache.dubbo.aot.generate;
 import org.apache.dubbo.aot.api.JdkProxyDescriber;
 import org.apache.dubbo.aot.api.ProxyDescriberRegistrar;
 import org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar;
+import org.apache.dubbo.aot.api.ResourceBundleDescriber;
+import org.apache.dubbo.aot.api.ResourceDescriberRegistrar;
+import org.apache.dubbo.aot.api.ResourcePatternDescriber;
 import org.apache.dubbo.aot.api.TypeDescriber;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.rpc.model.FrameworkModel;
@@ -46,6 +49,12 @@ public class AotProcessor {
                 ResourceScanner.INSTANCE.distinctSpiResource().toArray(new 
String[] {}));
         resourceRepository.registerIncludesPatterns(
                 
ResourceScanner.INSTANCE.distinctSecurityResource().toArray(new String[] {}));
+        for (ResourcePatternDescriber resourcePatternDescriber : 
getResourcePatternDescribers()) {
+            
resourceRepository.registerIncludesPattern(resourcePatternDescriber);
+        }
+        for (ResourceBundleDescriber resourceBundleDescriber : 
getResourceBundleDescribers()) {
+            resourceRepository.registerBundles(resourceBundleDescriber);
+        }
         writer.writeResourceConfig(resourceRepository);
 
         ReflectConfigMetadataRepository reflectRepository = new 
ReflectConfigMetadataRepository();
@@ -89,6 +98,52 @@ public class AotProcessor {
         return typeDescribers;
     }
 
+    private static List<ResourcePatternDescriber> 
getResourcePatternDescribers() {
+        List<ResourcePatternDescriber> resourcePatternDescribers = new 
ArrayList<>();
+        FrameworkModel.defaultModel()
+                .defaultApplication()
+                .getExtensionLoader(ResourceDescriberRegistrar.class)
+                .getSupportedExtensionInstances()
+                .forEach(reflectionTypeDescriberRegistrar -> {
+                    List<ResourcePatternDescriber> describers = new 
ArrayList<>();
+                    try {
+                        describers = 
reflectionTypeDescriberRegistrar.getResourcePatternDescribers();
+                    } catch (Throwable e) {
+                        // The ResourceDescriberRegistrar implementation 
classes are shaded, causing some unused
+                        // classes to be loaded.
+                        // When loading a dependent class may appear that 
cannot be found, it does not affect.
+                        // ignore
+                    }
+
+                    resourcePatternDescribers.addAll(describers);
+                });
+
+        return resourcePatternDescribers;
+    }
+
+    private static List<ResourceBundleDescriber> getResourceBundleDescribers() 
{
+        List<ResourceBundleDescriber> resourceBundleDescribers = new 
ArrayList<>();
+        FrameworkModel.defaultModel()
+                .defaultApplication()
+                .getExtensionLoader(ResourceDescriberRegistrar.class)
+                .getSupportedExtensionInstances()
+                .forEach(reflectionTypeDescriberRegistrar -> {
+                    List<ResourceBundleDescriber> describers = new 
ArrayList<>();
+                    try {
+                        describers = 
reflectionTypeDescriberRegistrar.getResourceBundleDescribers();
+                    } catch (Throwable e) {
+                        // The ResourceDescriberRegistrar implementation 
classes are shaded, causing some unused
+                        // classes to be loaded.
+                        // When loading a dependent class may appear that 
cannot be found, it does not affect.
+                        // ignore
+                    }
+
+                    resourceBundleDescribers.addAll(describers);
+                });
+
+        return resourceBundleDescribers;
+    }
+
     private static List<JdkProxyDescriber> getProxyDescribers() {
         List<JdkProxyDescriber> jdkProxyDescribers = new ArrayList<>();
         FrameworkModel.defaultModel()
diff --git a/dubbo-rpc/dubbo-rpc-api/pom.xml b/dubbo-rpc/dubbo-rpc-api/pom.xml
index 40d072ed26..fc50ca0d84 100644
--- a/dubbo-rpc/dubbo-rpc-api/pom.xml
+++ b/dubbo-rpc/dubbo-rpc-api/pom.xml
@@ -47,7 +47,7 @@
       <version>${project.parent.version}</version>
     </dependency>
     <dependency>
-      <groupId>com.alibaba</groupId>
+      <groupId>org.apache.dubbo</groupId>
       <artifactId>hessian-lite</artifactId>
       <scope>test</scope>
     </dependency>
diff --git 
a/dubbo-serialization/dubbo-serialization-api/src/main/java/org/apache/dubbo/common/serialize/support/PreferSerializationProviderImpl.java
 
b/dubbo-serialization/dubbo-serialization-api/src/main/java/org/apache/dubbo/common/serialize/support/PreferSerializationProviderImpl.java
index 402600fe3b..014e026c90 100644
--- 
a/dubbo-serialization/dubbo-serialization-api/src/main/java/org/apache/dubbo/common/serialize/support/PreferSerializationProviderImpl.java
+++ 
b/dubbo-serialization/dubbo-serialization-api/src/main/java/org/apache/dubbo/common/serialize/support/PreferSerializationProviderImpl.java
@@ -28,7 +28,7 @@ public class PreferSerializationProviderImpl implements 
PreferSerializationProvi
     private final String preferSerialization;
 
     public PreferSerializationProviderImpl(FrameworkModel frameworkModel) {
-        List<String> defaultSerializations = Arrays.asList("fastjson2", 
"hessian2");
+        List<String> defaultSerializations = Arrays.asList("hessian2", 
"fastjson2");
         this.preferSerialization = defaultSerializations.stream()
                 .filter(s ->
                         
frameworkModel.getExtensionLoader(Serialization.class).hasExtension(s))
diff --git a/dubbo-serialization/dubbo-serialization-hessian2/pom.xml 
b/dubbo-serialization/dubbo-serialization-hessian2/pom.xml
index c6ba6bd6fa..0342a5e766 100644
--- a/dubbo-serialization/dubbo-serialization-hessian2/pom.xml
+++ b/dubbo-serialization/dubbo-serialization-hessian2/pom.xml
@@ -37,7 +37,7 @@ limitations under the License.
       <version>${project.parent.version}</version>
     </dependency>
     <dependency>
-      <groupId>com.alibaba</groupId>
+      <groupId>org.apache.dubbo</groupId>
       <artifactId>hessian-lite</artifactId>
     </dependency>
     <dependency>
@@ -45,5 +45,11 @@ limitations under the License.
       <artifactId>log4j-slf4j-impl</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo</groupId>
+      <artifactId>dubbo-native</artifactId>
+      <version>${project.parent.version}</version>
+    </dependency>
+
   </dependencies>
 </project>
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
index e813894292..4f02609dfe 100644
--- 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
@@ -25,6 +25,8 @@ import com.alibaba.com.caucho.hessian.io.JavaDeserializer;
 import com.alibaba.com.caucho.hessian.io.JavaSerializer;
 import com.alibaba.com.caucho.hessian.io.Serializer;
 import com.alibaba.com.caucho.hessian.io.SerializerFactory;
+import com.alibaba.com.caucho.hessian.io.UnsafeDeserializer;
+import com.alibaba.com.caucho.hessian.io.UnsafeSerializer;
 
 public class Hessian2SerializerFactory extends SerializerFactory {
 
@@ -54,7 +56,9 @@ public class Hessian2SerializerFactory extends 
SerializerFactory {
 
         checkSerializable(cl);
 
-        return new JavaSerializer(cl, getClassLoader());
+        if (isEnableUnsafeSerializer() && JavaSerializer.getWriteReplace(cl) 
== null) {
+            return UnsafeSerializer.create(cl);
+        } else return JavaSerializer.create(cl);
     }
 
     @Override
@@ -68,7 +72,9 @@ public class Hessian2SerializerFactory extends 
SerializerFactory {
 
         checkSerializable(cl);
 
-        return new JavaDeserializer(cl);
+        if (isEnableUnsafeSerializer()) {
+            return new UnsafeDeserializer(cl, getFieldDeserializerFactory());
+        } else return new JavaDeserializer(cl, getFieldDeserializerFactory());
     }
 
     private void checkSerializable(Class<?> cl) {
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java
new file mode 100644
index 0000000000..0c44aa6572
--- /dev/null
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianReflectionTypeDescriberRegistrar.java
@@ -0,0 +1,100 @@
+/*
+ * 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 org.apache.dubbo.common.serialize.hessian2.aot;
+
+import org.apache.dubbo.aot.api.MemberCategory;
+import org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar;
+import org.apache.dubbo.aot.api.TypeDescriber;
+
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.alibaba.com.caucho.hessian.io.BigDecimalDeserializer;
+import com.alibaba.com.caucho.hessian.io.FileDeserializer;
+import com.alibaba.com.caucho.hessian.io.HessianRemote;
+import com.alibaba.com.caucho.hessian.io.LocaleSerializer;
+import com.alibaba.com.caucho.hessian.io.ObjectNameDeserializer;
+import com.alibaba.com.caucho.hessian.io.StringValueSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.DurationSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.InstantSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.LocalDateSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.LocalDateTimeSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.LocalTimeSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.MonthDaySerializer;
+import com.alibaba.com.caucho.hessian.io.java8.OffsetDateTimeSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.OffsetTimeSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.PeriodSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.YearMonthSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.YearSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.ZoneIdSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.ZoneOffsetSerializer;
+import com.alibaba.com.caucho.hessian.io.java8.ZonedDateTimeSerializer;
+
+public class HessianReflectionTypeDescriberRegistrar implements 
ReflectionTypeDescriberRegistrar {
+
+    @Override
+    public List<TypeDescriber> getTypeDescribers() {
+        List<TypeDescriber> typeDescribers = new ArrayList<>();
+        
typeDescribers.add(buildTypeDescriberWithDeclared(BigDecimalDeserializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(FileDeserializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(HessianRemote.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(LocaleSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(ObjectNameDeserializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(StringValueSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(DurationSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(InstantSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(LocalDateSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(LocalDateTimeSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(LocalTimeSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(MonthDaySerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(OffsetDateTimeSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(OffsetTimeSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(PeriodSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(YearMonthSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(YearSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(ZoneIdSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(ZoneOffsetSerializer.class));
+        
typeDescribers.add(buildTypeDescriberWithDeclared(ZonedDateTimeSerializer.class));
+        typeDescribers.add(buildTypeDescriberWithDeclared(Date.class));
+        typeDescribers.add(buildTypeDescriberWithDeclared(Time.class));
+        typeDescribers.add(buildTypeDescriberWithDeclared(Timestamp.class));
+
+        return typeDescribers;
+    }
+
+    private TypeDescriber buildTypeDescriberWithDeclared(Class<?> cl) {
+        Set<MemberCategory> memberCategories = new HashSet<>();
+        memberCategories.add(MemberCategory.INVOKE_DECLARED_METHODS);
+        memberCategories.add(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
+        memberCategories.add(MemberCategory.DECLARED_FIELDS);
+        return new TypeDescriber(
+                cl.getName(), null, new HashSet<>(), new HashSet<>(), new 
HashSet<>(), memberCategories);
+    }
+
+    private TypeDescriber buildTypeDescriberWithDeclared(String cl) {
+        Set<MemberCategory> memberCategories = new HashSet<>();
+        memberCategories.add(MemberCategory.INVOKE_DECLARED_METHODS);
+        memberCategories.add(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
+        memberCategories.add(MemberCategory.DECLARED_FIELDS);
+        return new TypeDescriber(cl, null, new HashSet<>(), new HashSet<>(), 
new HashSet<>(), memberCategories);
+    }
+}
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java
new file mode 100644
index 0000000000..daae432f50
--- /dev/null
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/aot/HessianResourceDescriberRegistrar.java
@@ -0,0 +1,36 @@
+/*
+ * 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 org.apache.dubbo.common.serialize.hessian2.aot;
+
+import org.apache.dubbo.aot.api.ResourceBundleDescriber;
+import org.apache.dubbo.aot.api.ResourceDescriberRegistrar;
+import org.apache.dubbo.aot.api.ResourcePatternDescriber;
+
+import java.util.Collections;
+import java.util.List;
+
+public class HessianResourceDescriberRegistrar implements 
ResourceDescriberRegistrar {
+    @Override
+    public List<ResourcePatternDescriber> getResourcePatternDescribers() {
+        return Collections.singletonList(new 
ResourcePatternDescriber("DENY_CLASS", null));
+    }
+
+    @Override
+    public List<ResourceBundleDescriber> getResourceBundleDescribers() {
+        return Collections.emptyList();
+    }
+}
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar
new file mode 100644
index 0000000000..bd5df8a4d7
--- /dev/null
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ReflectionTypeDescriberRegistrar
@@ -0,0 +1 @@
+hessian=org.apache.dubbo.common.serialize.hessian2.aot.HessianReflectionTypeDescriberRegistrar
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar
new file mode 100644
index 0000000000..b0c728b6db
--- /dev/null
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.aot.api.ResourceDescriberRegistrar
@@ -0,0 +1 @@
+hessian=org.apache.dubbo.common.serialize.hessian2.aot.HessianResourceDescriberRegistrar
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
index 47d4cf2701..637cc2b4bf 100644
--- 
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
@@ -1 +1 @@
-hessian2=org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization
\ No newline at end of file
+hessian2=org.apache.dubbo.common.serialize.hessian2.Hessian2Serialization
diff --git 
a/dubbo-serialization/dubbo-serialization-hessian2/src/test/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializationTest.java
 
b/dubbo-serialization/dubbo-serialization-hessian2/src/test/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializationTest.java
index 559ed1e3b6..b28443c90a 100644
--- 
a/dubbo-serialization/dubbo-serialization-hessian2/src/test/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializationTest.java
+++ 
b/dubbo-serialization/dubbo-serialization-hessian2/src/test/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializationTest.java
@@ -206,7 +206,7 @@ class Hessian2SerializationTest {
     }
 
     @Test
-    void testReadByte() throws IOException {
+    void testReadByte() throws IOException, ClassNotFoundException {
         FrameworkModel frameworkModel = new FrameworkModel();
         Serialization serialization =
                 
frameworkModel.getExtensionLoader(Serialization.class).getExtension("hessian2");
@@ -219,6 +219,19 @@ class Hessian2SerializationTest {
             objectOutput.writeObject((byte) 11);
             objectOutput.flushBuffer();
 
+            byte[] bytes = outputStream.toByteArray();
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+            ObjectInput objectInput = serialization.deserialize(url, 
inputStream);
+            Assertions.assertEquals((byte) 11, objectInput.readObject());
+        }
+
+        // write byte, read byte
+        {
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            ObjectOutput objectOutput = serialization.serialize(url, 
outputStream);
+            objectOutput.writeByte((byte) 11);
+            objectOutput.flushBuffer();
+
             byte[] bytes = outputStream.toByteArray();
             ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
             ObjectInput objectInput = serialization.deserialize(url, 
inputStream);
diff --git a/dubbo-serialization/dubbo-serialization-jdk/pom.xml 
b/dubbo-serialization/dubbo-serialization-jdk/pom.xml
index 3c9fe679dc..53009e13c8 100644
--- a/dubbo-serialization/dubbo-serialization-jdk/pom.xml
+++ b/dubbo-serialization/dubbo-serialization-jdk/pom.xml
@@ -37,7 +37,7 @@ limitations under the License.
       <version>${project.parent.version}</version>
     </dependency>
     <dependency>
-      <groupId>com.alibaba</groupId>
+      <groupId>org.apache.dubbo</groupId>
       <artifactId>hessian-lite</artifactId>
     </dependency>
   </dependencies>


Reply via email to