You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fory.apache.org by ch...@apache.org on 2026/03/04 11:58:45 UTC

(fory) branch main updated: refactor: clean java serialize api (#3454)

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

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git


The following commit(s) were added to refs/heads/main by this push:
     new 9ee1bef8f refactor: clean java serialize api (#3454)
9ee1bef8f is described below

commit 9ee1bef8f4250cbec289e62e757f9f9ce495301b
Author: Shawn Yang <sh...@gmail.com>
AuthorDate: Wed Mar 4 19:58:40 2026 +0800

    refactor: clean java serialize api (#3454)
    
    ## Why?
    
    Refactor and simplify the Java-facing API before release: remove
    duplicate legacy entry points, unify resolver access, and keep xlang
    behavior aligned across runtimes.
    
    ## What does this PR do?
    
    - Removes legacy Java serialization APIs from `Fory`/`BaseFory`:
      - `serializeJavaObject` / `deserializeJavaObject`
      - `serializeJavaObjectAndClass` / `deserializeJavaObjectAndClass`
    - Keeps the unified API pair: `serialize` + `deserialize` overloads
    (including typed overloads).
    - Unifies resolver APIs:
      - Removes `getClassResolver` / `getXtypeResolver` from public API.
      - Keeps `getTypeResolver` as the only resolver entry.
      - Removes `ClassChecker` API and standardizes on `TypeChecker`.
    - Updates internal and callsite usages (including Scala/Kotlin) to use
    `TypeResolver`, casting to `ClassResolver` only where
    class-resolver-only APIs are required.
    - Refactors `Fory` internals to use a single `TypeResolver` field
    instead of separate `classResolver`/`xtypeResolver` fields.
    - Cleans up unified read/write paths in `Fory`, including INT64
    handling:
    - `Types.INT64` uses `LongSerializer.writeInt64` /
    `LongSerializer.readInt64`
      - `Types.VARINT64` uses varint methods
      - `Types.TAGGED_INT64` uses tagged int64 methods
    - Temporarily disables TypeMeta compression for xlang in
    Java/Python/Rust/Go/C++ paths and adds comments explaining that some
    runtimes do not yet support TypeMeta decompression.
    - Updates docs/examples/tests across modules to remove deleted APIs and
    reflect the unified API/resolver model.
    
    ## Related issues
    
    N/A
    
    ## Does this PR introduce any user-facing change?
    
    Yes. Java public API is simplified by removing legacy
    serialization/deserialization entry points and exposing a single
    resolver accessor (`getTypeResolver`).
    
    - [x] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
    
    N/A (refactor/API cleanup + compatibility alignment; no
    performance-targeted optimization in this PR)
---
 README.md                                          |   2 +-
 cpp/fory/serialization/type_resolver.cc            |   3 +-
 docs/guide/java/basic-serialization.md             |  16 +-
 docs/guide/java/schema-evolution.md                |   4 +-
 docs/guide/java/troubleshooting.md                 |  34 +-
 docs/guide/java/type-registration.md               |  12 +-
 go/fory/type_def.go                                |   2 +
 .../main/java/org/apache/fory/graalvm/Example.java |   2 +-
 .../apache/fory/graalvm/FeatureTestExample.java    |   2 +-
 .../java/org/apache/fory/graalvm/XlangExample.java |   2 +-
 .../org/apache/fory/AbstractThreadSafeFory.java    |   7 +-
 .../src/main/java/org/apache/fory/BaseFory.java    |  67 +--
 .../src/main/java/org/apache/fory/Fory.java        | 651 +++++----------------
 .../main/java/org/apache/fory/ThreadLocalFory.java |  85 +--
 .../main/java/org/apache/fory/ThreadSafeFory.java  |  11 +-
 .../java/org/apache/fory/builder/CodecUtils.java   |  16 +-
 .../java/org/apache/fory/builder/Generated.java    |   4 +-
 .../apache/fory/builder/ObjectCodecBuilder.java    |   2 +-
 .../org/apache/fory/io/BlockedStreamUtils.java     |  22 +-
 .../org/apache/fory/meta/NativeTypeDefEncoder.java |   4 +-
 .../main/java/org/apache/fory/meta/TypeDef.java    |  16 +-
 .../java/org/apache/fory/meta/TypeDefEncoder.java  |  30 +-
 .../java/org/apache/fory/pool/SimpleForyPool.java  | 101 +---
 .../java/org/apache/fory/pool/ThreadPoolFory.java  | 101 +---
 .../org/apache/fory/resolver/ClassChecker.java     |  36 --
 .../org/apache/fory/resolver/ClassResolver.java    |  49 +-
 .../org/apache/fory/resolver/TypeResolver.java     |  39 ++
 .../org/apache/fory/resolver/XtypeResolver.java    |  18 +-
 .../fory/serializer/AbstractObjectSerializer.java  |   5 +-
 .../apache/fory/serializer/ArraySerializers.java   |  15 +-
 .../apache/fory/serializer/CodegenSerializer.java  |  15 +-
 .../org/apache/fory/serializer/FieldGroups.java    |   2 +-
 .../apache/fory/serializer/LambdaSerializer.java   |   5 +-
 .../org/apache/fory/serializer/LazySerializer.java |  10 +-
 .../fory/serializer/MetaSharedSerializer.java      |   4 +-
 .../apache/fory/serializer/ObjectSerializer.java   |   4 +-
 .../fory/serializer/ObjectStreamSerializer.java    |  20 +-
 .../fory/serializer/ReplaceResolveSerializer.java  |   9 +-
 .../apache/fory/serializer/SerializationUtils.java |   2 +-
 .../org/apache/fory/serializer/Serializers.java    |  16 +-
 .../fory/serializer/UnknownClassSerializers.java   |   2 +-
 .../collection/ChildContainerSerializers.java      |   2 +-
 .../collection/CollectionLikeSerializer.java       |   4 +-
 .../collection/CollectionSerializers.java          |  26 +-
 .../collection/GuavaCollectionSerializers.java     |  14 +-
 .../fory/serializer/collection/MapSerializers.java |  12 +-
 .../serializer/collection/SubListSerializers.java  |   2 +-
 .../fory/type/unsigned/UnsignedSerializers.java    |   8 +-
 .../fory-core/native-image.properties              |   1 -
 .../src/test/java/org/apache/fory/ForyTest.java    | 108 +++-
 .../test/java/org/apache/fory/ForyTestBase.java    |   2 +-
 .../src/test/java/org/apache/fory/StreamTest.java  |  99 +---
 .../src/test/java/org/apache/fory/TestUtils.java   |   2 +-
 .../java/org/apache/fory/ThreadSafeForyTest.java   |  16 +-
 .../org/apache/fory/builder/CodecUtilsTest.java    |   2 +-
 .../org/apache/fory/builder/JITContextTest.java    |   6 +-
 .../fory/builder/ObjectCodecBuilderTest.java       |   2 +-
 .../org/apache/fory/collection/LazyMapTest.java    |   2 +-
 .../org/apache/fory/io/BlockedStreamUtilsTest.java |   8 +-
 .../apache/fory/meta/NativeTypeDefEncoderTest.java |  13 +-
 .../org/apache/fory/meta/TypeDefEncoderTest.java   |  29 +-
 .../java/org/apache/fory/meta/TypeDefTest.java     |  67 ++-
 .../apache/fory/resolver/AllowListCheckerTest.java |  20 +-
 .../apache/fory/resolver/ClassResolverTest.java    |  39 +-
 .../org/apache/fory/resolver/TypeInfoTest.java     |   2 +-
 .../fory/serializer/CodegenSerializerTest.java     |   8 +-
 .../fory/serializer/CompatibleSerializerTest.java  |  19 +-
 .../fory/serializer/DuplicateFieldsTest.java       |   4 +-
 .../apache/fory/serializer/EnumSerializerTest.java |  16 +-
 .../fory/serializer/LambdaSerializerTest.java      |   4 +-
 .../serializer/ObjectStreamSerializerTest.java     |   6 +-
 .../serializer/ReplaceResolveSerializerTest.java   |  13 +-
 .../fory/serializer/SerializerFactoryTest.java     |   2 +-
 .../fory/serializer/StringSerializerTest.java      |   2 +-
 .../collection/ChildContainerSerializersTest.java  |  10 +-
 .../collection/CollectionSerializersTest.java      |  28 +-
 .../collection/GuavaCollectionSerializersTest.java |  32 +-
 .../serializer/collection/MapSerializersTest.java  |  14 +-
 .../collection/SynchronizedSerializersTest.java    |   2 +-
 .../collection/UnmodifiableSerializersTest.java    |   2 +-
 .../DifferentPOJOCompatibleSerializerTest.java     |   8 +-
 ...JOCompatibleSerializerWithRegistrationTest.java |   9 +-
 .../apache/fory/type/DescriptorGrouperTest.java    |  18 +-
 .../fory/extension/meta/TypeDefEncoderTest.java    |   6 +-
 .../serializer/ProtobufSerializerTest.java         |   2 +-
 .../serializer/CompressedArraySerializers.java     |   4 +-
 .../fory/test/Object2ObjectOpenHashMapTest.java    |   4 +-
 .../fory/serializer/kotlin/KotlinSerializers.java  |   4 +-
 .../fory/serializer/kotlin/DurationSerializer.kt   |   2 +-
 .../serializer/kotlin/UnsignedArraySerializers.kt  |   2 +-
 python/pyfory/meta/typedef_encoder.py              |   9 +-
 python/pyfory/tests/test_typedef_encoding.py       |   2 +
 rust/fory-core/src/meta/type_meta.rs               |   2 +
 .../fory/serializer/scala/ScalaSerializers.java    |   8 +-
 .../fory/serializer/scala/RangeSerializer.scala    |   4 +-
 .../scala/CollectionSerializerTest.scala           |   3 +-
 96 files changed, 766 insertions(+), 1416 deletions(-)

diff --git a/README.md b/README.md
index 99a86c568..4e1379b07 100644
--- a/README.md
+++ b/README.md
@@ -609,7 +609,7 @@ Dynamic serialization can deserialize arbitrary types, which may introduce risks
 Fory enables class registration **by default** for dynamic protocols, allowing only trusted registered types.
 **Do not disable class registration unless you can ensure your environment is secure**.
 
-If this option is disabled, you are responsible for serialization security. You should implement and configure a customized `ClassChecker` or `DeserializationPolicy` for fine-grained security control
+If this option is disabled, you are responsible for serialization security. You should implement and configure a customized `TypeChecker` or `DeserializationPolicy` for fine-grained security control.
 
 To report security vulnerabilities in Apache Fory™, please follow the [ASF vulnerability reporting process](https://apache.org/security/#reporting-a-vulnerability).
 
diff --git a/cpp/fory/serialization/type_resolver.cc b/cpp/fory/serialization/type_resolver.cc
index e8070a3e9..d94583199 100644
--- a/cpp/fory/serialization/type_resolver.cc
+++ b/cpp/fory/serialization/type_resolver.cc
@@ -38,7 +38,8 @@ constexpr uint8_t REGISTER_BY_NAME_FLAG = 0b100000;
 constexpr size_t FIELD_NAME_SIZE_THRESHOLD = 0b1111;
 constexpr size_t BIG_NAME_THRESHOLD = 0b111111;
 constexpr int64_t META_SIZE_MASK = 0xff;
-// constexpr int64_t COMPRESS_META_FLAG = 0b1 << 9;
+// Temporary xlang behavior: keep TypeMeta uncompressed because some runtimes
+// still do not support TypeMeta decompression.
 constexpr int64_t HAS_FIELDS_META_FLAG = 0b1 << 8;
 constexpr int8_t NUM_HASH_BITS = 50;
 
diff --git a/docs/guide/java/basic-serialization.md b/docs/guide/java/basic-serialization.md
index a27f8cd97..caa9c1fd2 100644
--- a/docs/guide/java/basic-serialization.md
+++ b/docs/guide/java/basic-serialization.md
@@ -106,21 +106,11 @@ Object obj = fory.deserialize(bytes);
 ### Serialize/Deserialize with Type
 
 ```java
-// Serialize with explicit type
-byte[] bytes = fory.serializeJavaObject(object);
+// Serialize object
+byte[] bytes = fory.serialize(object);
 
 // Deserialize with expected type
-MyClass obj = fory.deserializeJavaObject(bytes, MyClass.class);
-```
-
-### Serialize/Deserialize with Type Info
-
-```java
-// Serialize with type information
-byte[] bytes = fory.serializeJavaObjectAndClass(object);
-
-// Deserialize with embedded type info
-Object obj = fory.deserializeJavaObjectAndClass(bytes);
+MyClass obj = fory.deserialize(bytes, MyClass.class);
 ```
 
 ## Best Practices
diff --git a/docs/guide/java/schema-evolution.md b/docs/guide/java/schema-evolution.md
index f0211cbaf..8dce5824c 100644
--- a/docs/guide/java/schema-evolution.md
+++ b/docs/guide/java/schema-evolution.md
@@ -198,8 +198,8 @@ public class DeserializeIntoType {
 
   public static void main(String[] args) {
     Struct1 struct1 = new Struct1(10, "abc");
-    byte[] data = fory.serializeJavaObject(struct1);
-    Struct2 struct2 = (Struct2) fory.deserializeJavaObject(bytes, Struct2.class);
+    byte[] data = fory.serialize(struct1);
+    Struct2 struct2 = fory.deserialize(data, Struct2.class);
   }
 }
 ```
diff --git a/docs/guide/java/troubleshooting.md b/docs/guide/java/troubleshooting.md
index cdbd1aa58..7d49973cc 100644
--- a/docs/guide/java/troubleshooting.md
+++ b/docs/guide/java/troubleshooting.md
@@ -45,38 +45,28 @@ Fory fory = Fory.builder()
 
 ## Using Wrong API for Deserialization
 
-Make sure you use the matching API pairs:
+Use `serialize` with one of the `deserialize` overloads:
 
-| Serialization API                  | Deserialization API                  |
-| ---------------------------------- | ------------------------------------ |
-| `Fory#serialize`                   | `Fory#deserialize`                   |
-| `Fory#serializeJavaObject`         | `Fory#deserializeJavaObject`         |
-| `Fory#serializeJavaObjectAndClass` | `Fory#deserializeJavaObjectAndClass` |
+| Serialization API | Deserialization API |
+| ----------------- | ------------------- |
+| `Fory#serialize`  | `Fory#deserialize`  |
 
-**Wrong usage examples:**
+**Wrong usage example:**
 
 ```java
-// ❌ Wrong: serialize with serialize, deserialize with deserializeJavaObject
-byte[] bytes = fory.serialize(object);
-Object result = fory.deserializeJavaObject(bytes, MyClass.class);  // Wrong!
-
-// ❌ Wrong: serialize with serializeJavaObject, deserialize with deserialize
-byte[] bytes = fory.serializeJavaObject(object);
-Object result = fory.deserialize(bytes);  // Wrong!
+// ❌ Wrong: deserialize with an incompatible target class
+byte[] bytes = fory.serialize(struct1);
+Struct2 result = fory.deserialize(bytes, Struct2.class);  // May throw ClassCastException
 ```
 
 **Correct usage:**
 
 ```java
-// ✅ Correct: matching API pairs
 byte[] bytes = fory.serialize(object);
 Object result = fory.deserialize(bytes);
 
-byte[] bytes = fory.serializeJavaObject(object);
-MyClass result = fory.deserializeJavaObject(bytes, MyClass.class);
-
-byte[] bytes = fory.serializeJavaObjectAndClass(object);
-Object result = fory.deserializeJavaObjectAndClass(bytes);
+byte[] typedBytes = fory.serialize(object);
+MyClass typedResult = fory.deserialize(typedBytes, MyClass.class);
 ```
 
 ## Deserialize POJO into Another Type
@@ -106,8 +96,8 @@ public class DeserializeIntoType {
 
   public static void main(String[] args) {
     Struct1 struct1 = new Struct1(10, "abc");
-    byte[] data = fory.serializeJavaObject(struct1);
-    Struct2 struct2 = (Struct2) fory.deserializeJavaObject(data, Struct2.class);
+    byte[] data = fory.serialize(struct1);
+    Struct2 struct2 = fory.deserialize(data, Struct2.class);
   }
 }
 ```
diff --git a/docs/guide/java/type-registration.md b/docs/guide/java/type-registration.md
index 4dcefda39..fdfa61774 100644
--- a/docs/guide/java/type-registration.md
+++ b/docs/guide/java/type-registration.md
@@ -58,16 +58,16 @@ If there are no duplicate names for types, `namespace` can be left as empty to r
 
 ## Security Configuration
 
-### Class Checker
+### Type Checker
 
-If you invoke `ForyBuilder#requireClassRegistration(false)` to disable class registration check, you can set `org.apache.fory.resolver.ClassChecker` by `ClassResolver#setClassChecker` to control which classes are allowed for serialization.
+If you invoke `ForyBuilder#requireClassRegistration(false)` to disable class registration check, you can set `org.apache.fory.resolver.TypeChecker` by `TypeResolver#setTypeChecker` to control which classes are allowed for serialization.
 
 For example, you can allow classes started with `org.example.*`:
 
 ```java
 Fory fory = xxx;
-fory.getClassResolver().setClassChecker(
-  (classResolver, className) -> className.startsWith("org.example."));
+fory.getTypeResolver().setTypeChecker(
+  (typeResolver, className) -> className.startsWith("org.example."));
 ```
 
 ### AllowListChecker
@@ -78,8 +78,8 @@ Fory provides a `org.apache.fory.resolver.AllowListChecker` which is an allowed/
 AllowListChecker checker = new AllowListChecker(AllowListChecker.CheckLevel.STRICT);
 ThreadSafeFory fory = new ThreadLocalFory(classLoader -> {
   Fory f = Fory.builder().requireClassRegistration(true).withClassLoader(classLoader).build();
-  f.getClassResolver().setClassChecker(checker);
-  checker.addListener(f.getClassResolver());
+  f.getTypeResolver().setTypeChecker(checker);
+  checker.addListener((ClassResolver) f.getTypeResolver());
   return f;
 });
 checker.allowClass("org.example.*");
diff --git a/go/fory/type_def.go b/go/fory/type_def.go
index f2bca01a6..da669ccc3 100644
--- a/go/fory/type_def.go
+++ b/go/fory/type_def.go
@@ -1299,6 +1299,8 @@ func encodingTypeDef(typeResolver *TypeResolver, typeDef *TypeDef) ([]byte, erro
 		return nil, fmt.Errorf("failed to write fields def: %w", err)
 	}
 
+	// Temporary xlang behavior: keep TypeMeta uncompressed.
+	// Some runtimes still do not support TypeMeta decompression.
 	result, err := prependGlobalHeader(buffer, false, len(typeDef.fieldDefs) > 0)
 	if err != nil {
 		return nil, fmt.Errorf("failed to write global binary header: %w", err)
diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Example.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Example.java
index ee20eb123..4d8bcf1a8 100644
--- a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Example.java
+++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/Example.java
@@ -42,7 +42,7 @@ public class Example {
     Preconditions.checkArgument(map.equals(fory.deserialize(fory.serialize(map))));
     Foo foo = new Foo(10, "abc", List.of("str1", "str2"), Map.of("k1", 10L, "k2", 20L));
     byte[] bytes = fory.serialize(foo);
-    System.out.println(fory.getClassResolver().getSerializer(Foo.class));
+    System.out.println(fory.getTypeResolver().getSerializer(Foo.class));
     Object o = fory.deserialize(bytes);
     System.out.println(foo);
     System.out.println(o);
diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/FeatureTestExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/FeatureTestExample.java
index 9f3212f87..5ac6c9a79 100644
--- a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/FeatureTestExample.java
+++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/FeatureTestExample.java
@@ -90,7 +90,7 @@ public class FeatureTestExample {
     PrivateConstructorClass deserialized =
         (PrivateConstructorClass) fory.deserialize(fory.serialize(original));
     Preconditions.checkArgument(
-        fory.getClassResolver().getSerializer(PrivateConstructorClass.class) instanceof Generated);
+        fory.getTypeResolver().getSerializer(PrivateConstructorClass.class) instanceof Generated);
     Preconditions.checkArgument("test-value".equals(deserialized.getValue()));
     System.out.println("Private constructor class test passed");
 
diff --git a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/XlangExample.java b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/XlangExample.java
index cc621e09c..949c7e17a 100644
--- a/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/XlangExample.java
+++ b/integration_tests/graalvm_tests/src/main/java/org/apache/fory/graalvm/XlangExample.java
@@ -42,7 +42,7 @@ public class XlangExample {
     Preconditions.checkArgument(map.equals(fory.deserialize(fory.serialize(map))));
     Foo foo = new Foo(10, "abc", List.of("str1", "str2"), Map.of("k1", 10L, "k2", 20L));
     byte[] bytes = fory.serialize(foo);
-    System.out.println(fory.getXtypeResolver().getSerializer(Foo.class));
+    System.out.println(fory.getTypeResolver().getSerializer(Foo.class));
     Object o = fory.deserialize(bytes);
     System.out.println(foo);
     System.out.println(o);
diff --git a/java/fory-core/src/main/java/org/apache/fory/AbstractThreadSafeFory.java b/java/fory-core/src/main/java/org/apache/fory/AbstractThreadSafeFory.java
index c0691879d..82b792e5e 100644
--- a/java/fory-core/src/main/java/org/apache/fory/AbstractThreadSafeFory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/AbstractThreadSafeFory.java
@@ -20,8 +20,8 @@
 package org.apache.fory;
 
 import java.util.function.Function;
-import org.apache.fory.resolver.ClassChecker;
 import org.apache.fory.resolver.TypeChecker;
+import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.Serializer;
 import org.apache.fory.serializer.SerializerFactory;
 
@@ -123,9 +123,8 @@ public abstract class AbstractThreadSafeFory implements ThreadSafeFory {
   }
 
   @Override
-  @Deprecated
-  public void setClassChecker(ClassChecker classChecker) {
-    registerCallback(fory -> fory.getClassResolver().setClassChecker(classChecker));
+  public TypeResolver getTypeResolver() {
+    return execute(Fory::getTypeResolver);
   }
 
   @Override
diff --git a/java/fory-core/src/main/java/org/apache/fory/BaseFory.java b/java/fory-core/src/main/java/org/apache/fory/BaseFory.java
index feabed3c6..fc59eae32 100644
--- a/java/fory-core/src/main/java/org/apache/fory/BaseFory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/BaseFory.java
@@ -24,6 +24,7 @@ import java.util.function.Function;
 import org.apache.fory.io.ForyInputStream;
 import org.apache.fory.io.ForyReadableChannel;
 import org.apache.fory.memory.MemoryBuffer;
+import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.BufferCallback;
 import org.apache.fory.serializer.Serializer;
 import org.apache.fory.serializer.SerializerFactory;
@@ -176,6 +177,8 @@ public interface BaseFory {
 
   void setSerializerFactory(SerializerFactory serializerFactory);
 
+  TypeResolver getTypeResolver();
+
   /**
    * Ensure all compilation for serializers and accessors even for lazy initialized serializers.
    * This method will block until all compilation is done.
@@ -215,6 +218,12 @@ public interface BaseFory {
 
   <T> T deserialize(byte[] bytes, Class<T> type);
 
+  <T> T deserialize(MemoryBuffer buffer, Class<T> type);
+
+  <T> T deserialize(ForyInputStream inputStream, Class<T> type);
+
+  <T> T deserialize(ForyReadableChannel channel, Class<T> type);
+
   Object deserialize(byte[] bytes, Iterable<MemoryBuffer> outOfBandBuffers);
 
   /**
@@ -236,64 +245,6 @@ public interface BaseFory {
 
   Object deserialize(ForyReadableChannel channel, Iterable<MemoryBuffer> outOfBandBuffers);
 
-  /**
-   * Serialize java object without class info, deserialization should use {@link
-   * #deserializeJavaObject}.
-   */
-  byte[] serializeJavaObject(Object obj);
-
-  /**
-   * Serialize java object without class info, deserialization should use {@link
-   * #deserializeJavaObject}.
-   */
-  void serializeJavaObject(MemoryBuffer buffer, Object obj);
-
-  void serializeJavaObject(OutputStream outputStream, Object obj);
-
-  /**
-   * Deserialize java object from binary without class info, serialization should use {@link
-   * #serializeJavaObject}.
-   */
-  <T> T deserializeJavaObject(byte[] data, Class<T> cls);
-
-  /**
-   * Deserialize java object from binary by passing class info, serialization should use {@link
-   * #serializeJavaObject}.
-   */
-  <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> cls);
-
-  <T> T deserializeJavaObject(ForyInputStream inputStream, Class<T> cls);
-
-  <T> T deserializeJavaObject(ForyReadableChannel channel, Class<T> cls);
-
-  /** This method is deprecated, please use {@link #serialize} instead. */
-  @Deprecated
-  byte[] serializeJavaObjectAndClass(Object obj);
-
-  /** This method is deprecated, please use {@link #serialize} instead. */
-  @Deprecated
-  void serializeJavaObjectAndClass(MemoryBuffer buffer, Object obj);
-
-  /** This method is deprecated, please use {@link #serialize} instead. */
-  @Deprecated
-  void serializeJavaObjectAndClass(OutputStream outputStream, Object obj);
-
-  /** This method is deprecated, please use {@link #deserialize} instead. */
-  @Deprecated
-  Object deserializeJavaObjectAndClass(byte[] data);
-
-  /** This method is deprecated, please use {@link #deserialize} instead. */
-  @Deprecated
-  Object deserializeJavaObjectAndClass(MemoryBuffer buffer);
-
-  /** This method is deprecated, please use {@link #deserialize} instead. */
-  @Deprecated
-  Object deserializeJavaObjectAndClass(ForyInputStream inputStream);
-
-  /** This method is deprecated, please use {@link #deserialize} instead. */
-  @Deprecated
-  Object deserializeJavaObjectAndClass(ForyReadableChannel channel);
-
   /** Deep copy the <code>obj</code>. */
   <T> T copy(T obj);
 }
diff --git a/java/fory-core/src/main/java/org/apache/fory/Fory.java b/java/fory-core/src/main/java/org/apache/fory/Fory.java
index 4a2156ddd..c3d3822c7 100644
--- a/java/fory-core/src/main/java/org/apache/fory/Fory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/Fory.java
@@ -103,8 +103,7 @@ public final class Fory implements BaseFory {
   private final boolean refTracking;
   private final boolean shareMeta;
   private final RefResolver refResolver;
-  private final ClassResolver classResolver;
-  private final XtypeResolver xtypeResolver;
+  private final TypeResolver typeResolver;
   private final MetaStringResolver metaStringResolver;
   private final SerializationContext serializationContext;
   private final ClassLoader classLoader;
@@ -146,16 +145,8 @@ public final class Fory implements BaseFory {
     generics = new Generics(this);
     metaStringResolver = new MetaStringResolver();
     depth = -1;
-    classResolver = new ClassResolver(this);
-    if (crossLanguage) {
-      xtypeResolver = new XtypeResolver(this);
-    } else {
-      xtypeResolver = null;
-    }
-    classResolver.initialize();
-    if (xtypeResolver != null) {
-      xtypeResolver.initialize();
-    }
+    typeResolver = crossLanguage ? new XtypeResolver(this) : new ClassResolver(this);
+    typeResolver.initialize();
     serializationContext = new SerializationContext(config);
     this.classLoader = classLoader;
     stringSerializer = new StringSerializer(this);
@@ -266,20 +257,16 @@ public final class Fory implements BaseFory {
 
   @Override
   public void setSerializerFactory(SerializerFactory serializerFactory) {
-    classResolver.setSerializerFactory(serializerFactory);
+    typeResolver.setSerializerFactory(serializerFactory);
   }
 
   public SerializerFactory getSerializerFactory() {
-    return classResolver.getSerializerFactory();
+    return typeResolver.getSerializerFactory();
   }
 
   public <T> Serializer<T> getSerializer(Class<T> cls) {
     Preconditions.checkNotNull(cls);
-    if (!crossLanguage) {
-      return classResolver.getSerializer(cls);
-    } else {
-      return xtypeResolver.getTypeInfo(cls).getSerializer();
-    }
+    return typeResolver.getSerializer(cls);
   }
 
   @Override
@@ -406,7 +393,7 @@ public final class Fory implements BaseFory {
   /** Serialize a nullable referencable object to <code>buffer</code>. */
   public void writeRef(MemoryBuffer buffer, Object obj) {
     if (!refResolver.writeRefOrNull(buffer, obj)) {
-      TypeResolver resolver = getTypeResolver();
+      TypeResolver resolver = typeResolver;
       TypeInfo typeInfo = resolver.getTypeInfo(obj.getClass());
       if (crossLanguage && typeInfo.getCls() == UnknownStruct.class) {
         depth++;
@@ -421,7 +408,7 @@ public final class Fory implements BaseFory {
 
   public void writeRef(MemoryBuffer buffer, Object obj, TypeInfoHolder classInfoHolder) {
     if (!refResolver.writeRefOrNull(buffer, obj)) {
-      TypeResolver resolver = getTypeResolver();
+      TypeResolver resolver = typeResolver;
       TypeInfo typeInfo = resolver.getTypeInfo(obj.getClass(), classInfoHolder);
       if (crossLanguage && typeInfo.getCls() == UnknownStruct.class) {
         depth++;
@@ -435,23 +422,19 @@ public final class Fory implements BaseFory {
   }
 
   public void writeRef(MemoryBuffer buffer, Object obj, TypeInfo typeInfo) {
-    if (crossLanguage) {
+    if (crossLanguage && typeInfo.getCls() == UnknownStruct.class) {
       if (!refResolver.writeRefOrNull(buffer, obj)) {
-        if (typeInfo.getCls() == UnknownStruct.class) {
-          depth++;
-          typeInfo.getSerializer().write(buffer, obj);
-          depth--;
-          return;
-        }
-        getTypeResolver().writeTypeInfo(buffer, typeInfo);
-        writeData(buffer, typeInfo, obj);
+        depth++;
+        typeInfo.getSerializer().write(buffer, obj);
+        depth--;
       }
       return;
     }
+    TypeResolver resolver = typeResolver;
     Serializer<Object> serializer = typeInfo.getSerializer();
     if (serializer.needToWriteRef()) {
       if (!refResolver.writeRefOrNull(buffer, obj)) {
-        classResolver.writeTypeInfo(buffer, typeInfo);
+        resolver.writeTypeInfo(buffer, typeInfo);
         depth++;
         serializer.write(buffer, obj);
         depth--;
@@ -461,7 +444,7 @@ public final class Fory implements BaseFory {
         buffer.writeByte(Fory.NULL_FLAG);
       } else {
         buffer.writeByte(Fory.NOT_NULL_VALUE_FLAG);
-        classResolver.writeTypeInfo(buffer, typeInfo);
+        resolver.writeTypeInfo(buffer, typeInfo);
         depth++;
         serializer.write(buffer, obj);
         depth--;
@@ -495,7 +478,7 @@ public final class Fory implements BaseFory {
    * object graph.
    */
   public void writeNonRef(MemoryBuffer buffer, Object obj) {
-    TypeResolver resolver = getTypeResolver();
+    TypeResolver resolver = typeResolver;
     TypeInfo typeInfo = resolver.getTypeInfo(obj.getClass());
     if (crossLanguage && typeInfo.getCls() == UnknownStruct.class) {
       depth++;
@@ -514,7 +497,7 @@ public final class Fory implements BaseFory {
   }
 
   public void writeNonRef(MemoryBuffer buffer, Object obj, TypeInfoHolder holder) {
-    TypeResolver resolver = getTypeResolver();
+    TypeResolver resolver = typeResolver;
     TypeInfo typeInfo = resolver.getTypeInfo(obj.getClass(), holder);
     if (crossLanguage && typeInfo.getCls() == UnknownStruct.class) {
       depth++;
@@ -533,11 +516,12 @@ public final class Fory implements BaseFory {
       depth--;
       return;
     }
-    getTypeResolver().writeTypeInfo(buffer, typeInfo);
+    typeResolver.writeTypeInfo(buffer, typeInfo);
     writeData(buffer, typeInfo, obj);
   }
 
-  private void writeCrossLanguageData(MemoryBuffer buffer, TypeInfo typeInfo, Object obj) {
+  /** Class/type info should be written already. */
+  public void writeData(MemoryBuffer buffer, TypeInfo typeInfo, Object obj) {
     int typeId = typeInfo.getTypeId();
     switch (typeId) {
       case Types.BOOL:
@@ -549,72 +533,40 @@ public final class Fory implements BaseFory {
       case Types.INT16:
         buffer.writeInt16((Short) obj);
         break;
-      case Types.INT32:
-      case Types.VARINT32:
-        buffer.writeVarInt32((Integer) obj);
-        break;
-      case Types.INT64:
-      case Types.VARINT64:
-      case Types.TAGGED_INT64:
-        buffer.writeVarInt64((Long) obj);
-        break;
-      case Types.FLOAT32:
-        buffer.writeFloat32((Float) obj);
-        break;
-      case Types.FLOAT64:
-        buffer.writeFloat64((Double) obj);
-        break;
-        // TODO(add fastpath for other types)
-      default:
-        depth++;
-        typeInfo.getSerializer().write(buffer, obj);
-        depth--;
-    }
-  }
-
-  /** Class/type info should be written already. */
-  public void writeData(MemoryBuffer buffer, TypeInfo typeInfo, Object obj) {
-    if (crossLanguage) {
-      writeCrossLanguageData(buffer, typeInfo, obj);
-      return;
-    }
-    writeJavaData(buffer, typeInfo, obj);
-  }
-
-  /** Write not null data to buffer. */
-  private void writeJavaData(MemoryBuffer buffer, TypeInfo typeInfo, Object obj) {
-    int typeId = typeInfo.getTypeId();
-    switch (typeId) {
-      case Types.BOOL:
-        buffer.writeBoolean((Boolean) obj);
-        break;
-      case Types.INT8:
-        buffer.writeByte((Byte) obj);
-        break;
       case ClassResolver.CHAR_ID:
         buffer.writeChar((Character) obj);
         break;
-      case Types.INT16:
-        buffer.writeInt16((Short) obj);
-        break;
       case Types.INT32:
+      case Types.VARINT32:
         if (compressInt) {
           buffer.writeVarInt32((Integer) obj);
         } else {
           buffer.writeInt32((Integer) obj);
         }
         break;
-      case Types.FLOAT32:
-        buffer.writeFloat32((Float) obj);
-        break;
       case Types.INT64:
         LongSerializer.writeInt64(buffer, (Long) obj, longEncoding);
         break;
+      case Types.VARINT64:
+        buffer.writeVarInt64((Long) obj);
+        break;
+      case Types.TAGGED_INT64:
+        buffer.writeTaggedInt64((Long) obj);
+        break;
+      case Types.FLOAT32:
+        buffer.writeFloat32((Float) obj);
+        break;
       case Types.FLOAT64:
         buffer.writeFloat64((Double) obj);
         break;
       case Types.STRING:
-        stringSerializer.writeString(buffer, (String) obj);
+        if (typeInfo.getCls() == String.class) {
+          stringSerializer.writeString(buffer, (String) obj);
+          break;
+        }
+        depth++;
+        typeInfo.getSerializer().write(buffer, obj);
+        depth--;
         break;
       default:
         depth++;
@@ -743,30 +695,52 @@ public final class Fory implements BaseFory {
 
   @Override
   public Object deserialize(byte[] bytes) {
-    return deserialize(MemoryUtils.wrap(bytes), null);
+    return deserialize(MemoryUtils.wrap(bytes), (Iterable<MemoryBuffer>) null);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public <T> T deserialize(byte[] bytes, Class<T> type) {
-    MemoryBuffer buffer = MemoryUtils.wrap(bytes);
-    if (!crossLanguage && shareMeta) {
+    return deserialize(MemoryUtils.wrap(bytes), type);
+  }
+
+  @Override
+  public <T> T deserialize(MemoryBuffer buffer, Class<T> type) {
+    try {
+      jitContext.lock();
+      if (depth > 0) {
+        throwDepthDeserializationException();
+      }
+      depth = 0;
       byte bitmap = buffer.readByte();
       if ((bitmap & isNilFlag) == isNilFlag) {
         return null;
       }
       boolean peerOutOfBandEnabled = (bitmap & isOutOfBandFlag) == isOutOfBandFlag;
       assert !peerOutOfBandEnabled : "Out of band buffers not passed in when deserializing";
-      return deserializeJavaObject(buffer, type);
+      checkXlangBitmap(bitmap);
+      return deserializeByType(buffer, type);
+    } catch (Throwable t) {
+      throw ExceptionUtils.handleReadFailed(this, t);
+    } finally {
+      resetRead();
+      jitContext.unlock();
     }
-    generics.pushGenericType(classResolver.buildGenericType(type));
+  }
+
+  @Override
+  public <T> T deserialize(ForyInputStream inputStream, Class<T> type) {
     try {
-      return (T) deserialize(buffer, null);
+      return deserialize(inputStream.getBuffer(), type);
     } finally {
-      generics.popGenericType();
+      inputStream.shrinkBuffer();
     }
   }
 
+  @Override
+  public <T> T deserialize(ForyReadableChannel channel, Class<T> type) {
+    return deserialize(channel.getBuffer(), type);
+  }
+
   @Override
   public Object deserialize(byte[] bytes, Iterable<MemoryBuffer> outOfBandBuffers) {
     return deserialize(MemoryUtils.wrap(bytes), outOfBandBuffers);
@@ -774,12 +748,12 @@ public final class Fory implements BaseFory {
 
   @Override
   public Object deserialize(long address, int size) {
-    return deserialize(MemoryUtils.buffer(address, size), null);
+    return deserialize(MemoryUtils.buffer(address, size), (Iterable<MemoryBuffer>) null);
   }
 
   @Override
   public Object deserialize(MemoryBuffer buffer) {
-    return deserialize(buffer, null);
+    return deserialize(buffer, (Iterable<MemoryBuffer>) null);
   }
 
   /**
@@ -807,7 +781,7 @@ public final class Fory implements BaseFory {
       if ((bitmap & isNilFlag) == isNilFlag) {
         return null;
       }
-      boolean isTargetXLang = (bitmap & isCrossLanguageFlag) == isCrossLanguageFlag;
+      checkXlangBitmap(bitmap);
       peerOutOfBandEnabled = (bitmap & isOutOfBandFlag) == isOutOfBandFlag;
       if (peerOutOfBandEnabled) {
         Preconditions.checkNotNull(
@@ -821,13 +795,7 @@ public final class Fory implements BaseFory {
             "outOfBandBuffers should be null when the serialized stream is "
                 + "produced with bufferCallback null.");
       }
-      Object obj;
-      if (isTargetXLang) {
-        obj = readRefCrossLanguage(buffer);
-      } else {
-        obj = readRef(buffer);
-      }
-      return obj;
+      return readRef(buffer);
     } catch (Throwable t) {
       throw ExceptionUtils.handleReadFailed(this, t);
     } finally {
@@ -838,7 +806,7 @@ public final class Fory implements BaseFory {
 
   @Override
   public Object deserialize(ForyInputStream inputStream) {
-    return deserialize(inputStream, null);
+    return deserialize(inputStream, (Iterable<MemoryBuffer>) null);
   }
 
   @Override
@@ -853,7 +821,7 @@ public final class Fory implements BaseFory {
 
   @Override
   public Object deserialize(ForyReadableChannel channel) {
-    return deserialize(channel, null);
+    return deserialize(channel, (Iterable<MemoryBuffer>) null);
   }
 
   @Override
@@ -862,106 +830,95 @@ public final class Fory implements BaseFory {
     return deserialize(buf, outOfBandBuffers);
   }
 
+  @SuppressWarnings("unchecked")
+  private <T> T deserializeByType(MemoryBuffer buffer, Class<T> type) {
+    generics.pushGenericType(typeResolver.buildGenericType(type));
+    try {
+      RefResolver refResolver = this.refResolver;
+      int nextReadRefId = refResolver.tryPreserveRefId(buffer);
+      if (nextReadRefId < NOT_NULL_VALUE_FLAG) {
+        return (T) refResolver.getReadObject();
+      }
+      TypeInfo typeInfo = typeResolver.readTypeInfo(buffer, type);
+      Object value = readNonRef(buffer, typeInfo);
+      refResolver.setReadObject(nextReadRefId, value);
+      return (T) value;
+    } finally {
+      generics.popGenericType();
+    }
+  }
+
   /** Deserialize nullable referencable object from <code>buffer</code>. */
   public Object readRef(MemoryBuffer buffer) {
-    if (crossLanguage) {
-      return readRefCrossLanguage(buffer);
-    }
     RefResolver refResolver = this.refResolver;
     int nextReadRefId = refResolver.tryPreserveRefId(buffer);
     if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-      // ref value or not-null value
-      Object o = readDataInternal(buffer, classResolver.readTypeInfo(buffer));
+      TypeInfo typeInfo = typeResolver.readTypeInfo(buffer);
+      Object o = readNonRef(buffer, typeInfo);
       refResolver.setReadObject(nextReadRefId, o);
       return o;
-    } else {
-      return refResolver.getReadObject();
     }
+    return refResolver.getReadObject();
   }
 
   public Object readRef(MemoryBuffer buffer, TypeInfo typeInfo) {
-    if (crossLanguage) {
-      return readRefCrossLanguage(buffer, typeInfo);
-    }
     RefResolver refResolver = this.refResolver;
     int nextReadRefId = refResolver.tryPreserveRefId(buffer);
     if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-      // ref value or not-null value
-      Object o = readDataInternal(buffer, typeInfo);
+      Object o = readNonRef(buffer, typeInfo);
       refResolver.setReadObject(nextReadRefId, o);
       return o;
-    } else {
-      return refResolver.getReadObject();
     }
+    return refResolver.getReadObject();
   }
 
   public Object readRef(MemoryBuffer buffer, TypeInfoHolder classInfoHolder) {
-    if (crossLanguage) {
-      return readRefCrossLanguage(buffer, classInfoHolder);
-    }
     RefResolver refResolver = this.refResolver;
     int nextReadRefId = refResolver.tryPreserveRefId(buffer);
     if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-      // ref value or not-null value
-      Object o = readDataInternal(buffer, classResolver.readTypeInfo(buffer, classInfoHolder));
+      TypeInfo typeInfo = typeResolver.readTypeInfo(buffer, classInfoHolder);
+      Object o = readNonRef(buffer, typeInfo);
       refResolver.setReadObject(nextReadRefId, o);
       return o;
-    } else {
-      return refResolver.getReadObject();
     }
+    return refResolver.getReadObject();
   }
 
   @SuppressWarnings("unchecked")
   public <T> T readRef(MemoryBuffer buffer, Serializer<T> serializer) {
-    if (crossLanguage) {
-      return (T) readRefCrossLanguage(buffer, serializer);
-    }
     if (serializer.needToWriteRef()) {
-      T obj;
+      RefResolver refResolver = this.refResolver;
       int nextReadRefId = refResolver.tryPreserveRefId(buffer);
       if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-        obj = serializer.read(buffer);
-        refResolver.setReadObject(nextReadRefId, obj);
-        return obj;
-      } else {
-        return (T) refResolver.getReadObject();
-      }
-    } else {
-      byte headFlag = buffer.readByte();
-      if (headFlag == Fory.NULL_FLAG) {
-        return null;
-      } else {
-        return serializer.read(buffer);
+        Object o = readNonRef(buffer, serializer);
+        refResolver.setReadObject(nextReadRefId, o);
+        return (T) o;
       }
+      return (T) refResolver.getReadObject();
+    }
+    byte headFlag = buffer.readByte();
+    if (headFlag == Fory.NULL_FLAG) {
+      return null;
     }
+    return (T) readNonRef(buffer, serializer);
   }
 
   /** Deserialize not-null and non-reference object from <code>buffer</code>. */
   public Object readNonRef(MemoryBuffer buffer) {
-    if (crossLanguage) {
-      return readNonRefCrossLanguage(buffer, xtypeResolver.readTypeInfo(buffer));
-    }
-    return readDataInternal(buffer, classResolver.readTypeInfo(buffer));
+    TypeInfo typeInfo = typeResolver.readTypeInfo(buffer);
+    return readNonRef(buffer, typeInfo);
   }
 
   public Object readNonRef(MemoryBuffer buffer, TypeInfoHolder classInfoHolder) {
-    if (crossLanguage) {
-      return readNonRefCrossLanguage(buffer, classInfoHolder);
-    }
-    return readDataInternal(buffer, classResolver.readTypeInfo(buffer, classInfoHolder));
+    TypeInfo typeInfo = typeResolver.readTypeInfo(buffer, classInfoHolder);
+    return readNonRef(buffer, typeInfo);
   }
 
   public Object readNonRef(MemoryBuffer buffer, TypeInfo typeInfo) {
-    if (crossLanguage) {
-      return readNonRefCrossLanguage(buffer, typeInfo);
-    }
     return readDataInternal(buffer, typeInfo);
   }
 
   public Object readNonRef(MemoryBuffer buffer, Serializer<?> serializer) {
-    if (crossLanguage) {
-      return readNonRefCrossLanguage(buffer, serializer);
-    }
     incReadDepth();
     Object o = serializer.read(buffer);
     depth--;
@@ -988,15 +945,11 @@ public final class Fory implements BaseFory {
   }
 
   public Object readNullable(MemoryBuffer buffer, TypeInfoHolder classInfoHolder) {
-    if (crossLanguage) {
-      return readNullableCrossLanguage(buffer, classInfoHolder);
-    }
     byte headFlag = buffer.readByte();
     if (headFlag == Fory.NULL_FLAG) {
       return null;
-    } else {
-      return readNonRef(buffer, classInfoHolder);
     }
+    return readNonRef(buffer, classInfoHolder);
   }
 
   /** Class should be read already. */
@@ -1025,342 +978,41 @@ public final class Fory implements BaseFory {
         } else {
           return buffer.readInt32();
         }
+      case Types.VARINT32:
+        return buffer.readVarInt32();
       case Types.FLOAT32:
         return buffer.readFloat32();
       case Types.INT64:
         return LongSerializer.readInt64(buffer, longEncoding);
+      case Types.VARINT64:
+        return buffer.readVarInt64();
+      case Types.TAGGED_INT64:
+        return buffer.readTaggedInt64();
       case Types.FLOAT64:
         return buffer.readFloat64();
       case Types.STRING:
-        return stringSerializer.readString(buffer);
-      default:
+        if (typeInfo.getCls() == String.class) {
+          return stringSerializer.readString(buffer);
+        }
         incReadDepth();
-        Object read = typeInfo.getSerializer().read(buffer);
+        Object stringLike = typeInfo.getSerializer().read(buffer);
         depth--;
-        return read;
-    }
-  }
-
-  private Object readRefCrossLanguage(MemoryBuffer buffer) {
-    RefResolver refResolver = this.refResolver;
-    int nextReadRefId = refResolver.tryPreserveRefId(buffer);
-    if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-      Object o = readNonRefCrossLanguage(buffer, xtypeResolver.readTypeInfo(buffer));
-      refResolver.setReadObject(nextReadRefId, o);
-      return o;
-    } else {
-      return refResolver.getReadObject();
-    }
-  }
-
-  private Object readRefCrossLanguage(MemoryBuffer buffer, TypeInfo typeInfo) {
-    RefResolver refResolver = this.refResolver;
-    int nextReadRefId = refResolver.tryPreserveRefId(buffer);
-    if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-      Object o = readNonRefCrossLanguage(buffer, typeInfo);
-      refResolver.setReadObject(nextReadRefId, o);
-      return o;
-    } else {
-      return refResolver.getReadObject();
-    }
-  }
-
-  private Object readRefCrossLanguage(MemoryBuffer buffer, TypeInfoHolder classInfoHolder) {
-    RefResolver refResolver = this.refResolver;
-    int nextReadRefId = refResolver.tryPreserveRefId(buffer);
-    if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-      Object o =
-          readNonRefCrossLanguage(buffer, xtypeResolver.readTypeInfo(buffer, classInfoHolder));
-      refResolver.setReadObject(nextReadRefId, o);
-      return o;
-    } else {
-      return refResolver.getReadObject();
-    }
-  }
-
-  private Object readRefCrossLanguage(MemoryBuffer buffer, Serializer<?> serializer) {
-    if (serializer.needToWriteRef()) {
-      RefResolver refResolver = this.refResolver;
-      int nextReadRefId = refResolver.tryPreserveRefId(buffer);
-      if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-        Object o = readNonRefCrossLanguage(buffer, serializer);
-        refResolver.setReadObject(nextReadRefId, o);
-        return o;
-      } else {
-        return refResolver.getReadObject();
-      }
-    } else {
-      byte headFlag = buffer.readByte();
-      if (headFlag == Fory.NULL_FLAG) {
-        return null;
-      } else {
-        return readNonRefCrossLanguage(buffer, serializer);
-      }
-    }
-  }
-
-  private Object readNonRefCrossLanguage(MemoryBuffer buffer, Serializer<?> serializer) {
-    incReadDepth();
-    Object o = serializer.read(buffer);
-    depth--;
-    return o;
-  }
-
-  private Object readNonRefCrossLanguage(MemoryBuffer buffer, TypeInfo typeInfo) {
-    assert typeInfo != null;
-    int typeId = typeInfo.getTypeId();
-    switch (typeId) {
-      case Types.BOOL:
-        return buffer.readBoolean();
-      case Types.INT8:
-        return buffer.readByte();
-      case Types.INT16:
-        return buffer.readInt16();
-      case Types.INT32:
-      case Types.VARINT32:
-        return buffer.readVarInt32();
-      case Types.INT64:
-      case Types.VARINT64:
-      case Types.TAGGED_INT64:
-        return buffer.readVarInt64();
-      case Types.FLOAT32:
-        return buffer.readFloat32();
-      case Types.FLOAT64:
-        return buffer.readFloat64();
+        return stringLike;
       default:
         incReadDepth();
-        Object o = typeInfo.getSerializer().read(buffer);
+        Object read = typeInfo.getSerializer().read(buffer);
         depth--;
-        return o;
-    }
-  }
-
-  private Object readNonRefCrossLanguage(MemoryBuffer buffer, TypeInfoHolder classInfoHolder) {
-    TypeInfo typeInfo = xtypeResolver.readTypeInfo(buffer, classInfoHolder);
-    return readNonRefCrossLanguage(buffer, typeInfo);
-  }
-
-  private Object readNullableCrossLanguage(MemoryBuffer buffer, TypeInfoHolder classInfoHolder) {
-    TypeInfo typeInfo = xtypeResolver.readTypeInfo(buffer, classInfoHolder);
-    return readNullableCrossLanguage(buffer, typeInfo.getSerializer());
-  }
-
-  private Object readNullableCrossLanguage(MemoryBuffer buffer, Serializer<Object> serializer) {
-    byte headFlag = buffer.readByte();
-    if (headFlag == Fory.NULL_FLAG) {
-      return null;
-    } else {
-      return serializer.read(buffer);
-    }
-  }
-
-  @Override
-  public byte[] serializeJavaObject(Object obj) {
-    MemoryBuffer buf = getBuffer();
-    buf.writerIndex(0);
-    serializeJavaObject(buf, obj);
-    byte[] bytes = buf.getBytes(0, buf.writerIndex());
-    resetBuffer();
-    return bytes;
-  }
-
-  @Override
-  public void serializeJavaObject(MemoryBuffer buffer, Object obj) {
-    try {
-      jitContext.lock();
-      if (depth > 0) {
-        throwDepthSerializationException();
-      }
-      if (config.isMetaShareEnabled()) {
-        if (!refResolver.writeRefOrNull(buffer, obj)) {
-          TypeInfo typeInfo = classResolver.getOrUpdateTypeInfo(obj.getClass());
-          classResolver.writeTypeInfo(buffer, typeInfo);
-          writeData(buffer, typeInfo, obj);
-        }
-      } else {
-        if (!refResolver.writeRefOrNull(buffer, obj)) {
-          TypeInfo typeInfo = classResolver.getOrUpdateTypeInfo(obj.getClass());
-          writeData(buffer, typeInfo, obj);
-        }
-      }
-    } catch (Throwable t) {
-      throw processSerializationError(t);
-    } finally {
-      resetWrite();
-      jitContext.unlock();
-    }
-  }
-
-  /**
-   * Serialize java object without class info, deserialization should use {@link
-   * #deserializeJavaObject}.
-   */
-  @Override
-  public void serializeJavaObject(OutputStream outputStream, Object obj) {
-    serializeToStream(outputStream, buf -> serializeJavaObject(buf, obj));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(byte[] data, Class<T> cls) {
-    return deserializeJavaObject(MemoryBuffer.fromByteArray(data), cls);
-  }
-
-  @Override
-  @SuppressWarnings("unchecked")
-  public <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> cls) {
-    try {
-      jitContext.lock();
-      if (depth > 0) {
-        throwDepthDeserializationException();
-      }
-      T obj;
-      int nextReadRefId = refResolver.tryPreserveRefId(buffer);
-      if (nextReadRefId >= NOT_NULL_VALUE_FLAG) {
-        TypeInfo typeInfo;
-        if (shareMeta) {
-          typeInfo = classResolver.readTypeInfo(buffer, cls);
-        } else {
-          typeInfo = classResolver.getTypeInfo(cls);
-        }
-        obj = (T) readDataInternal(buffer, typeInfo);
-        return obj;
-      } else {
-        return null;
-      }
-    } catch (Throwable t) {
-      throw ExceptionUtils.handleReadFailed(this, t);
-    } finally {
-      resetRead();
-      jitContext.unlock();
-    }
-  }
-
-  /**
-   * Deserialize java object from binary by passing class info, serialization should use {@link
-   * #serializeJavaObject}.
-   *
-   * <p>Note that {@link ForyInputStream} will buffer and read more data, do not use the original
-   * passed stream when constructing {@link ForyInputStream}. If this is not possible, use {@link
-   * org.apache.fory.io.BlockedStreamUtils} instead for streaming serialization and deserialization.
-   */
-  @Override
-  public <T> T deserializeJavaObject(ForyInputStream inputStream, Class<T> cls) {
-    try {
-      MemoryBuffer buf = inputStream.getBuffer();
-      return deserializeJavaObject(buf, cls);
-    } finally {
-      inputStream.shrinkBuffer();
-    }
-  }
-
-  /**
-   * Deserialize java object from binary channel by passing class info, serialization should use
-   * {@link #serializeJavaObject}.
-   *
-   * <p>Note that {@link ForyInputStream} will buffer and read more data, do not use the original
-   * passed stream when constructing {@link ForyInputStream}. If this is not possible, use {@link
-   * org.apache.fory.io.BlockedStreamUtils} instead for streaming serialization and deserialization.
-   */
-  @Override
-  public <T> T deserializeJavaObject(ForyReadableChannel channel, Class<T> cls) {
-    MemoryBuffer buf = channel.getBuffer();
-    return deserializeJavaObject(buf, cls);
-  }
-
-  /**
-   * Deserialize java object from binary by passing class info, serialization should use {@link
-   * #deserializeJavaObjectAndClass}.
-   */
-  @Override
-  public byte[] serializeJavaObjectAndClass(Object obj) {
-    MemoryBuffer buf = getBuffer();
-    buf.writerIndex(0);
-    serializeJavaObjectAndClass(buf, obj);
-    byte[] bytes = buf.getBytes(0, buf.writerIndex());
-    resetBuffer();
-    return bytes;
-  }
-
-  /**
-   * Serialize java object with class info, deserialization should use {@link
-   * #deserializeJavaObjectAndClass}.
-   */
-  @Override
-  public void serializeJavaObjectAndClass(MemoryBuffer buffer, Object obj) {
-    try {
-      jitContext.lock();
-      if (depth > 0) {
-        throwDepthSerializationException();
-      }
-      writeRef(buffer, obj);
-    } catch (Throwable t) {
-      throw processSerializationError(t);
-    } finally {
-      resetWrite();
-      jitContext.unlock();
-    }
-  }
-
-  /**
-   * Serialize java object with class info, deserialization should use {@link
-   * #deserializeJavaObjectAndClass}.
-   */
-  @Override
-  public void serializeJavaObjectAndClass(OutputStream outputStream, Object obj) {
-    serializeToStream(outputStream, buf -> serializeJavaObjectAndClass(buf, obj));
-  }
-
-  /**
-   * Deserialize class info and java object from binary, serialization should use {@link
-   * #serializeJavaObjectAndClass}.
-   */
-  @Override
-  public Object deserializeJavaObjectAndClass(byte[] data) {
-    return deserializeJavaObjectAndClass(MemoryBuffer.fromByteArray(data));
-  }
-
-  /**
-   * Deserialize class info and java object from binary, serialization should use {@link
-   * #serializeJavaObjectAndClass}.
-   */
-  @Override
-  public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) {
-    try {
-      jitContext.lock();
-      if (depth > 0) {
-        throwDepthDeserializationException();
-      }
-      return readRef(buffer);
-    } catch (Throwable t) {
-      throw ExceptionUtils.handleReadFailed(this, t);
-    } finally {
-      resetRead();
-      jitContext.unlock();
-    }
-  }
-
-  /**
-   * Deserialize class info and java object from binary, serialization should use {@link
-   * #serializeJavaObjectAndClass}.
-   */
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyInputStream inputStream) {
-    try {
-      MemoryBuffer buf = inputStream.getBuffer();
-      return deserializeJavaObjectAndClass(buf);
-    } finally {
-      inputStream.shrinkBuffer();
+        return read;
     }
   }
 
-  /**
-   * Deserialize class info and java object from binary channel, serialization should use {@link
-   * #serializeJavaObjectAndClass}.
-   */
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyReadableChannel channel) {
-    MemoryBuffer buf = channel.getBuffer();
-    return deserializeJavaObjectAndClass(buf);
+  private void checkXlangBitmap(byte bitmap) {
+    boolean payloadCrossLanguage = (bitmap & isCrossLanguageFlag) == isCrossLanguageFlag;
+    Preconditions.checkArgument(
+        payloadCrossLanguage == crossLanguage,
+        "Serialized payload xlang flag %s does not match this Fory mode %s",
+        payloadCrossLanguage,
+        crossLanguage);
   }
 
   @Override
@@ -1387,7 +1039,7 @@ public final class Fory implements BaseFory {
       return null;
     }
     Object copy;
-    TypeInfo typeInfo = classResolver.getOrUpdateTypeInfo(obj.getClass());
+    TypeInfo typeInfo = typeResolver.getTypeInfo(obj.getClass(), true);
     int typeId = typeInfo.getTypeId();
     switch (typeId) {
       case Types.BOOL:
@@ -1398,8 +1050,13 @@ public final class Fory implements BaseFory {
       case Types.FLOAT32:
       case Types.INT64:
       case Types.FLOAT64:
-      case Types.STRING:
         return obj;
+      case Types.STRING:
+        if (typeInfo.getCls() == String.class) {
+          return obj;
+        }
+        copy = copyObject(obj, typeInfo.getSerializer());
+        break;
       case ClassResolver.PRIMITIVE_BOOLEAN_ARRAY_ID:
         boolean[] boolArr = (boolean[]) obj;
         return (T) Arrays.copyOf(boolArr, boolArr.length);
@@ -1462,10 +1119,14 @@ public final class Fory implements BaseFory {
       case Types.FLOAT32:
       case Types.INT64:
       case Types.FLOAT64:
-      case Types.STRING:
         return obj;
+      case Types.STRING:
+        if (obj.getClass() == String.class) {
+          return obj;
+        }
+        return copyObject(obj, typeResolver.getTypeInfo(obj.getClass(), true).getSerializer());
       default:
-        return copyObject(obj, classResolver.getOrUpdateTypeInfo(obj.getClass()).getSerializer());
+        return copyObject(obj, typeResolver.getTypeInfo(obj.getClass(), true).getSerializer());
     }
   }
 
@@ -1541,7 +1202,7 @@ public final class Fory implements BaseFory {
 
   public void resetWrite() {
     refResolver.resetWrite();
-    classResolver.resetWrite();
+    typeResolver.resetWrite();
     metaStringResolver.resetWrite();
     serializationContext.resetWrite();
     bufferCallback = null;
@@ -1550,7 +1211,7 @@ public final class Fory implements BaseFory {
 
   public void resetRead() {
     refResolver.resetRead();
-    classResolver.resetRead();
+    typeResolver.resetRead();
     metaStringResolver.resetRead();
     serializationContext.resetRead();
     peerOutOfBandEnabled = false;
@@ -1563,7 +1224,7 @@ public final class Fory implements BaseFory {
   }
 
   private void throwDepthSerializationException() {
-    String method = "Fory#" + (crossLanguage ? "x" : "") + "writeXXX";
+    String method = "Fory#writeXXX";
     throw new SerializationException(
         String.format(
             "Nested call Fory.serializeXXX is not allowed when serializing, Please use %s instead",
@@ -1571,7 +1232,7 @@ public final class Fory implements BaseFory {
   }
 
   private void throwDepthDeserializationException() {
-    String method = "Fory#" + (crossLanguage ? "x" : "") + "readXXX";
+    String method = "Fory#readXXX";
     throw new DeserializationException(
         String.format(
             "Nested call Fory.deserializeXXX is not allowed when deserializing, Please use %s instead",
@@ -1599,14 +1260,6 @@ public final class Fory implements BaseFory {
     return refResolver;
   }
 
-  public ClassResolver getClassResolver() {
-    return classResolver;
-  }
-
-  public XtypeResolver getXtypeResolver() {
-    return xtypeResolver;
-  }
-
   /**
    * Don't use this API for type resolving and dispatch, methods on returned resolver has
    * polymorphic invoke cost.
@@ -1615,7 +1268,7 @@ public final class Fory implements BaseFory {
   // CHECKSTYLE.OFF:MethodName
   public TypeResolver getTypeResolver() {
     // CHECKSTYLE.ON:MethodName
-    return crossLanguage ? xtypeResolver : classResolver;
+    return typeResolver;
   }
 
   public MetaStringResolver getMetaStringResolver() {
diff --git a/java/fory-core/src/main/java/org/apache/fory/ThreadLocalFory.java b/java/fory-core/src/main/java/org/apache/fory/ThreadLocalFory.java
index aa82fd785..f0c43a2dd 100644
--- a/java/fory-core/src/main/java/org/apache/fory/ThreadLocalFory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/ThreadLocalFory.java
@@ -145,6 +145,21 @@ public class ThreadLocalFory extends AbstractThreadSafeFory {
     return bindingThreadLocal.get().get().deserialize(bytes, type);
   }
 
+  @Override
+  public <T> T deserialize(MemoryBuffer buffer, Class<T> type) {
+    return bindingThreadLocal.get().get().deserialize(buffer, type);
+  }
+
+  @Override
+  public <T> T deserialize(ForyInputStream inputStream, Class<T> type) {
+    return bindingThreadLocal.get().get().deserialize(inputStream, type);
+  }
+
+  @Override
+  public <T> T deserialize(ForyReadableChannel channel, Class<T> type) {
+    return bindingThreadLocal.get().get().deserialize(channel, type);
+  }
+
   @Override
   public Object deserialize(byte[] bytes, Iterable<MemoryBuffer> outOfBandBuffers) {
     return bindingThreadLocal.get().get().deserialize(bytes, outOfBandBuffers);
@@ -190,76 +205,6 @@ public class ThreadLocalFory extends AbstractThreadSafeFory {
     return bindingThreadLocal.get().get().deserialize(channel, outOfBandBuffers);
   }
 
-  @Override
-  public byte[] serializeJavaObject(Object obj) {
-    return bindingThreadLocal.get().get().serializeJavaObject(obj);
-  }
-
-  @Override
-  public void serializeJavaObject(MemoryBuffer buffer, Object obj) {
-    bindingThreadLocal.get().get().serializeJavaObject(buffer, obj);
-  }
-
-  @Override
-  public void serializeJavaObject(OutputStream outputStream, Object obj) {
-    bindingThreadLocal.get().get().serializeJavaObject(outputStream, obj);
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(byte[] data, Class<T> cls) {
-    return bindingThreadLocal.get().get().deserializeJavaObject(data, cls);
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> cls) {
-    return bindingThreadLocal.get().get().deserializeJavaObject(buffer, cls);
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(ForyInputStream inputStream, Class<T> cls) {
-    return bindingThreadLocal.get().get().deserializeJavaObject(inputStream, cls);
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(ForyReadableChannel channel, Class<T> cls) {
-    return bindingThreadLocal.get().get().deserializeJavaObject(channel, cls);
-  }
-
-  @Override
-  public byte[] serializeJavaObjectAndClass(Object obj) {
-    return bindingThreadLocal.get().get().serializeJavaObjectAndClass(obj);
-  }
-
-  @Override
-  public void serializeJavaObjectAndClass(MemoryBuffer buffer, Object obj) {
-    bindingThreadLocal.get().get().serializeJavaObjectAndClass(buffer, obj);
-  }
-
-  @Override
-  public void serializeJavaObjectAndClass(OutputStream outputStream, Object obj) {
-    bindingThreadLocal.get().get().serializeJavaObjectAndClass(outputStream, obj);
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(byte[] data) {
-    return bindingThreadLocal.get().get().deserializeJavaObjectAndClass(data);
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) {
-    return bindingThreadLocal.get().get().deserializeJavaObjectAndClass(buffer);
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyInputStream inputStream) {
-    return bindingThreadLocal.get().get().deserializeJavaObjectAndClass(inputStream);
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyReadableChannel channel) {
-    return bindingThreadLocal.get().get().deserializeJavaObjectAndClass(channel);
-  }
-
   @Override
   public <T> T copy(T obj) {
     return bindingThreadLocal.get().get().copy(obj);
diff --git a/java/fory-core/src/main/java/org/apache/fory/ThreadSafeFory.java b/java/fory-core/src/main/java/org/apache/fory/ThreadSafeFory.java
index 16c8d8126..68b37495e 100644
--- a/java/fory-core/src/main/java/org/apache/fory/ThreadSafeFory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/ThreadSafeFory.java
@@ -23,7 +23,6 @@ import java.nio.ByteBuffer;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import org.apache.fory.annotation.Internal;
-import org.apache.fory.resolver.ClassChecker;
 import org.apache.fory.resolver.TypeChecker;
 import org.apache.fory.serializer.SerializerFactory;
 import org.apache.fory.util.LoaderBinding;
@@ -68,18 +67,10 @@ public interface ThreadSafeFory extends BaseFory {
   /** Returns classLoader of serializer for current thread. */
   ClassLoader getClassLoader();
 
-  /**
-   * Set ClassChecker of serializer for current thread only.
-   *
-   * @param classChecker {@link ClassChecker} for classChecker
-   */
-  @Deprecated
-  void setClassChecker(ClassChecker classChecker);
-
   /**
    * Set TypeChecker of serializer for current thread only.
    *
-   * @param typeChecker {@link TypeChecker} for classChecker
+   * @param typeChecker {@link TypeChecker} for type checking
    */
   void setTypeChecker(TypeChecker typeChecker);
 
diff --git a/java/fory-core/src/main/java/org/apache/fory/builder/CodecUtils.java b/java/fory-core/src/main/java/org/apache/fory/builder/CodecUtils.java
index 5bce2db3b..eeb582fb2 100644
--- a/java/fory-core/src/main/java/org/apache/fory/builder/CodecUtils.java
+++ b/java/fory-core/src/main/java/org/apache/fory/builder/CodecUtils.java
@@ -28,7 +28,7 @@ import org.apache.fory.codegen.CompileUnit;
 import org.apache.fory.collection.Tuple3;
 import org.apache.fory.meta.TypeDef;
 import org.apache.fory.reflect.TypeRef;
-import org.apache.fory.resolver.ClassResolver;
+import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.Serializer;
 import org.apache.fory.util.ClassLoaderUtils;
 import org.apache.fory.util.GraalvmSupport;
@@ -107,8 +107,8 @@ public class CodecUtils {
     if (beanClassClassLoader == null) {
       beanClassClassLoader = fory.getClass().getClassLoader();
     }
-    ClassResolver classResolver = fory.getClassResolver();
-    codeGenerator = getCodeGenerator(fory, beanClassClassLoader, classResolver);
+    TypeResolver typeResolver = fory.getTypeResolver();
+    codeGenerator = getCodeGenerator(fory, beanClassClassLoader, typeResolver);
     ClassLoader classLoader =
         codeGenerator.compile(
             Collections.singletonList(compileUnit), compileState -> compileState.lock.lock());
@@ -121,23 +121,23 @@ public class CodecUtils {
   }
 
   private static CodeGenerator getCodeGenerator(
-      Fory fory, ClassLoader beanClassClassLoader, ClassResolver classResolver) {
+      Fory fory, ClassLoader beanClassClassLoader, TypeResolver typeResolver) {
     CodeGenerator codeGenerator;
     try {
       // generated code imported fory classes.
       if (beanClassClassLoader.loadClass(Fory.class.getName()) != Fory.class) {
         throw new ClassNotFoundException();
       }
-      codeGenerator = classResolver.getCodeGenerator(beanClassClassLoader);
+      codeGenerator = typeResolver.getCodeGenerator(beanClassClassLoader);
       if (codeGenerator == null) {
         codeGenerator = CodeGenerator.getSharedCodeGenerator(beanClassClassLoader);
         // Hold strong reference of {@link CodeGenerator}, so the referent of `DelayedRef`
         // won't be null.
-        classResolver.setCodeGenerator(beanClassClassLoader, codeGenerator);
+        typeResolver.setCodeGenerator(beanClassClassLoader, codeGenerator);
       }
     } catch (ClassNotFoundException e) {
       codeGenerator =
-          classResolver.getCodeGenerator(beanClassClassLoader, fory.getClass().getClassLoader());
+          typeResolver.getCodeGenerator(beanClassClassLoader, fory.getClass().getClassLoader());
       ClassLoader[] loaders = {beanClassClassLoader, fory.getClass().getClassLoader()};
       if (codeGenerator == null) {
         codeGenerator =
@@ -145,7 +145,7 @@ public class CodecUtils {
                 ClassLoaderUtils.ForyJarClassLoader.getInstance(), beanClassClassLoader);
         // Hold strong reference of {@link CodeGenerator}, so the referent of `DelayedRef`
         // won't be null.
-        classResolver.setCodeGenerator(loaders, codeGenerator);
+        typeResolver.setCodeGenerator(loaders, codeGenerator);
       }
     }
     return codeGenerator;
diff --git a/java/fory-core/src/main/java/org/apache/fory/builder/Generated.java b/java/fory-core/src/main/java/org/apache/fory/builder/Generated.java
index 740eaed84..c86ed020f 100644
--- a/java/fory-core/src/main/java/org/apache/fory/builder/Generated.java
+++ b/java/fory-core/src/main/java/org/apache/fory/builder/Generated.java
@@ -73,7 +73,7 @@ public interface Generated {
                     @Override
                     public void onNotifyResult(Object result) {
                       Serializer<?> fieldSerializer =
-                          fory.getClassResolver().getSerializer(beanFieldType);
+                          fory.getTypeResolver().getSerializer(beanFieldType);
                       Preconditions.checkState(beanFieldType == fieldSerializer.getType());
                       Preconditions.checkState(result == fieldSerializer.getClass());
                       ReflectionUtils.setObjectFieldValue(
@@ -83,7 +83,7 @@ public interface Generated {
                     @Override
                     public void onNotifyMissed() {
                       Serializer<?> fieldSerializer =
-                          fory.getClassResolver().getSerializer(beanFieldType);
+                          fory.getTypeResolver().getSerializer(beanFieldType);
                       ReflectionUtils.setObjectFieldValue(
                           subclassSerializer, field, fieldSerializer);
                     }
diff --git a/java/fory-core/src/main/java/org/apache/fory/builder/ObjectCodecBuilder.java b/java/fory-core/src/main/java/org/apache/fory/builder/ObjectCodecBuilder.java
index f511cb87a..a1dca86d3 100644
--- a/java/fory-core/src/main/java/org/apache/fory/builder/ObjectCodecBuilder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/builder/ObjectCodecBuilder.java
@@ -97,7 +97,7 @@ public class ObjectCodecBuilder extends BaseObjectCodecBuilder {
       descriptors =
           fory(
               f ->
-                  f.getClassResolver()
+                  f.getTypeResolver()
                       .getTypeDef(beanClass, true)
                       .getDescriptors(SerializationUtils.getTypeResolver(fory), beanClass));
     } else {
diff --git a/java/fory-core/src/main/java/org/apache/fory/io/BlockedStreamUtils.java b/java/fory-core/src/main/java/org/apache/fory/io/BlockedStreamUtils.java
index 784b1a599..62cbffbcc 100644
--- a/java/fory-core/src/main/java/org/apache/fory/io/BlockedStreamUtils.java
+++ b/java/fory-core/src/main/java/org/apache/fory/io/BlockedStreamUtils.java
@@ -55,16 +55,8 @@ public class BlockedStreamUtils {
     serializeToStream(fory, outputStream, buf -> fory.serialize(buf, obj, callback));
   }
 
-  /**
-   * Serialize java object without class info, deserialization should use {@link
-   * #deserializeJavaObject}.
-   */
-  public static void serializeJavaObject(Fory fory, OutputStream outputStream, Object obj) {
-    serializeToStream(fory, outputStream, buf -> fory.serializeJavaObject(buf, obj));
-  }
-
   public static Object deserialize(Fory fory, InputStream inputStream) {
-    return deserialize(fory, inputStream, null);
+    return deserialize(fory, inputStream, (Iterable<MemoryBuffer>) null);
   }
 
   public static Object deserialize(
@@ -73,7 +65,7 @@ public class BlockedStreamUtils {
   }
 
   public static Object deserialize(Fory fory, ReadableByteChannel channel) {
-    return readFromChannel(fory, channel, b -> fory.deserialize(b, null));
+    return readFromChannel(fory, channel, b -> fory.deserialize(b, (Iterable<MemoryBuffer>) null));
   }
 
   public static Object deserialize(
@@ -82,14 +74,12 @@ public class BlockedStreamUtils {
   }
 
   @SuppressWarnings("unchecked")
-  public static <T> T deserializeJavaObject(Fory fory, InputStream inputStream, Class<T> type) {
-    return (T)
-        deserializeFromStream(fory, inputStream, buf -> fory.deserializeJavaObject(buf, type));
+  public static <T> T deserialize(Fory fory, InputStream inputStream, Class<T> type) {
+    return (T) deserializeFromStream(fory, inputStream, buf -> fory.deserialize(buf, type));
   }
 
-  public static Object deserializeJavaObject(
-      Fory fory, ReadableByteChannel channel, Class<?> type) {
-    return readFromChannel(fory, channel, b -> fory.deserializeJavaObject(b, type));
+  public static <T> T deserialize(Fory fory, ReadableByteChannel channel, Class<T> type) {
+    return type.cast(readFromChannel(fory, channel, b -> fory.deserialize(b, type)));
   }
 
   private static Object readFromChannel(
diff --git a/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefEncoder.java b/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefEncoder.java
index 2933488b6..943d7729b 100644
--- a/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefEncoder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefEncoder.java
@@ -75,9 +75,9 @@ public class NativeTypeDefEncoder {
 
   static List<Field> buildFields(Fory fory, Class<?> cls, boolean resolveParent) {
     DescriptorGrouper descriptorGrouper =
-        fory.getClassResolver()
+        fory.getTypeResolver()
             .createDescriptorGrouper(
-                fory.getClassResolver().getFieldDescriptors(cls, resolveParent),
+                fory.getTypeResolver().getFieldDescriptors(cls, resolveParent),
                 false,
                 Function.identity());
     List<Field> fields = new ArrayList<>();
diff --git a/java/fory-core/src/main/java/org/apache/fory/meta/TypeDef.java b/java/fory-core/src/main/java/org/apache/fory/meta/TypeDef.java
index fdf2b9a80..637ffeba2 100644
--- a/java/fory-core/src/main/java/org/apache/fory/meta/TypeDef.java
+++ b/java/fory-core/src/main/java/org/apache/fory/meta/TypeDef.java
@@ -43,6 +43,7 @@ import org.apache.fory.memory.Platform;
 import org.apache.fory.reflect.ReflectionUtils;
 import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.resolver.TypeResolver;
+import org.apache.fory.resolver.XtypeResolver;
 import org.apache.fory.serializer.MetaSharedSerializer;
 import org.apache.fory.type.Descriptor;
 import org.apache.fory.type.Types;
@@ -347,17 +348,20 @@ public class TypeDef implements Serializable {
   /** Read class definition from buffer. */
   public static TypeDef readTypeDef(Fory fory, MemoryBuffer buffer) {
     if (fory.isCrossLanguage()) {
-      return TypeDefDecoder.decodeTypeDef(fory.getXtypeResolver(), buffer, buffer.readInt64());
+      return TypeDefDecoder.decodeTypeDef(
+          (XtypeResolver) fory.getTypeResolver(), buffer, buffer.readInt64());
     }
-    return NativeTypeDefDecoder.decodeTypeDef(fory.getClassResolver(), buffer, buffer.readInt64());
+    return NativeTypeDefDecoder.decodeTypeDef(
+        (ClassResolver) fory.getTypeResolver(), buffer, buffer.readInt64());
   }
 
   /** Read class definition from buffer. */
   public static TypeDef readTypeDef(Fory fory, MemoryBuffer buffer, long header) {
     if (fory.isCrossLanguage()) {
-      return TypeDefDecoder.decodeTypeDef(fory.getXtypeResolver(), buffer, header);
+      return TypeDefDecoder.decodeTypeDef((XtypeResolver) fory.getTypeResolver(), buffer, header);
     }
-    return NativeTypeDefDecoder.decodeTypeDef(fory.getClassResolver(), buffer, header);
+    return NativeTypeDefDecoder.decodeTypeDef(
+        (ClassResolver) fory.getTypeResolver(), buffer, header);
   }
 
   /**
@@ -432,7 +436,7 @@ public class TypeDef implements Serializable {
       return TypeDefEncoder.buildTypeDef(fory, cls);
     }
     return NativeTypeDefEncoder.buildTypeDef(
-        fory.getClassResolver(), cls, buildFields(fory, cls, resolveParent), true);
+        (ClassResolver) fory.getTypeResolver(), cls, buildFields(fory, cls, resolveParent), true);
   }
 
   /** Build class definition from fields of class. */
@@ -460,7 +464,7 @@ public class TypeDef implements Serializable {
             .collect(Collectors.toList());
     if (resolver.getFory().isCrossLanguage()) {
       return TypeDefEncoder.buildTypeDefWithFieldInfos(
-          (org.apache.fory.resolver.XtypeResolver) resolver, targetCls, fieldInfos);
+          (XtypeResolver) resolver, targetCls, fieldInfos);
     }
     return NativeTypeDefEncoder.buildTypeDefWithFieldInfos(
         (ClassResolver) resolver, targetCls, fieldInfos, hasFieldsMeta);
diff --git a/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefEncoder.java b/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefEncoder.java
index 594501b9c..7f474b0dd 100644
--- a/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefEncoder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefEncoder.java
@@ -61,13 +61,11 @@ class TypeDefEncoder {
 
   /** Build class definition from fields of class. */
   static TypeDef buildTypeDef(Fory fory, Class<?> type) {
+    XtypeResolver resolver = (XtypeResolver) fory.getTypeResolver();
     DescriptorGrouper descriptorGrouper =
-        fory.getXtypeResolver()
-            .createDescriptorGrouper(
-                fory.getXtypeResolver().getFieldDescriptors(type, true),
-                false,
-                Function.identity());
-    TypeInfo typeInfo = fory.getTypeResolver().getTypeInfo(type);
+        resolver.createDescriptorGrouper(
+            resolver.getFieldDescriptors(type, true), false, Function.identity());
+    TypeInfo typeInfo = resolver.getTypeInfo(type);
     List<Field> fields;
     int typeId = typeInfo.getTypeId();
     if (Types.isStructType(typeId)) {
@@ -78,8 +76,7 @@ class TypeDefEncoder {
     } else {
       fields = new ArrayList<>();
     }
-    return buildTypeDefWithFieldInfos(
-        fory.getXtypeResolver(), type, buildFieldsInfo(fory.getXtypeResolver(), type, fields));
+    return buildTypeDefWithFieldInfos(resolver, type, buildFieldsInfo(resolver, type, fields));
   }
 
   static List<FieldInfo> buildFieldsInfo(TypeResolver resolver, Class<?> type, List<Field> fields) {
@@ -162,18 +159,11 @@ class TypeDefEncoder {
     buffer.putByte(0, currentClassHeader);
     writeFieldsInfo(resolver, buffer, fields);
 
-    byte[] compressed =
-        resolver
-            .getFory()
-            .getMetaCompressor()
-            .compress(buffer.getHeapMemory(), 0, buffer.writerIndex());
-    boolean isCompressed = false;
-    if (compressed.length < buffer.writerIndex()) {
-      isCompressed = true;
-      buffer = MemoryBuffer.fromByteArray(compressed);
-      buffer.writerIndex(compressed.length);
-    }
-    return prependHeader(buffer, isCompressed, !fields.isEmpty());
+    // Temporary xlang behavior: always write TypeMeta uncompressed.
+    // Some runtimes still don't support TypeMeta decompression, so we must avoid emitting
+    // compressed xlang TypeMeta until all xlang implementations support decompress.
+    // Note: native mode is unchanged and still uses NativeTypeDefEncoder compression flow.
+    return prependHeader(buffer, false, !fields.isEmpty());
   }
 
   static Map<String, FieldInfo> getClassFields(Class<?> type, List<FieldInfo> fieldsInfo) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/pool/SimpleForyPool.java b/java/fory-core/src/main/java/org/apache/fory/pool/SimpleForyPool.java
index 5740e3a13..0fdb8be76 100644
--- a/java/fory-core/src/main/java/org/apache/fory/pool/SimpleForyPool.java
+++ b/java/fory-core/src/main/java/org/apache/fory/pool/SimpleForyPool.java
@@ -156,6 +156,21 @@ public class SimpleForyPool extends AbstractThreadSafeFory {
     return execute(fory -> fory.deserialize(bytes, type));
   }
 
+  @Override
+  public <T> T deserialize(MemoryBuffer buffer, Class<T> type) {
+    return execute(fory -> fory.deserialize(buffer, type));
+  }
+
+  @Override
+  public <T> T deserialize(ForyInputStream inputStream, Class<T> type) {
+    return execute(fory -> fory.deserialize(inputStream, type));
+  }
+
+  @Override
+  public <T> T deserialize(ForyReadableChannel channel, Class<T> type) {
+    return execute(fory -> fory.deserialize(channel, type));
+  }
+
   @Override
   public Object deserialize(byte[] bytes, Iterable<MemoryBuffer> outOfBandBuffers) {
     return execute(fory -> fory.deserialize(bytes, outOfBandBuffers));
@@ -196,92 +211,6 @@ public class SimpleForyPool extends AbstractThreadSafeFory {
     return execute(fory -> fory.deserialize(channel, outOfBandBuffers));
   }
 
-  @Override
-  public byte[] serializeJavaObject(Object obj) {
-    return execute(fory -> fory.serializeJavaObject(obj));
-  }
-
-  @Override
-  public void serializeJavaObject(MemoryBuffer buffer, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObject(buffer, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public void serializeJavaObject(OutputStream outputStream, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObject(outputStream, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(byte[] data, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(data, cls));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(buffer, cls));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(ForyInputStream inputStream, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(inputStream, cls));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(ForyReadableChannel channel, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(channel, cls));
-  }
-
-  @Override
-  public byte[] serializeJavaObjectAndClass(Object obj) {
-    return execute(fory -> fory.serializeJavaObjectAndClass(obj));
-  }
-
-  @Override
-  public void serializeJavaObjectAndClass(MemoryBuffer buffer, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObjectAndClass(buffer, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public void serializeJavaObjectAndClass(OutputStream outputStream, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObjectAndClass(outputStream, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(byte[] data) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(data));
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(buffer));
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyInputStream inputStream) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(inputStream));
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyReadableChannel channel) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(channel));
-  }
-
   @Override
   public <T> T copy(T obj) {
     return execute(fory -> fory.copy(obj));
diff --git a/java/fory-core/src/main/java/org/apache/fory/pool/ThreadPoolFory.java b/java/fory-core/src/main/java/org/apache/fory/pool/ThreadPoolFory.java
index d7017d762..cbef00055 100644
--- a/java/fory-core/src/main/java/org/apache/fory/pool/ThreadPoolFory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/pool/ThreadPoolFory.java
@@ -145,6 +145,21 @@ public class ThreadPoolFory extends AbstractThreadSafeFory {
     return execute(fory -> fory.deserialize(bytes, type));
   }
 
+  @Override
+  public <T> T deserialize(MemoryBuffer buffer, Class<T> type) {
+    return execute(fory -> fory.deserialize(buffer, type));
+  }
+
+  @Override
+  public <T> T deserialize(ForyInputStream inputStream, Class<T> type) {
+    return execute(fory -> fory.deserialize(inputStream, type));
+  }
+
+  @Override
+  public <T> T deserialize(ForyReadableChannel channel, Class<T> type) {
+    return execute(fory -> fory.deserialize(channel, type));
+  }
+
   @Override
   public Object deserialize(byte[] bytes, Iterable<MemoryBuffer> outOfBandBuffers) {
     return execute(fory -> fory.deserialize(bytes, outOfBandBuffers));
@@ -190,92 +205,6 @@ public class ThreadPoolFory extends AbstractThreadSafeFory {
     return execute(fory -> fory.deserialize(channel, outOfBandBuffers));
   }
 
-  @Override
-  public byte[] serializeJavaObject(Object obj) {
-    return execute(fory -> fory.serializeJavaObject(obj));
-  }
-
-  @Override
-  public void serializeJavaObject(MemoryBuffer buffer, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObject(buffer, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public void serializeJavaObject(OutputStream outputStream, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObject(outputStream, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(byte[] data, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(data, cls));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(MemoryBuffer buffer, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(buffer, cls));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(ForyInputStream inputStream, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(inputStream, cls));
-  }
-
-  @Override
-  public <T> T deserializeJavaObject(ForyReadableChannel channel, Class<T> cls) {
-    return execute(fory -> fory.deserializeJavaObject(channel, cls));
-  }
-
-  @Override
-  public byte[] serializeJavaObjectAndClass(Object obj) {
-    return execute(fory -> fory.serializeJavaObjectAndClass(obj));
-  }
-
-  @Override
-  public void serializeJavaObjectAndClass(MemoryBuffer buffer, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObjectAndClass(buffer, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public void serializeJavaObjectAndClass(OutputStream outputStream, Object obj) {
-    execute(
-        fory -> {
-          fory.serializeJavaObjectAndClass(outputStream, obj);
-          return null;
-        });
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(byte[] data) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(data));
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(MemoryBuffer buffer) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(buffer));
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyInputStream inputStream) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(inputStream));
-  }
-
-  @Override
-  public Object deserializeJavaObjectAndClass(ForyReadableChannel channel) {
-    return execute(fory -> fory.deserializeJavaObjectAndClass(channel));
-  }
-
   @Override
   public <T> T copy(T obj) {
     return execute(fory -> fory.copy(obj));
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassChecker.java b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassChecker.java
deleted file mode 100644
index 5ac38118f..000000000
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassChecker.java
+++ /dev/null
@@ -1,36 +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 org.apache.fory.resolver;
-
-/**
- * Check whether class or objects of class should be serialized. If class checker will be invoked by
- * multiple {@link ClassResolver}, class checker should be thread safe.
- */
-@Deprecated
-public interface ClassChecker {
-  /**
-   * Check whether class should be allowed for serialization.
-   *
-   * @param classResolver class resolver
-   * @param className full name of class
-   * @return true if class is allowed for serialization.
-   */
-  boolean checkClass(ClassResolver classResolver, String className);
-}
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
index e29ba82fb..82fb027df 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
@@ -44,10 +44,8 @@ import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.EnumSet;
@@ -79,7 +77,6 @@ import org.apache.fory.annotation.CodegenInvoke;
 import org.apache.fory.annotation.ForyField;
 import org.apache.fory.annotation.Internal;
 import org.apache.fory.builder.JITContext;
-import org.apache.fory.codegen.CodeGenerator;
 import org.apache.fory.collection.BoolList;
 import org.apache.fory.collection.Float32List;
 import org.apache.fory.collection.Float64List;
@@ -1082,22 +1079,6 @@ public class ClassResolver extends TypeResolver {
     }
   }
 
-  /**
-   * Reset serializer if <code>serializer</code> is not null, otherwise clear serializer for <code>
-   * cls</code>.
-   *
-   * @see #setSerializer
-   * @see #clearSerializer
-   * @see #createSerializerSafe
-   */
-  public <T> void resetSerializer(Class<T> cls, Serializer<T> serializer) {
-    if (serializer == null) {
-      clearSerializer(cls);
-    } else {
-      setSerializer(cls, serializer);
-    }
-  }
-
   /**
    * Set serializer to avoid circular error when there is a serializer query for fields by {@link
    * #readSharedClassMeta} and {@link #getSerializer(Class)} which access current creating
@@ -1407,20 +1388,6 @@ public class ClassResolver extends TypeResolver {
     }
   }
 
-  @Deprecated
-  public void setClassChecker(ClassChecker classChecker) {
-    extRegistry.typeChecker =
-        (resolver, className) -> {
-          if (resolver instanceof ClassResolver) {
-            return classChecker.checkClass((ClassResolver) resolver, className);
-          }
-          return false;
-        };
-    if (classChecker instanceof AllowListChecker) {
-      ((AllowListChecker) classChecker).addListener(this);
-    }
-  }
-
   // Invoked by fory JIT.
   @Override
   public TypeInfo getTypeInfo(Class<?> cls) {
@@ -1508,7 +1475,7 @@ public class ClassResolver extends TypeResolver {
   }
 
   public <T> Serializer<T> createSerializerSafe(Class<T> cls, Supplier<Serializer<T>> func) {
-    Serializer serializer = fory.getClassResolver().getSerializer(cls, false);
+    Serializer serializer = getSerializer(cls, false);
     try {
       return func.get();
     } catch (Throwable t) {
@@ -1907,20 +1874,6 @@ public class ClassResolver extends TypeResolver {
     return classId >= PRIMITIVE_VOID_ID && classId <= PRIMITIVE_FLOAT64_ID;
   }
 
-  public CodeGenerator getCodeGenerator(ClassLoader... loaders) {
-    List<ClassLoader> loaderList = new ArrayList<>(loaders.length);
-    Collections.addAll(loaderList, loaders);
-    return extRegistry.codeGeneratorMap.get(loaderList);
-  }
-
-  public void setCodeGenerator(ClassLoader loader, CodeGenerator codeGenerator) {
-    setCodeGenerator(new ClassLoader[] {loader}, codeGenerator);
-  }
-
-  public void setCodeGenerator(ClassLoader[] loaders, CodeGenerator codeGenerator) {
-    extRegistry.codeGeneratorMap.put(Arrays.asList(loaders), codeGenerator);
-  }
-
   /**
    * Normalize type name for consistent ordering between serialization and deserialization.
    * Collection subtypes (List, Set, etc.) are normalized to "java.util.Collection". Map subtypes
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
index 1aacf976d..1d367c2cf 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
@@ -29,6 +29,7 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Member;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -1004,6 +1005,20 @@ public abstract class TypeResolver {
 
   public abstract <T> void setSerializerIfAbsent(Class<T> cls, Serializer<T> serializer);
 
+  /**
+   * Reset serializer if {@code serializer} is not null, otherwise clear serializer for {@code cls}.
+   */
+  public <T> void resetSerializer(Class<T> cls, Serializer<T> serializer) {
+    if (serializer == null) {
+      TypeInfo typeInfo = getTypeInfo(cls, false);
+      if (typeInfo != null) {
+        typeInfo.setSerializer(this, null);
+      }
+    } else {
+      setSerializer(cls, serializer);
+    }
+  }
+
   public final TypeInfo getTypeInfoByTypeId(int typeId) {
     if (Types.isUserDefinedType((byte) typeId)) {
       throw new IllegalArgumentException(
@@ -1428,6 +1443,30 @@ public abstract class TypeResolver {
     extRegistry.typeChecker = typeChecker;
   }
 
+  public void setSerializerFactory(SerializerFactory serializerFactory) {
+    extRegistry.serializerFactory = serializerFactory;
+  }
+
+  public CodeGenerator getCodeGenerator(ClassLoader... loaders) {
+    return extRegistry.codeGeneratorMap.get(Arrays.asList(loaders));
+  }
+
+  public void setCodeGenerator(ClassLoader loader, CodeGenerator codeGenerator) {
+    setCodeGenerator(new ClassLoader[] {loader}, codeGenerator);
+  }
+
+  public void setCodeGenerator(ClassLoader[] loaders, CodeGenerator codeGenerator) {
+    extRegistry.codeGeneratorMap.put(Arrays.asList(loaders), codeGenerator);
+  }
+
+  public SerializerFactory getSerializerFactory() {
+    return extRegistry.serializerFactory;
+  }
+
+  public void resetRead() {}
+
+  public void resetWrite() {}
+
   // CHECKSTYLE.OFF:MethodName
   public static void _addGraalvmClassRegistry(int foryConfigHash, ClassResolver classResolver) {
     // CHECKSTYLE.ON:MethodName
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java
index 76d0366b4..0ca109846 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java
@@ -116,6 +116,7 @@ import org.apache.fory.type.Types;
 import org.apache.fory.type.union.Union;
 import org.apache.fory.type.unsigned.Uint16;
 import org.apache.fory.type.unsigned.Uint32;
+import org.apache.fory.type.unsigned.Uint64;
 import org.apache.fory.type.unsigned.Uint8;
 import org.apache.fory.util.GraalvmSupport;
 import org.apache.fory.util.Preconditions;
@@ -157,6 +158,9 @@ public class XtypeResolver extends TypeResolver {
   @Override
   public void initialize() {
     registerDefaultTypes();
+    // Keep xlang default internal serializers aligned with previous bootstrap behavior.
+    // Before resolver unification, these were registered through ClassResolver initialization.
+    Serializers.registerDefaultSerializers(fory);
     if (shareMeta) {
       Serializer serializer = new UnknownStructSerializer(fory, null);
       register(UnknownStruct.class, serializer, "", "unknown_struct", Types.COMPATIBLE_STRUCT, -1);
@@ -443,15 +447,10 @@ public class XtypeResolver extends TypeResolver {
     int oldTypeId = typeInfo.typeId;
     int foryId = oldTypeId;
 
-    if (foryId != Types.EXT && foryId != Types.NAMED_EXT) {
-      if (foryId == Types.STRUCT || foryId == Types.COMPATIBLE_STRUCT) {
-        foryId = Types.EXT;
-      } else if (foryId == Types.NAMED_STRUCT || foryId == Types.NAMED_COMPATIBLE_STRUCT) {
-        foryId = Types.NAMED_EXT;
-      } else {
-        throw new IllegalArgumentException(
-            String.format("Can't register serializer for type %s with id %s", type, oldTypeId));
-      }
+    if (foryId == Types.STRUCT || foryId == Types.COMPATIBLE_STRUCT) {
+      foryId = Types.EXT;
+    } else if (foryId == Types.NAMED_STRUCT || foryId == Types.NAMED_COMPATIBLE_STRUCT) {
+      foryId = Types.NAMED_EXT;
     }
     typeInfo = typeInfo.copy(foryId);
     typeInfo.serializer = serializer;
@@ -819,6 +818,7 @@ public class XtypeResolver extends TypeResolver {
     registerType(
         Types.VARINT32, AtomicInteger.class, new Serializers.AtomicIntegerSerializer(fory));
     registerType(Types.UINT32, Uint32.class, new UnsignedSerializers.Uint32Serializer(fory));
+    registerType(Types.UINT64, Uint64.class, new UnsignedSerializers.Uint64Serializer(fory));
 
     // Long types
     registerType(
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/AbstractObjectSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/AbstractObjectSerializer.java
index 8cf3348e0..13ae09934 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/AbstractObjectSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/AbstractObjectSerializer.java
@@ -35,7 +35,6 @@ import org.apache.fory.reflect.ObjectCreator;
 import org.apache.fory.reflect.ObjectCreators;
 import org.apache.fory.reflect.ReflectionUtils;
 import org.apache.fory.reflect.TypeRef;
-import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.resolver.RefMode;
 import org.apache.fory.resolver.RefResolver;
 import org.apache.fory.resolver.TypeInfo;
@@ -56,7 +55,6 @@ import org.apache.fory.util.record.RecordUtils;
 public abstract class AbstractObjectSerializer<T> extends Serializer<T> {
   private static final Logger LOG = LoggerFactory.getLogger(AbstractObjectSerializer.class);
   protected final RefResolver refResolver;
-  protected final ClassResolver classResolver;
   protected final TypeResolver typeResolver;
   protected final boolean isRecord;
   protected final ObjectCreator<T> objectCreator;
@@ -70,7 +68,6 @@ public abstract class AbstractObjectSerializer<T> extends Serializer<T> {
   public AbstractObjectSerializer(Fory fory, Class<T> type, ObjectCreator<T> objectCreator) {
     super(fory, type);
     this.refResolver = fory.getRefResolver();
-    this.classResolver = fory.getClassResolver();
     this.typeResolver = fory.getTypeResolver();
     this.isRecord = RecordUtils.isRecord(type);
     this.objectCreator = objectCreator;
@@ -1181,7 +1178,7 @@ public abstract class AbstractObjectSerializer<T> extends Serializer<T> {
       }
     }
     DescriptorGrouper descriptorGrouper =
-        fory.getClassResolver().createDescriptorGrouper(descriptors, false);
+        fory.getTypeResolver().createDescriptorGrouper(descriptors, false);
     FieldGroups fieldGroups = FieldGroups.buildFieldInfos(fory, descriptorGrouper);
     fieldInfos = fieldGroups.allFields;
     if (isRecord) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java
index 2d49ef8b4..0df826a8a 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java
@@ -51,7 +51,10 @@ public class ArraySerializers {
 
     public ObjectArraySerializer(Fory fory, Class<T[]> cls) {
       super(fory, cls);
-      fory.getClassResolver().setSerializer(cls, this);
+      TypeResolver resolver = fory.getTypeResolver();
+      if (resolver instanceof ClassResolver) {
+        ((ClassResolver) resolver).setSerializer(cls, this);
+      }
       Preconditions.checkArgument(cls.isArray());
       Class<?> t = cls;
       Class<?> innerType = cls;
@@ -65,19 +68,19 @@ public class ArraySerializers {
       }
       this.innerType = (Class<T>) innerType;
       Class<?> componentType = cls.getComponentType();
-      componentGenericType = fory.getClassResolver().buildGenericType(componentType);
-      if (fory.getClassResolver().isMonomorphic(componentType)) {
+      componentGenericType = fory.getTypeResolver().buildGenericType(componentType);
+      if (fory.getTypeResolver().isMonomorphic(componentType)) {
         if (fory.isCrossLanguage()) {
           this.componentTypeSerializer = null;
         } else {
-          this.componentTypeSerializer = fory.getClassResolver().getSerializer(componentType);
+          this.componentTypeSerializer = fory.getTypeResolver().getSerializer(componentType);
         }
       } else {
         // TODO add TypeInfo cache for non-final component type.
         this.componentTypeSerializer = null;
       }
       this.stubDims = new int[dimension];
-      classInfoHolder = fory.getClassResolver().nilTypeInfoHolder();
+      classInfoHolder = fory.getTypeResolver().nilTypeInfoHolder();
     }
 
     @Override
@@ -105,7 +108,7 @@ public class ArraySerializers {
         }
       } else {
         Fory fory = this.fory;
-        ClassResolver classResolver = fory.getClassResolver();
+        ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
         TypeInfo typeInfo = null;
         Class<?> elemClass = null;
         for (T t : arr) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java
index e10116c4c..af8126786 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/CodegenSerializer.java
@@ -86,7 +86,7 @@ public final class CodegenSerializer {
     @SuppressWarnings({"rawtypes"})
     private Serializer<T> getOrCreateGeneratedSerializer() {
       if (serializer == null) {
-        Serializer<T> jitSerializer = fory.getClassResolver().getSerializer(type);
+        Serializer<T> jitSerializer = fory.getTypeResolver().getSerializer(type);
         // Just be defensive for `getSerializer`/other call in Codec Builder to make
         // LazyInitBeanSerializer as serializer for `type`.
         if (jitSerializer instanceof LazyInitBeanSerializer) {
@@ -94,23 +94,22 @@ public final class CodegenSerializer {
           if (interpreterSerializer != null) {
             return interpreterSerializer;
           }
-          fory.getClassResolver().getTypeInfo(type).setSerializer(null);
+          fory.getTypeResolver().getTypeInfo(type).setSerializer(null);
           if (fory.getConfig().isAsyncCompilationEnabled()) {
             // jit not finished, avoid recursive call current serializer.
-            Class<? extends Serializer> sc =
-                fory.getClassResolver().getSerializerClass(type, false);
-            fory.getClassResolver().getTypeInfo(type).setSerializer(this);
+            Class<? extends Serializer> sc = fory.getTypeResolver().getSerializerClass(type, false);
+            fory.getTypeResolver().getTypeInfo(type).setSerializer(this);
             return interpreterSerializer = Serializers.newSerializer(fory, type, sc);
           } else {
-            Class<? extends Serializer> sc = fory.getClassResolver().getSerializerClass(type);
-            fory.getClassResolver().getTypeInfo(type).setSerializer(this);
+            Class<? extends Serializer> sc = fory.getTypeResolver().getSerializerClass(type);
+            fory.getTypeResolver().getTypeInfo(type).setSerializer(this);
             checkArgument(
                 Generated.GeneratedSerializer.class.isAssignableFrom(sc),
                 "Expect jit serializer but got %s for class %s",
                 sc,
                 type);
             serializer = Serializers.newSerializer(fory, type, sc);
-            fory.getClassResolver().setSerializer(type, serializer);
+            fory.getTypeResolver().setSerializer(type, serializer);
             return serializer;
           }
         } else {
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/FieldGroups.java b/java/fory-core/src/main/java/org/apache/fory/serializer/FieldGroups.java
index 9726c0ea6..44329547a 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/FieldGroups.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/FieldGroups.java
@@ -75,7 +75,7 @@ public class FieldGroups {
       }
     }
     DescriptorGrouper descriptorGrouper =
-        fory.getClassResolver().createDescriptorGrouper(descriptors, false);
+        fory.getTypeResolver().createDescriptorGrouper(descriptors, false);
     return buildFieldInfos(fory, descriptorGrouper);
   }
 
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/LambdaSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/LambdaSerializer.java
index efa80b772..bae24def6 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/LambdaSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/LambdaSerializer.java
@@ -30,6 +30,7 @@ import org.apache.fory.collection.ClassValueCache;
 import org.apache.fory.exception.ForyException;
 import org.apache.fory.memory.MemoryBuffer;
 import org.apache.fory.reflect.ReflectionUtils;
+import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.util.Preconditions;
 import org.apache.fory.util.function.SerializableFunction;
 import org.apache.fory.util.unsafe._JDKAccess;
@@ -151,11 +152,11 @@ public class LambdaSerializer extends Serializer {
                     () -> CodegenSerializer.loadCodegenSerializer(fory, SERIALIZED_LAMBDA),
                     c -> {
                       this.dataSerializer = Serializers.newSerializer(fory, SERIALIZED_LAMBDA, c);
-                      fory.getClassResolver().clearSerializer(SERIALIZED_LAMBDA);
+                      ((ClassResolver) fory.getTypeResolver()).clearSerializer(SERIALIZED_LAMBDA);
                     });
       }
       this.dataSerializer = dataSerializer = Serializers.newSerializer(fory, SERIALIZED_LAMBDA, sc);
-      fory.getClassResolver().clearSerializer(SERIALIZED_LAMBDA);
+      ((ClassResolver) fory.getTypeResolver()).clearSerializer(SERIALIZED_LAMBDA);
     }
     return dataSerializer;
   }
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/LazySerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/LazySerializer.java
index 5dff1f763..60626a983 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/LazySerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/LazySerializer.java
@@ -37,9 +37,9 @@ public class LazySerializer extends Serializer {
   public void write(MemoryBuffer buffer, Object value) {
     if (serializer == null) {
       serializer = serializerSupplier.get();
-      fory.getClassResolver().setSerializer(value.getClass(), serializer);
+      fory.getTypeResolver().setSerializer(value.getClass(), serializer);
       if (!isJava) {
-        fory.getXtypeResolver().getTypeInfo(value.getClass()).setSerializer(serializer);
+        fory.getTypeResolver().getTypeInfo(value.getClass()).setSerializer(serializer);
       }
     }
     serializer.write(buffer, value);
@@ -53,9 +53,9 @@ public class LazySerializer extends Serializer {
     }
     Object value = serializer.read(buffer);
     if (unInit) {
-      fory.getClassResolver().setSerializer(value.getClass(), serializer);
+      fory.getTypeResolver().setSerializer(value.getClass(), serializer);
       if (!isJava) {
-        fory.getXtypeResolver().getTypeInfo(value.getClass()).setSerializer(serializer);
+        fory.getTypeResolver().getTypeInfo(value.getClass()).setSerializer(serializer);
       }
     }
     return value;
@@ -65,7 +65,7 @@ public class LazySerializer extends Serializer {
   public Object copy(Object value) {
     if (serializer == null) {
       serializer = serializerSupplier.get();
-      fory.getClassResolver().setSerializer(value.getClass(), serializer);
+      fory.getTypeResolver().setSerializer(value.getClass(), serializer);
     }
     return serializer.copy(value);
   }
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/MetaSharedSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/MetaSharedSerializer.java
index a1b2d1d42..a0292a5ce 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/MetaSharedSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/MetaSharedSerializer.java
@@ -33,6 +33,7 @@ import org.apache.fory.memory.MemoryBuffer;
 import org.apache.fory.memory.Platform;
 import org.apache.fory.meta.TypeDef;
 import org.apache.fory.reflect.FieldAccessor;
+import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.resolver.MapRefResolver;
 import org.apache.fory.resolver.RefResolver;
 import org.apache.fory.resolver.TypeResolver;
@@ -150,7 +151,8 @@ public class MetaSharedSerializer<T> extends AbstractObjectSerializer<T> {
     if (serializer == null) {
       // xlang mode will register class and create serializer in advance, it won't go to here.
       serializer =
-          this.classResolver.createSerializerSafe(type, () -> new ObjectSerializer<>(fory, type));
+          ((ClassResolver) typeResolver)
+              .createSerializerSafe(type, () -> new ObjectSerializer<>(fory, type));
     }
     serializer.write(buffer, value);
   }
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectSerializer.java
index 19719c6b6..b95c2f7b8 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectSerializer.java
@@ -77,13 +77,13 @@ public final class ObjectSerializer<T> extends AbstractObjectSerializer<T> {
 
   public ObjectSerializer(Fory fory, Class<T> cls, boolean resolveParent) {
     super(fory, cls);
+    typeResolver = fory.getTypeResolver();
     // avoid recursive building serializers.
     // Use `setSerializerIfAbsent` to avoid overwriting existing serializer for class when used
     // as data serializer.
     if (resolveParent) {
-      classResolver.setSerializerIfAbsent(cls, this);
+      typeResolver.setSerializerIfAbsent(cls, this);
     }
-    typeResolver = fory.getTypeResolver();
     Collection<Descriptor> descriptors;
     boolean shareMeta = fory.getConfig().isMetaShareEnabled();
     if (shareMeta) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectStreamSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectStreamSerializer.java
index a8a9aae28..687ff068b 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectStreamSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/ObjectStreamSerializer.java
@@ -59,6 +59,7 @@ import org.apache.fory.meta.TypeDef;
 import org.apache.fory.reflect.ObjectCreator;
 import org.apache.fory.reflect.ObjectCreators;
 import org.apache.fory.reflect.ReflectionUtils;
+import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.resolver.MetaContext;
 import org.apache.fory.resolver.TypeInfo;
 import org.apache.fory.type.Descriptor;
@@ -176,7 +177,7 @@ public class ObjectStreamSerializer extends AbstractObjectSerializer {
           Externalizable.class.getName());
     }
     // stream serializer may be data serializer of ReplaceResolver serializer.
-    fory.getClassResolver().setSerializerIfAbsent(type, this);
+    fory.getTypeResolver().setSerializerIfAbsent(type, this);
     List<SlotInfo> slotsInfoList = new ArrayList<>();
     Class<?> end = type;
     // locate closest non-serializable superclass
@@ -209,6 +210,7 @@ public class ObjectStreamSerializer extends AbstractObjectSerializer {
   public void write(MemoryBuffer buffer, Object value) {
     buffer.writeInt16((short) slotsInfos.length);
     try {
+      ClassResolver classResolver = (ClassResolver) typeResolver;
       for (SlotInfo slotsInfo : slotsInfos) {
         // create a classinfo to avoid null class bytes when class id is a
         // replacement id.
@@ -260,6 +262,7 @@ public class ObjectStreamSerializer extends AbstractObjectSerializer {
     int slotIndex = 0;
 
     try {
+      ClassResolver classResolver = (ClassResolver) typeResolver;
       TreeMap<Integer, ObjectInputValidation> callbacks = new TreeMap<>(Collections.reverseOrder());
       for (int i = 0; i < numClasses; i++) {
         Class<?> currentClass = classResolver.readClassInternal(buffer);
@@ -458,13 +461,13 @@ public class ObjectStreamSerializer extends AbstractObjectSerializer {
    */
   private static void ensureFieldSerializersGenerated(
       Fory fory, TypeDef layerTypeDef, Class<?> type) {
-    Collection<Descriptor> descriptors = layerTypeDef.getDescriptors(fory.getClassResolver(), type);
+    Collection<Descriptor> descriptors = layerTypeDef.getDescriptors(fory.getTypeResolver(), type);
     for (Descriptor descriptor : descriptors) {
       Class<?> fieldType = descriptor.getRawType();
       if (fieldType != null && !fieldType.isPrimitive()) {
         try {
           // Trigger serializer generation for this field type
-          fory.getClassResolver().getSerializerClass(fieldType);
+          fory.getTypeResolver().getSerializerClass(fieldType);
         } catch (Exception e) {
           // Ignore errors - some types may not need serializers or may be handled specially
           ExceptionUtils.ignore(e);
@@ -520,9 +523,10 @@ public class ObjectStreamSerializer extends AbstractObjectSerializer {
     }
 
     // For registered types
-    if (fory.getClassResolver().isRegisteredById(fieldType)) {
-      int typeId = fory.getClassResolver().getTypeIdForTypeDef(fieldType);
-      int userTypeId = fory.getClassResolver().getUserTypeIdForTypeDef(fieldType);
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
+    if (classResolver.isRegisteredById(fieldType)) {
+      int typeId = classResolver.getTypeIdForTypeDef(fieldType);
+      int userTypeId = classResolver.getUserTypeIdForTypeDef(fieldType);
       return new FieldTypes.RegisteredFieldType(true, true, typeId, userTypeId);
     }
 
@@ -632,10 +636,10 @@ public class ObjectStreamSerializer extends AbstractObjectSerializer {
             buildFieldInfoFromObjectStreamClass(fory, objectStreamClass, type);
         layerTypeDef =
             NativeTypeDefEncoder.buildTypeDefWithFieldInfos(
-                fory.getClassResolver(), type, fieldInfos, true);
+                (ClassResolver) fory.getTypeResolver(), type, fieldInfos, true);
       } else {
         // Fallback when ObjectStreamClass is not available (e.g., GraalVM native image)
-        layerTypeDef = fory.getClassResolver().getTypeDef(type, false);
+        layerTypeDef = fory.getTypeResolver().getTypeDef(type, false);
       }
       // Generate marker class for this layer. Use 0 as layer index since each class
       // has its own SlotsInfo, and the (class, 0) pair is unique for each class.
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/ReplaceResolveSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/ReplaceResolveSerializer.java
index e9b6f9f43..228cb40ba 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/ReplaceResolveSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/ReplaceResolveSerializer.java
@@ -185,7 +185,7 @@ public class ReplaceResolveSerializer extends Serializer {
     } else if (JavaSerializer.getReadObjectMethod(cls, true) == null
         && JavaSerializer.getWriteObjectMethod(cls, true) == null) {
       serializerClass =
-          fory.getClassResolver()
+          ((ClassResolver) fory.getTypeResolver())
               .getObjectSerializerClass(
                   cls,
                   sc -> methodInfoCache.setObjectSerializer(createDataSerializer(fory, cls, sc)));
@@ -204,9 +204,10 @@ public class ReplaceResolveSerializer extends Serializer {
    */
   private static Serializer createDataSerializer(
       Fory fory, Class<?> cls, Class<? extends Serializer> sc) {
-    Serializer prev = fory.getClassResolver().getSerializer(cls, false);
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
+    Serializer prev = classResolver.getSerializer(cls, false);
     Serializer serializer = Serializers.newSerializer(fory, cls, sc);
-    fory.getClassResolver().resetSerializer(cls, prev);
+    classResolver.resetSerializer(cls, prev);
     return serializer;
   }
 
@@ -224,7 +225,7 @@ public class ReplaceResolveSerializer extends Serializer {
       Fory fory, Class type, boolean isFinalField, boolean setSerializer) {
     super(fory, type);
     refResolver = fory.getRefResolver();
-    classResolver = fory.getClassResolver();
+    classResolver = (ClassResolver) fory.getTypeResolver();
     if (setSerializer) {
       // `setSerializer` before `newJDKMethodInfoCache` since it query classinfo from
       // `classResolver`,
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/SerializationUtils.java b/java/fory-core/src/main/java/org/apache/fory/serializer/SerializationUtils.java
index ec2bad055..fb65abbe0 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/SerializationUtils.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/SerializationUtils.java
@@ -31,7 +31,7 @@ import org.apache.fory.serializer.collection.MapSerializer;
 @Internal
 public class SerializationUtils {
   public static TypeResolver getTypeResolver(Fory fory) {
-    return fory.isCrossLanguage() ? fory.getXtypeResolver() : fory.getClassResolver();
+    return fory.isCrossLanguage() ? fory.getTypeResolver() : fory.getTypeResolver();
   }
 
   public static TypeInfo getTypeInfo(Fory fory, Class<?> cls) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/Serializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/Serializers.java
index b13d087f5..17c9a85a4 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/Serializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/Serializers.java
@@ -49,6 +49,8 @@ import org.apache.fory.memory.MemoryBuffer;
 import org.apache.fory.memory.Platform;
 import org.apache.fory.meta.TypeDef;
 import org.apache.fory.reflect.ReflectionUtils;
+import org.apache.fory.resolver.ClassResolver;
+import org.apache.fory.resolver.TypeInfo;
 import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.util.ExceptionUtils;
 import org.apache.fory.util.GraalvmSupport;
@@ -81,13 +83,15 @@ public class Serializers {
    */
   public static <T> Serializer<T> newSerializer(
       Fory fory, Class type, Class<? extends Serializer> serializerClass) {
-    Serializer serializer = fory.getClassResolver().getSerializer(type, false);
+    TypeResolver typeResolver = fory.getTypeResolver();
+    TypeInfo typeInfo = typeResolver.getTypeInfo(type, false);
+    Serializer serializer = typeInfo == null ? null : typeInfo.getSerializer();
     try {
       if (serializerClass == ObjectSerializer.class) {
         return new ObjectSerializer(fory, type);
       }
       if (serializerClass == MetaSharedSerializer.class) {
-        TypeDef typeDef = fory.getClassResolver().getTypeDef(type, true);
+        TypeDef typeDef = typeResolver.getTypeDef(type, true);
         return new MetaSharedSerializer(fory, type, typeDef);
       }
       Tuple2<MethodType, MethodHandle> ctrInfo = CTR_MAP.getIfPresent(serializerClass);
@@ -112,7 +116,7 @@ public class Serializers {
         return createSerializer(fory, type, serializerClass);
       }
     } catch (InvocationTargetException e) {
-      fory.getClassResolver().resetSerializer(type, serializer);
+      typeResolver.resetSerializer(type, serializer);
       if (e.getCause() != null) {
         Platform.throwException(e.getCause());
       } else {
@@ -122,7 +126,7 @@ public class Serializers {
       // Some serializer may set itself in constructor as serializer, but the
       // constructor failed later. For example, some final type field doesn't
       // support serialization.
-      fory.getClassResolver().resetSerializer(type, serializer);
+      typeResolver.resetSerializer(type, serializer);
       Platform.throwException(t);
     }
     throw new IllegalStateException("unreachable");
@@ -520,12 +524,12 @@ public class Serializers {
 
     @Override
     public void write(MemoryBuffer buffer, Class value) {
-      fory.getClassResolver().writeClassInternal(buffer, value);
+      ((ClassResolver) fory.getTypeResolver()).writeClassInternal(buffer, value);
     }
 
     @Override
     public Class read(MemoryBuffer buffer) {
-      return fory.getClassResolver().readClassInternal(buffer);
+      return ((ClassResolver) fory.getTypeResolver()).readClassInternal(buffer);
     }
   }
 
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java
index 72dbfd701..0ed308f81 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java
@@ -210,7 +210,7 @@ public final class UnknownClassSerializers {
             MetaSharedSerializer.consolidateFields(
                 resolver, UnknownClass.UnknownEmptyStruct.class, typeDef);
         DescriptorGrouper grouper =
-            fory.getClassResolver().createDescriptorGrouper(descriptors, false);
+            fory.getTypeResolver().createDescriptorGrouper(descriptors, false);
         FieldGroups fieldGroups = FieldGroups.buildFieldInfos(fory, grouper);
         int classVersionHash = 0;
         if (fory.checkClassVersion()) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/ChildContainerSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/ChildContainerSerializers.java
index 837873fd6..011508219 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/ChildContainerSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/ChildContainerSerializers.java
@@ -238,7 +238,7 @@ public class ChildContainerSerializers {
     while (!superClasses.contains(cls)) {
       Serializer slotsSerializer;
       if (fory.getConfig().getCompatibleMode() == CompatibleMode.COMPATIBLE) {
-        TypeDef layerTypeDef = fory.getClassResolver().getTypeDef(cls, false);
+        TypeDef layerTypeDef = fory.getTypeResolver().getTypeDef(cls, false);
         // Use layer index within class hierarchy (not global counter)
         // This ensures unique marker classes for each layer
         Class<?> layerMarkerClass = LayerMarkerClassGenerator.getOrCreate(fory, cls, layerIndex);
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionLikeSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionLikeSerializer.java
index cee78a163..974b85358 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionLikeSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionLikeSerializer.java
@@ -62,7 +62,7 @@ public abstract class CollectionLikeSerializer<T> extends Serializer<T> {
   public CollectionLikeSerializer(Fory fory, Class<T> cls, boolean supportCodegenHook) {
     super(fory, cls);
     this.supportCodegenHook = supportCodegenHook;
-    elementTypeInfoHolder = fory.getClassResolver().nilTypeInfoHolder();
+    elementTypeInfoHolder = fory.getTypeResolver().nilTypeInfoHolder();
     this.typeResolver = fory.getTypeResolver();
   }
 
@@ -70,7 +70,7 @@ public abstract class CollectionLikeSerializer<T> extends Serializer<T> {
       Fory fory, Class<T> cls, boolean supportCodegenHook, boolean immutable) {
     super(fory, cls, immutable);
     this.supportCodegenHook = supportCodegenHook;
-    elementTypeInfoHolder = fory.getClassResolver().nilTypeInfoHolder();
+    elementTypeInfoHolder = fory.getTypeResolver().nilTypeInfoHolder();
     this.typeResolver = fory.getTypeResolver();
   }
 
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
index 3dc68ac7e..b4bd9897f 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
@@ -512,7 +512,7 @@ public class CollectionSerializers {
 
     @Override
     public Collection newCollection(MemoryBuffer buffer) {
-      final TypeInfo mapTypeInfo = fory.getClassResolver().readTypeInfo(buffer);
+      final TypeInfo mapTypeInfo = fory.getTypeResolver().readTypeInfo(buffer);
       final MapLikeSerializer mapSerializer = (MapLikeSerializer) mapTypeInfo.getSerializer();
       RefResolver refResolver = fory.getRefResolver();
       // It's possible that elements or nested fields has circular ref to set.
@@ -543,7 +543,7 @@ public class CollectionSerializers {
       Map<?, Boolean> map =
           (Map<?, Boolean>) Platform.getObject(originCollection, MAP_FIELD_OFFSET);
       MapLikeSerializer mapSerializer =
-          (MapLikeSerializer) fory.getClassResolver().getSerializer(map.getClass());
+          (MapLikeSerializer) fory.getTypeResolver().getSerializer(map.getClass());
       Map newMap = mapSerializer.newMap(map);
       return Collections.newSetFromMap(newMap);
     }
@@ -551,9 +551,9 @@ public class CollectionSerializers {
     @Override
     public Collection onCollectionWrite(MemoryBuffer buffer, Set<?> value) {
       final Map<?, Boolean> map = (Map<?, Boolean>) Platform.getObject(value, MAP_FIELD_OFFSET);
-      final TypeInfo typeInfo = fory.getClassResolver().getTypeInfo(map.getClass());
+      final TypeInfo typeInfo = fory.getTypeResolver().getTypeInfo(map.getClass());
       MapLikeSerializer mapSerializer = (MapLikeSerializer) typeInfo.getSerializer();
-      fory.getClassResolver().writeTypeInfo(buffer, typeInfo);
+      fory.getTypeResolver().writeTypeInfo(buffer, typeInfo);
       if (mapSerializer.supportCodegenHook) {
         buffer.writeBoolean(true);
         mapSerializer.onMapWrite(buffer, map);
@@ -574,8 +574,8 @@ public class CollectionSerializers {
     public ConcurrentHashMapKeySetViewSerializer(
         Fory fory, Class<ConcurrentHashMap.KeySetView> type) {
       super(fory, type, false);
-      mapTypeInfoHolder = fory.getClassResolver().nilTypeInfoHolder();
-      valueTypeInfoHolder = fory.getClassResolver().nilTypeInfoHolder();
+      mapTypeInfoHolder = fory.getTypeResolver().nilTypeInfoHolder();
+      valueTypeInfoHolder = fory.getTypeResolver().nilTypeInfoHolder();
     }
 
     @Override
@@ -658,8 +658,8 @@ public class CollectionSerializers {
       if (!elemClass.isEnum()) {
         elemClass = elemClass.getEnclosingClass();
       }
-      fory.getClassResolver().writeClassAndUpdateCache(buffer, elemClass);
-      Serializer serializer = fory.getClassResolver().getSerializer(elemClass);
+      ((ClassResolver) fory.getTypeResolver()).writeClassAndUpdateCache(buffer, elemClass);
+      Serializer serializer = fory.getTypeResolver().getSerializer(elemClass);
       buffer.writeVarUint32Small7(object.size());
       for (Object element : object) {
         serializer.write(buffer, element);
@@ -668,9 +668,9 @@ public class CollectionSerializers {
 
     @Override
     public EnumSet read(MemoryBuffer buffer) {
-      Class elemClass = fory.getClassResolver().readTypeInfo(buffer).getCls();
+      Class elemClass = fory.getTypeResolver().readTypeInfo(buffer).getCls();
       EnumSet object = EnumSet.noneOf(elemClass);
-      Serializer elemSerializer = fory.getClassResolver().getSerializer(elemClass);
+      Serializer elemSerializer = fory.getTypeResolver().getSerializer(elemClass);
       int length = buffer.readVarUint32Small7();
       for (int i = 0; i < length; i++) {
         object.add(elemSerializer.read(buffer));
@@ -869,14 +869,14 @@ public class CollectionSerializers {
           !fory.isCrossLanguage(),
           "Fory cross-language default collection serializer should use "
               + CollectionSerializer.class);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
       Class<? extends Serializer> serializerClass =
-          fory.getClassResolver()
+          ((ClassResolver) fory.getTypeResolver())
               .getObjectSerializerClass(
                   cls, sc -> dataSerializer = Serializers.newSerializer(fory, cls, sc));
       dataSerializer = Serializers.newSerializer(fory, cls, serializerClass);
       // No need to set object serializer to this, it will be set in class resolver later.
-      // fory.getClassResolver().setSerializer(cls, this);
+      // fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/GuavaCollectionSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/GuavaCollectionSerializers.java
index 1a0800b52..2f12fd8a1 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/GuavaCollectionSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/GuavaCollectionSerializers.java
@@ -47,7 +47,7 @@ public class GuavaCollectionSerializers {
       extends CollectionSerializer<T> {
     public GuavaCollectionSerializer(Fory fory, Class<T> cls) {
       super(fory, cls, true);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     protected abstract T xnewInstance(Collection collection);
@@ -57,7 +57,7 @@ public class GuavaCollectionSerializers {
       extends GuavaCollectionSerializer<T> {
     public ImmutableListSerializer(Fory fory, Class<T> cls) {
       super(fory, cls);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
@@ -176,7 +176,7 @@ public class GuavaCollectionSerializers {
       extends CollectionSerializer<T> {
     public ImmutableSortedSetSerializer(Fory fory, Class<T> cls) {
       super(fory, cls, false);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
@@ -214,7 +214,7 @@ public class GuavaCollectionSerializers {
 
     public GuavaMapSerializer(Fory fory, Class<T> cls) {
       super(fory, cls, true);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     protected abstract ImmutableMap.Builder makeBuilder(int size);
@@ -290,7 +290,7 @@ public class GuavaCollectionSerializers {
     public ImmutableMapSerializer(Fory fory, Class<T> cls) {
       super(fory, cls);
       builderCtr = builderCtrCache.get(ImmutableMap.Builder.class);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
@@ -311,7 +311,7 @@ public class GuavaCollectionSerializers {
     public ImmutableBiMapSerializer(Fory fory, Class<T> cls) {
       super(fory, cls);
       builderCtr = builderCtrCache.get(ImmutableBiMap.Builder.class);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
@@ -330,7 +330,7 @@ public class GuavaCollectionSerializers {
 
     public ImmutableSortedMapSerializer(Fory fory, Class<T> cls) {
       super(fory, cls);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/MapSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/MapSerializers.java
index aa80d00c6..6a09b0bb4 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/MapSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/MapSerializers.java
@@ -336,14 +336,14 @@ public class MapSerializers {
     public Map onMapWrite(MemoryBuffer buffer, EnumMap value) {
       buffer.writeVarUint32Small7(value.size());
       Class keyType = (Class) Platform.getObject(value, keyTypeFieldOffset);
-      fory.getClassResolver().writeClassAndUpdateCache(buffer, keyType);
+      ((ClassResolver) fory.getTypeResolver()).writeClassAndUpdateCache(buffer, keyType);
       return value;
     }
 
     @Override
     public EnumMap newMap(MemoryBuffer buffer) {
       setNumElements(buffer.readVarUint32Small7());
-      Class<?> keyType = fory.getClassResolver().readTypeInfo(buffer).getCls();
+      Class<?> keyType = fory.getTypeResolver().readTypeInfo(buffer).getCls();
       return new EnumMap(keyType);
     }
 
@@ -361,7 +361,7 @@ public class MapSerializers {
 
     @Override
     protected <K, V> void copyEntry(Map<K, V> originMap, Map<K, V> newMap) {
-      ClassResolver classResolver = fory.getClassResolver();
+      ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
       for (Entry<K, V> entry : originMap.entrySet()) {
         V value = entry.getValue();
         if (value != null) {
@@ -388,14 +388,14 @@ public class MapSerializers {
       Preconditions.checkArgument(
           !fory.isCrossLanguage(),
           "Fory cross-language default map serializer should use " + MapSerializer.class);
-      fory.getClassResolver().setSerializer(cls, this);
+      fory.getTypeResolver().setSerializer(cls, this);
       Class<? extends Serializer> serializerClass =
-          fory.getClassResolver()
+          ((ClassResolver) fory.getTypeResolver())
               .getObjectSerializerClass(
                   cls, sc -> dataSerializer = Serializers.newSerializer(fory, cls, sc));
       dataSerializer = Serializers.newSerializer(fory, cls, serializerClass);
       // No need to set object serializer to this, it will be set in class resolver later.
-      // fory.getClassResolver().setSerializer(cls, this);
+      // fory.getTypeResolver().setSerializer(cls, this);
     }
 
     @Override
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/SubListSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/SubListSerializers.java
index 98efa1839..fb2c2c173 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/SubListSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/SubListSerializers.java
@@ -148,7 +148,7 @@ public class SubListSerializers {
 
     public SubListSerializer(Fory fory, Class<List> type) {
       super(fory, type, true);
-      fory.getClassResolver().setSerializer(type, this);
+      fory.getTypeResolver().setSerializer(type, this);
     }
 
     @Override
diff --git a/java/fory-core/src/main/java/org/apache/fory/type/unsigned/UnsignedSerializers.java b/java/fory-core/src/main/java/org/apache/fory/type/unsigned/UnsignedSerializers.java
index 215f4d06f..5c8b2a509 100644
--- a/java/fory-core/src/main/java/org/apache/fory/type/unsigned/UnsignedSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/type/unsigned/UnsignedSerializers.java
@@ -28,10 +28,10 @@ public class UnsignedSerializers {
 
   /** Register all Uint wrapper type serializers. */
   public static void registerSerializers(Fory fory) {
-    fory.getClassResolver().registerSerializer(Uint8.class, new Uint8Serializer(fory));
-    fory.getClassResolver().registerSerializer(Uint16.class, new Uint16Serializer(fory));
-    fory.getClassResolver().registerSerializer(Uint32.class, new Uint32Serializer(fory));
-    fory.getClassResolver().registerSerializer(Uint64.class, new Uint64Serializer(fory));
+    fory.getTypeResolver().registerSerializer(Uint8.class, new Uint8Serializer(fory));
+    fory.getTypeResolver().registerSerializer(Uint16.class, new Uint16Serializer(fory));
+    fory.getTypeResolver().registerSerializer(Uint32.class, new Uint32Serializer(fory));
+    fory.getTypeResolver().registerSerializer(Uint64.class, new Uint64Serializer(fory));
   }
 
   /** Serializer for Uint8 wrapper type. */
diff --git a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
index 9ea34529f..11d30ef0a 100644
--- a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
+++ b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
@@ -278,7 +278,6 @@ Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
     org.apache.fory.reflect.ObjectCreators$DeclaredNoArgCtrObjectCreator,\
     org.apache.fory.reflect.ObjectCreators$ParentNoArgCtrObjectCreator,\
     org.apache.fory.reflect.ObjectCreators$RecordObjectCreator,\
-    org.apache.fory.resolver.ClassChecker,\
     org.apache.fory.resolver.TypeChecker,\
     org.apache.fory.resolver.TypeInfo,\
     org.apache.fory.resolver.TypeInfoHolder,\
diff --git a/java/fory-core/src/test/java/org/apache/fory/ForyTest.java b/java/fory-core/src/test/java/org/apache/fory/ForyTest.java
index 1211aaa98..508b00fa0 100644
--- a/java/fory-core/src/test/java/org/apache/fory/ForyTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/ForyTest.java
@@ -306,9 +306,8 @@ public class ForyTest extends ForyTestBase {
     Outer outer = new Outer();
     outer.inner = new Outer.Inner();
     fory.deserialize(fory.serialize(outer));
-    assertTrue(fory.getClassResolver().getSerializer(Outer.class) instanceof ObjectSerializer);
-    assertTrue(
-        fory.getClassResolver().getSerializer(Outer.Inner.class) instanceof ObjectSerializer);
+    assertTrue(fory.getTypeResolver().getSerializer(Outer.class) instanceof ObjectSerializer);
+    assertTrue(fory.getTypeResolver().getSerializer(Outer.Inner.class) instanceof ObjectSerializer);
   }
 
   @Test
@@ -322,8 +321,8 @@ public class ForyTest extends ForyTestBase {
     Outer outer = new Outer();
     outer.inner = new Outer.Inner();
     fory.deserialize(fory.serialize(outer));
-    assertTrue(fory.getClassResolver().getSerializer(Outer.class) instanceof Generated);
-    assertTrue(fory.getClassResolver().getSerializer(Outer.Inner.class) instanceof Generated);
+    assertTrue(fory.getTypeResolver().getSerializer(Outer.class) instanceof Generated);
+    assertTrue(fory.getTypeResolver().getSerializer(Outer.Inner.class) instanceof Generated);
   }
 
   @Data
@@ -507,7 +506,7 @@ public class ForyTest extends ForyTestBase {
     Object struct1 = Struct.createPOJO(structClass1);
     serDe(fory, struct1);
     Class<? extends Serializer> serializerClass =
-        fory.getClassResolver().getSerializerClass(structClass1);
+        fory.getTypeResolver().getSerializerClass(structClass1);
     assertTrue(serializerClass.getName().contains("Codec"));
     map.put(fory, true);
     System.out.println(fory.hashCode());
@@ -517,16 +516,13 @@ public class ForyTest extends ForyTestBase {
   }
 
   @Test
-  public void testSerializeJavaObject() {
+  public void testSerializeDeserializeApis() {
     Fory fory = Fory.builder().requireClassRegistration(false).withLanguage(Language.JAVA).build();
     BeanA beanA = BeanA.createBeanA(2);
-    assertEquals(fory.deserializeJavaObject(fory.serializeJavaObject(beanA), BeanA.class), beanA);
-    assertEquals(
-        fory.deserializeJavaObjectAndClass(fory.serializeJavaObjectAndClass(beanA)), beanA);
+    assertEquals(fory.deserialize(fory.serialize(beanA), BeanA.class), beanA);
+    assertEquals(fory.deserialize(fory.serialize(beanA)), beanA);
     assertEquals(
-        fory.deserializeJavaObjectAndClass(
-            MemoryBuffer.fromByteArray(fory.serializeJavaObjectAndClass(beanA))),
-        beanA);
+        fory.deserialize(MemoryBuffer.fromByteArray(fory.serialize(beanA)), BeanA.class), beanA);
   }
 
   @Data
@@ -551,6 +547,53 @@ public class ForyTest extends ForyTestBase {
     }
   }
 
+  @Data
+  @AllArgsConstructor
+  static class NestedWriteBean {
+    int value;
+  }
+
+  static class NestedWriteBeanSerializer extends Serializer<NestedWriteBean> {
+    NestedWriteBeanSerializer(Fory fory) {
+      super(fory, NestedWriteBean.class);
+    }
+
+    @Override
+    public void write(MemoryBuffer buffer, NestedWriteBean value) {
+      // Trigger nested serialization to validate the API hint message.
+      fory.serialize(value);
+    }
+
+    @Override
+    public NestedWriteBean read(MemoryBuffer buffer) {
+      return new NestedWriteBean(buffer.readInt32());
+    }
+  }
+
+  @Data
+  @AllArgsConstructor
+  static class NestedReadBean {
+    int value;
+  }
+
+  static class NestedReadBeanSerializer extends Serializer<NestedReadBean> {
+    NestedReadBeanSerializer(Fory fory) {
+      super(fory, NestedReadBean.class);
+    }
+
+    @Override
+    public void write(MemoryBuffer buffer, NestedReadBean value) {
+      buffer.writeInt32(value.value);
+    }
+
+    @Override
+    public NestedReadBean read(MemoryBuffer buffer) {
+      // Trigger nested deserialization to validate the API hint message.
+      fory.deserialize(new byte[] {1});
+      return new NestedReadBean(buffer.readInt32());
+    }
+  }
+
   @Test
   public void testRegisterPrivateSerializer() {
     Fory fory = Fory.builder().withRefTracking(true).requireClassRegistration(false).build();
@@ -560,6 +603,29 @@ public class ForyTest extends ForyTestBase {
     serDeCheckSerializer(fory, obj, "Codec");
   }
 
+  @Test
+  public void testNestedSerializeHintUsesWriteApi() {
+    Fory fory = Fory.builder().withRefTracking(true).requireClassRegistration(false).build();
+    fory.registerSerializer(NestedWriteBean.class, new NestedWriteBeanSerializer(fory));
+    SerializationException ex =
+        Assert.expectThrows(
+            SerializationException.class, () -> fory.serialize(new NestedWriteBean(1)));
+    assertTrue(ex.getMessage().contains("Fory#writeXXX"));
+    assertTrue(!ex.getMessage().contains("Fory#xwriteXXX"));
+  }
+
+  @Test
+  public void testNestedDeserializeHintUsesReadApi() {
+    Fory fory = Fory.builder().withRefTracking(true).requireClassRegistration(false).build();
+    fory.registerSerializer(NestedReadBean.class, new NestedReadBeanSerializer(fory));
+    byte[] bytes = fory.serialize(new NestedReadBean(1));
+    DeserializationException ex =
+        Assert.expectThrows(DeserializationException.class, () -> fory.deserialize(bytes));
+    String message = ex.getMessage();
+    assertTrue(message != null);
+    assertTrue(!message.contains("Fory#xreadXXX"));
+  }
+
   @Test
   public void testCircularReferenceStackOverflowMessage() {
     class A {
@@ -621,9 +687,9 @@ public class ForyTest extends ForyTestBase {
             .build();
     MetaContext metaContext = new MetaContext();
     fory.getSerializationContext().setMetaContext(metaContext);
-    byte[] bytes = fory.serializeJavaObjectAndClass(null);
+    byte[] bytes = fory.serialize(null);
     fory.getSerializationContext().setMetaContext(metaContext);
-    Object obj = fory.deserializeJavaObjectAndClass(bytes);
+    Object obj = fory.deserialize(bytes);
     assertNull(obj);
   }
 
@@ -682,18 +748,6 @@ public class ForyTest extends ForyTestBase {
     Assert.assertEquals(struct1.f2, struct2.f2);
   }
 
-  @Test
-  public void testDeserializeJavaObjectWrongType() {
-    Fory fory = Fory.builder().requireClassRegistration(false).build();
-    Struct1 struct1 = new Struct1(10, "abc");
-    byte[] bytes = fory.serializeJavaObject(struct1);
-    // first deserialize as Struct1 (correct type)
-    Assert.assertEquals(fory.deserializeJavaObject(bytes, Struct1.class), struct1);
-    // then deserialize as Struct2 (wrong type)
-    Assert.assertThrows(
-        DeserializationException.class, () -> fory.deserializeJavaObject(bytes, Struct2.class));
-  }
-
   private Object maxDepthData() {
     List<Object> list = new ArrayList<>();
     for (int i = 0; i < 6; i++) {
diff --git a/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java b/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java
index e52063f73..fae7f1133 100644
--- a/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java
+++ b/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java
@@ -297,7 +297,7 @@ public abstract class ForyTestBase {
 
   public static <T> T serDeCheckSerializer(Fory fory, Object obj, String classRegex) {
     byte[] bytes = fory.serialize(obj);
-    String serializerName = fory.getClassResolver().getSerializerClass(obj.getClass()).getName();
+    String serializerName = fory.getTypeResolver().getSerializerClass(obj.getClass()).getName();
     Matcher matcher = Pattern.compile(classRegex).matcher(serializerName);
     Assert.assertTrue(matcher.find());
     return (T) fory.deserialize(bytes);
diff --git a/java/fory-core/src/test/java/org/apache/fory/StreamTest.java b/java/fory-core/src/test/java/org/apache/fory/StreamTest.java
index 52dcc04fd..de5334e83 100644
--- a/java/fory-core/src/test/java/org/apache/fory/StreamTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/StreamTest.java
@@ -119,13 +119,13 @@ public class StreamTest extends ForyTestBase {
     // assertEquals(fory.deserialize(bytes), new byte[1000 * 1000]);
     assertEquals(fory.deserialize(of(new ByteArrayInputStream(bytes))), new byte[1000 * 1000]);
 
-    bytes = fory.serializeJavaObject(new byte[1000 * 1000]);
+    bytes = fory.serialize(new byte[1000 * 1000]);
     checkBuffer(fory);
-    assertEquals(fory.deserializeJavaObject(bytes, byte[].class), new byte[1000 * 1000]);
+    assertEquals(fory.deserialize(bytes, byte[].class), new byte[1000 * 1000]);
 
-    bytes = fory.serializeJavaObjectAndClass(new byte[1000 * 1000]);
+    bytes = fory.serialize(new byte[1000 * 1000]);
     checkBuffer(fory);
-    assertEquals(fory.deserializeJavaObjectAndClass(bytes), new byte[1000 * 1000]);
+    assertEquals(fory.deserialize(bytes), new byte[1000 * 1000]);
 
     ByteArrayOutputStream bas = new ByteArrayOutputStream();
     fory.serialize(bas, new byte[1000 * 1000]);
@@ -135,15 +135,15 @@ public class StreamTest extends ForyTestBase {
     assertEquals(fory.deserialize(bas.toByteArray()), new byte[1000 * 1000]);
 
     bas.reset();
-    fory.serializeJavaObject(bas, new byte[1000 * 1000]);
+    fory.serialize(bas, new byte[1000 * 1000]);
     checkBuffer(fory);
-    o = fory.deserializeJavaObject(of(new ByteArrayInputStream(bas.toByteArray())), byte[].class);
+    o = fory.deserialize(of(new ByteArrayInputStream(bas.toByteArray())), byte[].class);
     assertEquals(o, new byte[1000 * 1000]);
 
     bas.reset();
-    fory.serializeJavaObjectAndClass(bas, new byte[1000 * 1000]);
+    fory.serialize(bas, new byte[1000 * 1000]);
     checkBuffer(fory);
-    o = fory.deserializeJavaObjectAndClass(of(new ByteArrayInputStream(bas.toByteArray())));
+    o = fory.deserialize(of(new ByteArrayInputStream(bas.toByteArray())));
     assertEquals(o, new byte[1000 * 1000]);
   }
 
@@ -228,57 +228,24 @@ public class StreamTest extends ForyTestBase {
   }
 
   @Test
-  public void testJavaOutputStream() throws IOException {
+  public void testOutputStreamWithType() throws IOException {
     Fory fory = Fory.builder().requireClassRegistration(false).build();
     BeanA beanA = BeanA.createBeanA(2);
-    {
-      ByteArrayOutputStream bas = new ByteArrayOutputStream();
-      fory.serializeJavaObject(bas, beanA);
-      fory.serializeJavaObject(bas, beanA);
-      bas.flush();
-      ByteArrayInputStream bis = new ByteArrayInputStream(bas.toByteArray());
-      ForyInputStream stream = of(bis);
-      MemoryBuffer buf = MemoryBuffer.fromByteArray(bas.toByteArray());
-      Object newObj = fory.deserializeJavaObject(stream, BeanA.class);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObject(buf, BeanA.class);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObject(stream, BeanA.class);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObject(buf, BeanA.class);
-      assertEquals(newObj, beanA);
-    }
-    {
-      ByteArrayOutputStream bas = new ByteArrayOutputStream();
-      fory.serializeJavaObjectAndClass(bas, beanA);
-      fory.serializeJavaObjectAndClass(bas, beanA);
-      bas.flush();
-      ByteArrayInputStream bis = new ByteArrayInputStream(bas.toByteArray());
-      ForyInputStream stream = of(bis);
-      MemoryBuffer buf = MemoryBuffer.fromByteArray(bas.toByteArray());
-      Object newObj = fory.deserializeJavaObjectAndClass(stream);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObjectAndClass(buf);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObjectAndClass(stream);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObjectAndClass(buf);
-      assertEquals(newObj, beanA);
-
-      fory = Fory.builder().requireClassRegistration(false).build();
-      // test reader buffer grow
-      bis = new ByteArrayInputStream(bas.toByteArray());
-      stream = of(bis);
-      buf = MemoryBuffer.fromByteArray(bas.toByteArray());
-      newObj = fory.deserializeJavaObjectAndClass(stream);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObjectAndClass(buf);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObjectAndClass(stream);
-      assertEquals(newObj, beanA);
-      newObj = fory.deserializeJavaObjectAndClass(buf);
-      assertEquals(newObj, beanA);
-    }
+    ByteArrayOutputStream bas = new ByteArrayOutputStream();
+    fory.serialize(bas, beanA);
+    fory.serialize(bas, beanA);
+    bas.flush();
+    ByteArrayInputStream bis = new ByteArrayInputStream(bas.toByteArray());
+    ForyInputStream stream = of(bis);
+    MemoryBuffer buf = MemoryBuffer.fromByteArray(bas.toByteArray());
+    Object newObj = fory.deserialize(stream, BeanA.class);
+    assertEquals(newObj, beanA);
+    newObj = fory.deserialize(buf, BeanA.class);
+    assertEquals(newObj, beanA);
+    newObj = fory.deserialize(stream, BeanA.class);
+    assertEquals(newObj, beanA);
+    newObj = fory.deserialize(buf, BeanA.class);
+    assertEquals(newObj, beanA);
   }
 
   @Test
@@ -301,27 +268,13 @@ public class StreamTest extends ForyTestBase {
     }
     {
       ByteArrayOutputStream bas = new ByteArrayOutputStream();
-      fory.serializeJavaObject(bas, beanA);
+      fory.serialize(bas, beanA);
 
       Path tempFile = Files.createTempFile("readable_channel_test", "data_2");
       Files.write(tempFile, bas.toByteArray());
 
       try (ForyReadableChannel channel = of(Files.newByteChannel(tempFile))) {
-        Object newObj = fory.deserializeJavaObject(channel, BeanA.class);
-        assertEquals(newObj, beanA);
-      } finally {
-        Files.delete(tempFile);
-      }
-    }
-    {
-      ByteArrayOutputStream bas = new ByteArrayOutputStream();
-      fory.serializeJavaObjectAndClass(bas, beanA);
-
-      Path tempFile = Files.createTempFile("readable_channel_test", "data_3");
-      Files.write(tempFile, bas.toByteArray());
-
-      try (ForyReadableChannel channel = of(Files.newByteChannel(tempFile))) {
-        Object newObj = fory.deserializeJavaObjectAndClass(channel);
+        Object newObj = fory.deserialize(channel, BeanA.class);
         assertEquals(newObj, beanA);
       } finally {
         Files.delete(tempFile);
diff --git a/java/fory-core/src/test/java/org/apache/fory/TestUtils.java b/java/fory-core/src/test/java/org/apache/fory/TestUtils.java
index 8f834c60d..09911cf0d 100644
--- a/java/fory-core/src/test/java/org/apache/fory/TestUtils.java
+++ b/java/fory-core/src/test/java/org/apache/fory/TestUtils.java
@@ -344,7 +344,7 @@ public class TestUtils {
    */
   public static Map<String, Object> objectToMap(Fory fory, Object obj) {
     Class<?> cls = obj.getClass();
-    TypeDef typeDef = fory.getClassResolver().getTypeDef(cls, true);
+    TypeDef typeDef = fory.getTypeResolver().getTypeDef(cls, true);
     List<Descriptor> descriptors = typeDef.getDescriptors(fory.getTypeResolver(), cls);
     Map<String, Object> result = new LinkedHashMap<>();
     for (Descriptor descriptor : descriptors) {
diff --git a/java/fory-core/src/test/java/org/apache/fory/ThreadSafeForyTest.java b/java/fory-core/src/test/java/org/apache/fory/ThreadSafeForyTest.java
index 6087745b5..17157b005 100644
--- a/java/fory-core/src/test/java/org/apache/fory/ThreadSafeForyTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/ThreadSafeForyTest.java
@@ -229,7 +229,7 @@ public class ThreadSafeForyTest extends ForyTestBase {
     byte[] bytes1 = fory.serialize(struct1);
     Assert.assertEquals(fory.deserialize(bytes1), struct1);
     Class<? extends Serializer> serializerClass1 =
-        fory.execute(f -> f.getClassResolver().getSerializerClass(structClass1));
+        fory.execute(f -> f.getTypeResolver().getSerializerClass(structClass1));
     Assert.assertTrue(serializerClass1.getName().contains("Codec"));
 
     Class<?> structClass2 = Struct.createStructClass(className, 2);
@@ -249,7 +249,7 @@ public class ThreadSafeForyTest extends ForyTestBase {
     fory.setClassLoader(structClass2.getClassLoader());
     Assert.assertEquals(fory.deserialize(bytes2), struct2);
     Class<? extends Serializer> serializerClass2 =
-        fory.execute(f -> f.getClassResolver().getSerializerClass(structClass2));
+        fory.execute(f -> f.getTypeResolver().getSerializerClass(structClass2));
     Assert.assertTrue(serializerClass2.getName().contains("Codec"));
     Assert.assertNotSame(serializerClass2, serializerClass1);
 
@@ -317,17 +317,17 @@ public class ThreadSafeForyTest extends ForyTestBase {
   }
 
   @Test
-  public void testSerializeJavaObject() {
+  public void testSerializeDeserializeWithType() {
     for (ThreadSafeFory fory :
         new ThreadSafeFory[] {
           Fory.builder().requireClassRegistration(false).buildThreadSafeFory(),
           Fory.builder().requireClassRegistration(false).buildThreadSafeForyPool(2, 2)
         }) {
-      byte[] bytes = fory.serializeJavaObject("abc");
-      Assert.assertEquals(fory.deserializeJavaObject(bytes, String.class), "abc");
+      byte[] bytes = fory.serialize("abc");
+      Assert.assertEquals(fory.deserialize(bytes, String.class), "abc");
       MemoryBuffer buffer = MemoryBuffer.newHeapBuffer(8);
-      fory.serializeJavaObject(buffer, "abc");
-      Assert.assertEquals(fory.deserializeJavaObject(buffer, String.class), "abc");
+      fory.serialize(buffer, "abc");
+      Assert.assertEquals(fory.deserialize(buffer, String.class), "abc");
     }
   }
 
@@ -370,7 +370,7 @@ public class ThreadSafeForyTest extends ForyTestBase {
     threadSafeFory.execute(
         fory -> {
           Assert.assertEquals(
-              fory.getClassResolver().getSerializer(Foo.class).getClass(), FooSerializer.class);
+              fory.getTypeResolver().getSerializer(Foo.class).getClass(), FooSerializer.class);
           return null;
         });
   }
diff --git a/java/fory-core/src/test/java/org/apache/fory/builder/CodecUtilsTest.java b/java/fory-core/src/test/java/org/apache/fory/builder/CodecUtilsTest.java
index 540b4d611..eaf0d01af 100644
--- a/java/fory-core/src/test/java/org/apache/fory/builder/CodecUtilsTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/builder/CodecUtilsTest.java
@@ -39,7 +39,7 @@ public class CodecUtilsTest {
             .withRefTracking(false)
             .requireClassRegistration(false)
             .build();
-    Class<?> seqCodecClass = fory.getClassResolver().getSerializerClass(BeanA.class);
+    Class<?> seqCodecClass = fory.getTypeResolver().getSerializerClass(BeanA.class);
     Generated.GeneratedSerializer serializer =
         seqCodecClass
             .asSubclass(Generated.GeneratedSerializer.class)
diff --git a/java/fory-core/src/test/java/org/apache/fory/builder/JITContextTest.java b/java/fory-core/src/test/java/org/apache/fory/builder/JITContextTest.java
index 8201f0ad9..fc67dd033 100644
--- a/java/fory-core/src/test/java/org/apache/fory/builder/JITContextTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/builder/JITContextTest.java
@@ -102,7 +102,7 @@ public class JITContextTest extends ForyTestBase {
   private Serializer getSerializer(Fory fory, Class<?> cls) {
     try {
       fory.getJITContext().lock();
-      Serializer<?> serializer = fory.getClassResolver().getSerializer(cls);
+      Serializer<?> serializer = fory.getTypeResolver().getSerializer(cls);
       return serializer;
     } finally {
       fory.getJITContext().unlock();
@@ -161,7 +161,7 @@ public class JITContextTest extends ForyTestBase {
     serDeCheck(fory, o);
     Class<?>[] classes = {PkgAccessLevel.class, PrivateAccessLevel.class};
     for (Class<?> cls : classes) {
-      while (!(fory.getClassResolver().getSerializer(cls) instanceof Generated)) {
+      while (!(fory.getTypeResolver().getSerializer(cls) instanceof Generated)) {
         Thread.sleep(1000);
         LOG.warn("Wait async compilation finish for {}", cls);
       }
@@ -173,7 +173,7 @@ public class JITContextTest extends ForyTestBase {
       Thread.sleep(10); // allow serializer be switched to generated version
     }
     Serializer<TestAccessLevel> serializer =
-        fory.getClassResolver().getSerializer(TestAccessLevel.class);
+        fory.getTypeResolver().getSerializer(TestAccessLevel.class);
     assertTrue(ReflectionUtils.getObjectFieldValue(serializer, "serializer") instanceof Generated);
     assertTrue(ReflectionUtils.getObjectFieldValue(serializer, "serializer1") instanceof Generated);
     serDeCheck(fory, o);
diff --git a/java/fory-core/src/test/java/org/apache/fory/builder/ObjectCodecBuilderTest.java b/java/fory-core/src/test/java/org/apache/fory/builder/ObjectCodecBuilderTest.java
index d410ac1b3..8283b1bb4 100644
--- a/java/fory-core/src/test/java/org/apache/fory/builder/ObjectCodecBuilderTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/builder/ObjectCodecBuilderTest.java
@@ -194,7 +194,7 @@ public class ObjectCodecBuilderTest extends ForyTestBase {
     Fory fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
     fory.serialize(new MethodSpiltObject());
     Assert.assertTrue(
-        fory.getClassResolver().getSerializer(MethodSpiltObject.class)
+        fory.getTypeResolver().getSerializer(MethodSpiltObject.class)
             instanceof Generated.GeneratedSerializer);
   }
 }
diff --git a/java/fory-core/src/test/java/org/apache/fory/collection/LazyMapTest.java b/java/fory-core/src/test/java/org/apache/fory/collection/LazyMapTest.java
index c840c786e..0fa4ad27c 100644
--- a/java/fory-core/src/test/java/org/apache/fory/collection/LazyMapTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/collection/LazyMapTest.java
@@ -59,7 +59,7 @@ public class LazyMapTest extends ForyTestBase {
     LazyMap<String, Integer> map1 = new LazyMap<>(new ArrayList<>(map.entrySet()));
     serDe(fory, map1);
     assertTrue(
-        fory.getClassResolver().getSerializer(LazyMap.class)
+        fory.getTypeResolver().getSerializer(LazyMap.class)
             instanceof MapSerializers.LazyMapSerializer);
   }
 }
diff --git a/java/fory-core/src/test/java/org/apache/fory/io/BlockedStreamUtilsTest.java b/java/fory-core/src/test/java/org/apache/fory/io/BlockedStreamUtilsTest.java
index f75a017d3..a65bda59e 100644
--- a/java/fory-core/src/test/java/org/apache/fory/io/BlockedStreamUtilsTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/io/BlockedStreamUtilsTest.java
@@ -37,10 +37,10 @@ public class BlockedStreamUtilsTest extends ForyTestBase {
     ByteArrayOutputStream stream = new ByteArrayOutputStream();
     Foo foo = Foo.create();
     BlockedStreamUtils.serialize(fory, stream, foo);
-    BlockedStreamUtils.serializeJavaObject(fory, stream, foo);
+    BlockedStreamUtils.serialize(fory, stream, foo);
     ByteArrayInputStream inputStream = new ByteArrayInputStream(stream.toByteArray());
     assertEquals(BlockedStreamUtils.deserialize(fory, inputStream), foo);
-    assertEquals(BlockedStreamUtils.deserializeJavaObject(fory, inputStream, Foo.class), foo);
+    assertEquals(BlockedStreamUtils.deserialize(fory, inputStream, Foo.class), foo);
   }
 
   @Test
@@ -49,11 +49,11 @@ public class BlockedStreamUtilsTest extends ForyTestBase {
     ByteArrayOutputStream stream = new ByteArrayOutputStream();
     Foo foo = Foo.create();
     BlockedStreamUtils.serialize(fory, stream, foo);
-    BlockedStreamUtils.serializeJavaObject(fory, stream, foo);
+    BlockedStreamUtils.serialize(fory, stream, foo);
     try (MemoryBufferReadableChannel channel =
         new MemoryBufferReadableChannel(MemoryBuffer.fromByteArray(stream.toByteArray()))) {
       assertEquals(BlockedStreamUtils.deserialize(fory, channel), foo);
-      assertEquals(BlockedStreamUtils.deserializeJavaObject(fory, channel, Foo.class), foo);
+      assertEquals(BlockedStreamUtils.deserialize(fory, channel, Foo.class), foo);
     }
   }
 }
diff --git a/java/fory-core/src/test/java/org/apache/fory/meta/NativeTypeDefEncoderTest.java b/java/fory-core/src/test/java/org/apache/fory/meta/NativeTypeDefEncoderTest.java
index dfae1a8f4..f87b11c8b 100644
--- a/java/fory-core/src/test/java/org/apache/fory/meta/NativeTypeDefEncoderTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/meta/NativeTypeDefEncoderTest.java
@@ -30,6 +30,7 @@ import org.apache.fory.annotation.ForyField;
 import org.apache.fory.config.CompatibleMode;
 import org.apache.fory.config.Language;
 import org.apache.fory.memory.MemoryBuffer;
+import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.test.bean.BeanA;
 import org.apache.fory.test.bean.MapFields;
 import org.apache.fory.test.bean.Struct;
@@ -42,10 +43,10 @@ public class NativeTypeDefEncoderTest {
   public void testBasicTypeDef() {
     Fory fory = Fory.builder().withMetaShare(true).build();
     Class<TypeDefTest.TestFieldsOrderClass1> type = TypeDefTest.TestFieldsOrderClass1.class;
-    List<FieldInfo> fieldsInfo = buildFieldsInfo(fory.getClassResolver(), type);
+    List<FieldInfo> fieldsInfo = buildFieldsInfo((ClassResolver) fory.getTypeResolver(), type);
     MemoryBuffer buffer =
         NativeTypeDefEncoder.encodeTypeDef(
-            fory.getClassResolver(), type, getClassFields(type, fieldsInfo), true);
+            (ClassResolver) fory.getTypeResolver(), type, getClassFields(type, fieldsInfo), true);
     TypeDef typeDef = TypeDef.readTypeDef(fory, buffer);
     Assert.assertEquals(typeDef.getClassName(), type.getName());
     Assert.assertEquals(typeDef.getFieldsInfo().size(), type.getDeclaredFields().length);
@@ -212,7 +213,9 @@ public class NativeTypeDefEncoderTest {
 
     Assert.assertThrows(
         IllegalArgumentException.class,
-        () -> buildFieldsInfo(fory.getClassResolver(), ClassWithDuplicateTagIds.class));
+        () ->
+            buildFieldsInfo(
+                (ClassResolver) fory.getTypeResolver(), ClassWithDuplicateTagIds.class));
   }
 
   @Test
@@ -221,7 +224,7 @@ public class NativeTypeDefEncoderTest {
 
     // Should not throw any exception
     List<FieldInfo> fieldsInfo =
-        buildFieldsInfo(fory.getClassResolver(), ClassWithValidTagIds.class);
+        buildFieldsInfo((ClassResolver) fory.getTypeResolver(), ClassWithValidTagIds.class);
 
     Assert.assertEquals(fieldsInfo.size(), 3);
     // Verify all fields have the correct tag IDs
@@ -236,6 +239,6 @@ public class NativeTypeDefEncoderTest {
 
     Assert.assertThrows(
         IllegalArgumentException.class,
-        () -> buildFieldsInfo(fory.getClassResolver(), ClassWithMixedFields.class));
+        () -> buildFieldsInfo((ClassResolver) fory.getTypeResolver(), ClassWithMixedFields.class));
   }
 }
diff --git a/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefEncoderTest.java b/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefEncoderTest.java
index d50c96146..855cd894b 100644
--- a/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefEncoderTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefEncoderTest.java
@@ -141,7 +141,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithDuplicateTagIds() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithDuplicateTagIds.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -158,7 +158,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithDuplicateTagIdsZero() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithDuplicateTagIdsZero.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -174,7 +174,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithValidTagIds() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithValidTagIds.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -205,7 +205,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithMixedAnnotations() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithMixedAnnotations.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -242,7 +242,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithMixedDuplicateTagIds() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithMixedDuplicateTagIds.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -261,7 +261,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithSingleField() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithSingleField.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields = Collections.singletonList(getField(ClassWithSingleField.class, "field"));
 
@@ -278,7 +278,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithNoAnnotations() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithNoAnnotations.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -301,7 +301,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithAllFieldNames() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithAllFieldNames.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -324,7 +324,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithLargeTagIds() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithLargeTagIds.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields =
         Arrays.asList(
@@ -347,7 +347,7 @@ public class TypeDefEncoderTest {
   public void testBuildFieldsInfoWithEmptyFieldList() {
     Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
     fory.register(ClassWithValidTagIds.class);
-    TypeResolver resolver = fory.getXtypeResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     List<Field> fields = Collections.emptyList();
 
@@ -357,6 +357,15 @@ public class TypeDefEncoderTest {
     Assert.assertEquals(fieldInfos.size(), 0);
   }
 
+  @Test
+  public void testXlangTypeDefIsNotCompressed() {
+    Fory fory = Fory.builder().withLanguage(Language.XLANG).withMetaShare(true).build();
+    fory.register(ClassWithNoAnnotations.class);
+
+    TypeDef typeDef = TypeDef.buildTypeDef(fory, ClassWithNoAnnotations.class);
+    Assert.assertEquals(typeDef.getId() & TypeDef.COMPRESS_META_FLAG, 0);
+  }
+
   /** Helper method to get a field from a class by name. */
   private Field getField(Class<?> clazz, String fieldName) {
     try {
diff --git a/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefTest.java b/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefTest.java
index 623c4be08..ea933b169 100644
--- a/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/meta/TypeDefTest.java
@@ -103,7 +103,7 @@ public class TypeDefTest extends ForyTestBase {
     {
       TypeDef typeDef =
           TypeDef.buildTypeDef(
-              fory.getClassResolver(),
+              (ClassResolver) fory.getTypeResolver(),
               TestFieldsOrderClass1.class,
               ImmutableList.of(TestFieldsOrderClass1.class.getDeclaredField("longField")));
       MemoryBuffer buffer = MemoryBuffer.newHeapBuffer(32);
@@ -115,7 +115,7 @@ public class TypeDefTest extends ForyTestBase {
     {
       TypeDef typeDef =
           TypeDef.buildTypeDef(
-              fory.getClassResolver(),
+              (ClassResolver) fory.getTypeResolver(),
               TestFieldsOrderClass1.class,
               ReflectionUtils.getFields(TestFieldsOrderClass1.class, true));
       assertEquals(typeDef.getClassName(), TestFieldsOrderClass1.class.getName());
@@ -131,7 +131,7 @@ public class TypeDefTest extends ForyTestBase {
     {
       TypeDef typeDef =
           TypeDef.buildTypeDef(
-              fory.getClassResolver(),
+              (ClassResolver) fory.getTypeResolver(),
               TestFieldsOrderClass2.class,
               ReflectionUtils.getFields(TestFieldsOrderClass2.class, true));
       assertEquals(typeDef.getClassName(), TestFieldsOrderClass2.class.getName());
@@ -152,7 +152,7 @@ public class TypeDefTest extends ForyTestBase {
     {
       TypeDef typeDef =
           TypeDef.buildTypeDef(
-              fory.getClassResolver(),
+              (ClassResolver) fory.getTypeResolver(),
               DuplicateFieldClass.class,
               ReflectionUtils.getFields(DuplicateFieldClass.class, true));
       assertEquals(typeDef.getClassName(), DuplicateFieldClass.class.getName());
@@ -171,7 +171,8 @@ public class TypeDefTest extends ForyTestBase {
   public void testContainerClass() {
     Fory fory = Fory.builder().withMetaShare(true).build();
     List<Field> fields = ReflectionUtils.getFields(ContainerClass.class, true);
-    TypeDef typeDef = TypeDef.buildTypeDef(fory.getClassResolver(), ContainerClass.class, fields);
+    TypeDef typeDef =
+        TypeDef.buildTypeDef((ClassResolver) fory.getTypeResolver(), ContainerClass.class, fields);
     assertEquals(typeDef.getClassName(), ContainerClass.class.getName());
     assertEquals(typeDef.getFieldsInfo().size(), fields.size());
     MemoryBuffer buffer = MemoryBuffer.newHeapBuffer(32);
@@ -192,7 +193,7 @@ public class TypeDefTest extends ForyTestBase {
   @Test
   public void testTypeExtInfo() {
     Fory fory = Fory.builder().withRefTracking(true).withMetaShare(true).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     assertTrue(
         classResolver.needToWriteRef(
             TypeRef.of(Foo.class, new TypeExtMeta(Types.STRUCT, true, true))));
@@ -243,7 +244,8 @@ public class TypeDefTest extends ForyTestBase {
     Assert.assertThrows(
         IllegalArgumentException.class,
         () ->
-            TypeDef.buildTypeDef(fory.getClassResolver(), ClassWithDuplicateTagIds.class, fields));
+            TypeDef.buildTypeDef(
+                (ClassResolver) fory.getTypeResolver(), ClassWithDuplicateTagIds.class, fields));
   }
 
   @Test
@@ -255,7 +257,9 @@ public class TypeDefTest extends ForyTestBase {
         IllegalArgumentException.class,
         () ->
             TypeDef.buildTypeDef(
-                fory.getClassResolver(), ClassWithDuplicateTagIdsMultiple.class, fields));
+                (ClassResolver) fory.getTypeResolver(),
+                ClassWithDuplicateTagIdsMultiple.class,
+                fields));
   }
 
   @Test
@@ -265,7 +269,8 @@ public class TypeDefTest extends ForyTestBase {
 
     // Should not throw any exception
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), ClassWithValidTagIds.class, fields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), ClassWithValidTagIds.class, fields);
     assertEquals(typeDef.getClassName(), ClassWithValidTagIds.class.getName());
     assertEquals(typeDef.getFieldsInfo().size(), fields.size());
   }
@@ -309,13 +314,13 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef with valid fields (no duplicates in TypeDef itself)
     List<Field> sourceFields = ReflectionUtils.getFields(ClassWithValidTagIds.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), ClassWithValidTagIds.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), ClassWithValidTagIds.class, sourceFields);
 
     // Try to get descriptors for a class that has duplicate tag IDs
     Assert.assertThrows(
         IllegalArgumentException.class,
-        () ->
-            typeDef.getDescriptors(fory.getClassResolver(), TargetClassWithDuplicateTagIds.class));
+        () -> typeDef.getDescriptors(fory.getTypeResolver(), TargetClassWithDuplicateTagIds.class));
   }
 
   @Test
@@ -325,11 +330,12 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef with tagged fields
     List<Field> sourceFields = ReflectionUtils.getFields(TargetClassWithValidTags.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), TargetClassWithValidTags.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), TargetClassWithValidTags.class, sourceFields);
 
     // Get descriptors should succeed
     List<Descriptor> descriptors =
-        typeDef.getDescriptors(fory.getClassResolver(), TargetClassWithValidTags.class);
+        typeDef.getDescriptors(fory.getTypeResolver(), TargetClassWithValidTags.class);
 
     assertEquals(descriptors.size(), 3);
   }
@@ -341,11 +347,12 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef with mixed tagged and non-tagged fields
     List<Field> sourceFields = ReflectionUtils.getFields(TargetClassWithMixedTags.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), TargetClassWithMixedTags.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), TargetClassWithMixedTags.class, sourceFields);
 
     // Get descriptors should succeed
     List<Descriptor> descriptors =
-        typeDef.getDescriptors(fory.getClassResolver(), TargetClassWithMixedTags.class);
+        typeDef.getDescriptors(fory.getTypeResolver(), TargetClassWithMixedTags.class);
 
     assertEquals(descriptors.size(), 3);
 
@@ -392,11 +399,12 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef from source class with specific tag IDs
     List<Field> sourceFields = ReflectionUtils.getFields(SourceClassWithTags.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), SourceClassWithTags.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), SourceClassWithTags.class, sourceFields);
 
     // Get descriptors for target class with different field names but same tag IDs
     List<Descriptor> descriptors =
-        typeDef.getDescriptors(fory.getClassResolver(), TargetClassWithDifferentNames.class);
+        typeDef.getDescriptors(fory.getTypeResolver(), TargetClassWithDifferentNames.class);
 
     // Should match fields by tag ID, not by name
     assertEquals(descriptors.size(), 2);
@@ -426,12 +434,13 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef with some fields
     List<Field> sourceFields = ReflectionUtils.getFields(ClassWithValidTagIds.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), ClassWithValidTagIds.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), ClassWithValidTagIds.class, sourceFields);
 
     // Try to get descriptors for a class that has duplicate tag ID 0
     Assert.assertThrows(
         IllegalArgumentException.class,
-        () -> typeDef.getDescriptors(fory.getClassResolver(), TargetClassWithZeroTagId.class));
+        () -> typeDef.getDescriptors(fory.getTypeResolver(), TargetClassWithZeroTagId.class));
   }
 
   static class EmptyClass {
@@ -444,11 +453,12 @@ public class TypeDefTest extends ForyTestBase {
 
     // Build a TypeDef with no fields
     List<Field> sourceFields = ReflectionUtils.getFields(EmptyClass.class, true);
-    TypeDef typeDef = TypeDef.buildTypeDef(fory.getClassResolver(), EmptyClass.class, sourceFields);
+    TypeDef typeDef =
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), EmptyClass.class, sourceFields);
 
     // Get descriptors should succeed and return empty list
-    List<Descriptor> descriptors =
-        typeDef.getDescriptors(fory.getClassResolver(), EmptyClass.class);
+    List<Descriptor> descriptors = typeDef.getDescriptors(fory.getTypeResolver(), EmptyClass.class);
 
     assertEquals(descriptors.size(), 0);
   }
@@ -475,11 +485,12 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef with inherited fields
     List<Field> sourceFields = ReflectionUtils.getFields(InheritedChildClass.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), InheritedChildClass.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), InheritedChildClass.class, sourceFields);
 
     // Get descriptors should succeed
     List<Descriptor> descriptors =
-        typeDef.getDescriptors(fory.getClassResolver(), InheritedChildClass.class);
+        typeDef.getDescriptors(fory.getTypeResolver(), InheritedChildClass.class);
 
     // Should have both base and child fields
     assertEquals(descriptors.size(), 2);
@@ -492,13 +503,13 @@ public class TypeDefTest extends ForyTestBase {
     // Build a TypeDef with some fields
     List<Field> sourceFields = ReflectionUtils.getFields(InheritedBaseClass.class, true);
     TypeDef typeDef =
-        TypeDef.buildTypeDef(fory.getClassResolver(), InheritedBaseClass.class, sourceFields);
+        TypeDef.buildTypeDef(
+            (ClassResolver) fory.getTypeResolver(), InheritedBaseClass.class, sourceFields);
 
     // Try to get descriptors for a class that has duplicate tag ID across inheritance
     Assert.assertThrows(
         IllegalArgumentException.class,
-        () ->
-            typeDef.getDescriptors(fory.getClassResolver(), InheritedChildWithDuplicateTag.class));
+        () -> typeDef.getDescriptors(fory.getTypeResolver(), InheritedChildWithDuplicateTag.class));
   }
 
   @Test
diff --git a/java/fory-core/src/test/java/org/apache/fory/resolver/AllowListCheckerTest.java b/java/fory-core/src/test/java/org/apache/fory/resolver/AllowListCheckerTest.java
index 28289d104..b50be81e4 100644
--- a/java/fory-core/src/test/java/org/apache/fory/resolver/AllowListCheckerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/resolver/AllowListCheckerTest.java
@@ -34,11 +34,11 @@ public class AllowListCheckerTest {
     {
       Fory fory = Fory.builder().requireClassRegistration(false).build();
       AllowListChecker checker = new AllowListChecker(AllowListChecker.CheckLevel.STRICT);
-      fory.getClassResolver().setTypeChecker(checker);
+      fory.getTypeResolver().setTypeChecker(checker);
       assertThrows(InsecureException.class, () -> fory.serialize(new AllowListCheckerTest()));
       checker.allowClass(AllowListCheckerTest.class.getName());
       byte[] bytes = fory.serialize(new AllowListCheckerTest());
-      checker.addListener(fory.getClassResolver());
+      checker.addListener((ClassResolver) fory.getTypeResolver());
       checker.disallowClass(AllowListCheckerTest.class.getName());
       assertThrows(InsecureException.class, () -> fory.serialize(new AllowListCheckerTest()));
       assertThrows(InsecureException.class, () -> fory.deserialize(bytes));
@@ -46,8 +46,8 @@ public class AllowListCheckerTest {
     {
       Fory fory = Fory.builder().requireClassRegistration(false).build();
       AllowListChecker checker = new AllowListChecker(AllowListChecker.CheckLevel.WARN);
-      fory.getClassResolver().setTypeChecker(checker);
-      checker.addListener(fory.getClassResolver());
+      fory.getTypeResolver().setTypeChecker(checker);
+      checker.addListener((ClassResolver) fory.getTypeResolver());
       byte[] bytes = fory.serialize(new AllowListCheckerTest());
       checker.disallowClass(AllowListCheckerTest.class.getName());
       assertThrows(InsecureException.class, () -> fory.serialize(new AllowListCheckerTest()));
@@ -60,8 +60,8 @@ public class AllowListCheckerTest {
     {
       Fory fory = Fory.builder().requireClassRegistration(false).build();
       AllowListChecker checker = new AllowListChecker(AllowListChecker.CheckLevel.STRICT);
-      fory.getClassResolver().setTypeChecker(checker);
-      checker.addListener(fory.getClassResolver());
+      fory.getTypeResolver().setTypeChecker(checker);
+      checker.addListener((ClassResolver) fory.getTypeResolver());
       assertThrows(InsecureException.class, () -> fory.serialize(new AllowListCheckerTest()));
       checker.allowClass("org.apache.fory.*");
       byte[] bytes = fory.serialize(new AllowListCheckerTest());
@@ -72,8 +72,8 @@ public class AllowListCheckerTest {
     {
       Fory fory = Fory.builder().requireClassRegistration(false).build();
       AllowListChecker checker = new AllowListChecker(AllowListChecker.CheckLevel.WARN);
-      fory.getClassResolver().setTypeChecker(checker);
-      checker.addListener(fory.getClassResolver());
+      fory.getTypeResolver().setTypeChecker(checker);
+      checker.addListener((ClassResolver) fory.getTypeResolver());
       byte[] bytes = fory.serialize(new AllowListCheckerTest());
       checker.disallowClass("org.apache.fory.*");
       assertThrows(InsecureException.class, () -> fory.serialize(new AllowListCheckerTest()));
@@ -92,8 +92,8 @@ public class AllowListCheckerTest {
                       .requireClassRegistration(false)
                       .withClassLoader(classLoader)
                       .build();
-              f.getClassResolver().setTypeChecker(checker);
-              checker.addListener(f.getClassResolver());
+              f.getTypeResolver().setTypeChecker(checker);
+              checker.addListener((ClassResolver) f.getTypeResolver());
               return f;
             });
     checker.allowClass("org.apache.fory.*");
diff --git a/java/fory-core/src/test/java/org/apache/fory/resolver/ClassResolverTest.java b/java/fory-core/src/test/java/org/apache/fory/resolver/ClassResolverTest.java
index db6003c2a..18256adba 100644
--- a/java/fory-core/src/test/java/org/apache/fory/resolver/ClassResolverTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/resolver/ClassResolverTest.java
@@ -73,7 +73,7 @@ public class ClassResolverTest extends ForyTestBase {
   @Test
   public void testPrimitivesClassId() {
     Fory fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     // Test that primitive types have consecutive IDs
     List<Class<?>> primitiveClasses = TypeUtils.getSortedPrimitiveClasses();
     for (int i = 0; i < primitiveClasses.size() - 1; i++) {
@@ -95,7 +95,7 @@ public class ClassResolverTest extends ForyTestBase {
   @Test
   public void testRegisterClassByName() {
     Fory fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(true).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     classResolver.register(C1.class, "ns", "C1");
     Assert.assertThrows(
         IllegalArgumentException.class, () -> classResolver.register(C1.class, "ns", "C1"));
@@ -126,7 +126,7 @@ public class ClassResolverTest extends ForyTestBase {
   public void testRegisterClassWithUserIds() {
     // Test that user IDs 0 and 1 work correctly with separated user type IDs.
     Fory fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(true).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
 
     // Register with user ID 0
     classResolver.register(Foo.class, 0);
@@ -165,7 +165,7 @@ public class ClassResolverTest extends ForyTestBase {
       serDeCheck(fory, BeanB.class);
       Assert.assertTrue(
           Generated.GeneratedSerializer.class.isAssignableFrom(
-              fory.getClassResolver().getSerializerClass(BeanB.class)));
+              fory.getTypeResolver().getSerializerClass(BeanB.class)));
       // ensure serialize class first won't make object fail to serialize.
       serDeCheck(fory, BeanB.createBeanB(2));
     }
@@ -175,7 +175,7 @@ public class ClassResolverTest extends ForyTestBase {
       serDeCheck(fory, new Object[] {BeanB.class, BeanB.createBeanB(2)});
     }
     Fory fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     assertEquals(
         classResolver.getSerializerClass(ArrayList.class),
         CollectionSerializers.ArrayListSerializer.class);
@@ -260,7 +260,7 @@ public class ClassResolverTest extends ForyTestBase {
               .withRefTracking(true)
               .requireClassRegistration(false)
               .build();
-      ClassResolver classResolver = fory.getClassResolver();
+      ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
       MemoryBuffer buffer = MemoryUtils.buffer(32);
       classResolver.writeClassInternal(buffer, getClass());
       int writerIndex = buffer.writerIndex();
@@ -275,7 +275,7 @@ public class ClassResolverTest extends ForyTestBase {
               .withRefTracking(true)
               .requireClassRegistration(false)
               .build();
-      ClassResolver classResolver = fory.getClassResolver();
+      ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
       MemoryBuffer buffer = MemoryUtils.buffer(32);
       classResolver.writeClassAndUpdateCache(buffer, getClass());
       classResolver.writeClassAndUpdateCache(buffer, getClass());
@@ -335,7 +335,7 @@ public class ClassResolverTest extends ForyTestBase {
             .withRefTracking(true)
             .requireClassRegistration(false)
             .build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     Assert.assertFalse(
         classResolver.needToWriteRef(TypeRef.of(TestNeedToWriteReferenceClass.class)));
     assertNull(classResolver.getTypeInfo(TestNeedToWriteReferenceClass.class, false));
@@ -349,7 +349,7 @@ public class ClassResolverTest extends ForyTestBase {
             .withRefTracking(true)
             .requireClassRegistration(false)
             .build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     {
       classResolver.setSerializer(Foo.class, new ObjectSerializer<>(fory, Foo.class));
       TypeInfo typeInfo = classResolver.getTypeInfo(Foo.class);
@@ -375,7 +375,7 @@ public class ClassResolverTest extends ForyTestBase {
   private static class ErrorSerializer extends Serializer<Foo> {
     public ErrorSerializer(Fory fory) {
       super(fory, Foo.class);
-      fory.getClassResolver().setSerializer(Foo.class, this);
+      fory.getTypeResolver().setSerializer(Foo.class, this);
       throw new RuntimeException();
     }
 
@@ -396,7 +396,7 @@ public class ClassResolverTest extends ForyTestBase {
             .withRefTracking(true)
             .requireClassRegistration(false)
             .build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     Assert.assertThrows(() -> Serializers.newSerializer(fory, Foo.class, ErrorSerializer.class));
     Assert.assertNull(classResolver.getSerializer(Foo.class, false));
     Assert.assertThrows(
@@ -407,7 +407,7 @@ public class ClassResolverTest extends ForyTestBase {
   @Test
   public void testPrimitive() {
     Fory fory = Fory.builder().withLanguage(Language.JAVA).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     Assert.assertTrue(classResolver.isPrimitive(classResolver.getRegisteredClassId(void.class)));
     Assert.assertTrue(classResolver.isPrimitive(classResolver.getRegisteredClassId(boolean.class)));
     Assert.assertTrue(classResolver.isPrimitive(classResolver.getRegisteredClassId(byte.class)));
@@ -451,8 +451,7 @@ public class ClassResolverTest extends ForyTestBase {
 
     Assert.assertEquals(foo, serDe(fory, foo));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializer(foo.getClass()).getClass(),
-        FooCustomSerializer.class);
+        fory.getTypeResolver().getSerializer(foo.getClass()).getClass(), FooCustomSerializer.class);
   }
 
   interface ITest {
@@ -505,19 +504,19 @@ public class ClassResolverTest extends ForyTestBase {
 
     Assert.assertEquals(iTest, serDe(fory, iTest));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializer(iTest.getClass()).getClass(),
+        fory.getTypeResolver().getSerializer(iTest.getClass()).getClass(),
         InterfaceCustomSerializer.class);
 
     fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
     fory.register(ITest.class);
     Assert.assertNotEquals(
-        fory.getClassResolver().getSerializer(ImplTest.class).getClass(),
+        fory.getTypeResolver().getSerializer(ImplTest.class).getClass(),
         InterfaceCustomSerializer.class);
 
     fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
     fory.registerSerializer(ITest.class, new InterfaceCustomSerializer(fory, ITest.class));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializer(ImplTest.class).getClass(),
+        fory.getTypeResolver().getSerializer(ImplTest.class).getClass(),
         InterfaceCustomSerializer.class);
   }
 
@@ -570,7 +569,7 @@ public class ClassResolverTest extends ForyTestBase {
 
     Assert.assertEquals(absTest, serDe(fory, absTest));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializer(absTest.getClass()).getClass(),
+        fory.getTypeResolver().getSerializer(absTest.getClass()).getClass(),
         AbstractCustomSerializer.class);
 
     final AbsTest abs2Test = new Sub2AbsTest();
@@ -578,7 +577,7 @@ public class ClassResolverTest extends ForyTestBase {
 
     Assert.assertEquals(abs2Test.getF1(), serDe(fory, abs2Test).getF1());
     Assert.assertEquals(
-        fory.getClassResolver().getSerializer(abs2Test.getClass()).getClass(),
+        fory.getTypeResolver().getSerializer(abs2Test.getClass()).getClass(),
         AbstractCustomSerializer.class);
   }
 
@@ -603,7 +602,7 @@ public class ClassResolverTest extends ForyTestBase {
   @Test
   public void testAbstractEnumIsSerializable() {
     Fory fory = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     // Abstract enums should be serializable
     Assert.assertTrue(classResolver.isSerializable(AbstractEnum.class));
     // The concrete enum value classes should also be serializable
diff --git a/java/fory-core/src/test/java/org/apache/fory/resolver/TypeInfoTest.java b/java/fory-core/src/test/java/org/apache/fory/resolver/TypeInfoTest.java
index 39a7352d9..03a3bcddd 100644
--- a/java/fory-core/src/test/java/org/apache/fory/resolver/TypeInfoTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/resolver/TypeInfoTest.java
@@ -41,7 +41,7 @@ public class TypeInfoTest {
   @Test
   public void testEncodePackageNameAndTypeName() {
     Fory fory1 = Fory.builder().withLanguage(Language.JAVA).requireClassRegistration(false).build();
-    TypeInfo info1 = fory1.getClassResolver().getTypeInfo(org.apache.fory.test.bean.Foo.class);
+    TypeInfo info1 = fory1.getTypeResolver().getTypeInfo(org.apache.fory.test.bean.Foo.class);
     assertNotNull(info1.namespaceBytes);
     assertNotNull(info1.typeNameBytes);
   }
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/CodegenSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/CodegenSerializerTest.java
index a4025b45a..2ac1268f1 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/CodegenSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/CodegenSerializerTest.java
@@ -101,7 +101,7 @@ public class CodegenSerializerTest extends ForyTestBase {
     fory.serialize(buffer, cyclic);
     fory.deserialize(buffer);
 
-    Serializer<Cyclic> beanSerializer = fory.getClassResolver().getSerializer(Cyclic.class);
+    Serializer<Cyclic> beanSerializer = fory.getTypeResolver().getSerializer(Cyclic.class);
     fory.getRefResolver().writeRefOrNull(buffer, cyclic);
     beanSerializer.write(buffer, cyclic);
     fory.getRefResolver().readRefOrNull(buffer);
@@ -249,8 +249,8 @@ public class CodegenSerializerTest extends ForyTestBase {
               .build();
       serDeCheck(fory1, pojo);
       Assert.assertNotSame(
-          fory1.getClassResolver().getSerializerClass(CompressTestClass.class),
-          fory.getClassResolver().getSerializerClass(CompressTestClass.class));
+          fory1.getTypeResolver().getSerializerClass(CompressTestClass.class),
+          fory.getTypeResolver().getSerializerClass(CompressTestClass.class));
       Assert.assertTrue(fory1.serialize(pojo).length > bytes.length);
       Assert.assertTrue(fory1.serialize(pojo).length < length);
     }
@@ -342,7 +342,7 @@ public class CodegenSerializerTest extends ForyTestBase {
     A o = serDe(fory, a);
     assertEquals(o.f1, a.f1);
     // local class never static
-    assertSame(fory.getClassResolver().getSerializer(A.class).getClass(), ObjectSerializer.class);
+    assertSame(fory.getTypeResolver().getSerializer(A.class).getClass(), ObjectSerializer.class);
     // TODO how to create a class with `Class#getCanonicalName` returns null and static still.
     // for scala 3:
     // `enum ColorEnum { case Red, Green, Blue }`
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/CompatibleSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/CompatibleSerializerTest.java
index cdf267071..54d8e1e43 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/CompatibleSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/CompatibleSerializerTest.java
@@ -331,7 +331,7 @@ public class CompatibleSerializerTest extends ForyTestBase {
   }
 
   @Test
-  public void testSerializeJavaObject() {
+  public void testSerializeDeserializeApis() {
     Fory fory =
         Fory.builder()
             .withLanguage(Language.JAVA)
@@ -340,20 +340,7 @@ public class CompatibleSerializerTest extends ForyTestBase {
             .build();
     BeanA beanA = BeanA.createBeanA(2);
     Assert.assertEquals(fory.deserialize(fory.serialize(beanA)), beanA);
-    byte[] serialized = fory.serializeJavaObject(beanA);
-    Assert.assertEquals(fory.deserializeJavaObject(serialized, BeanA.class), beanA);
-  }
-
-  @Test
-  public void testSerializeJavaObjectWithTypeInfo() {
-    Fory fory =
-        Fory.builder()
-            .withLanguage(Language.JAVA)
-            .withCompatibleMode(CompatibleMode.COMPATIBLE)
-            .requireClassRegistration(false)
-            .build();
-    BeanA beanA = BeanA.createBeanA(2);
-    byte[] serialized = fory.serializeJavaObjectAndClass(beanA);
-    Assert.assertEquals(fory.deserializeJavaObjectAndClass(serialized), beanA);
+    byte[] serialized = fory.serialize(beanA);
+    Assert.assertEquals(fory.deserialize(serialized, BeanA.class), beanA);
   }
 }
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/DuplicateFieldsTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/DuplicateFieldsTest.java
index 85fd98c80..a9597ee7e 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/DuplicateFieldsTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/DuplicateFieldsTest.java
@@ -116,7 +116,7 @@ public class DuplicateFieldsTest extends ForyTestBase {
     {
       MetaSharedSerializer<C> serializer =
           new MetaSharedSerializer<>(
-              fory, C.class, fory.getClassResolver().getTypeDef(C.class, true));
+              fory, C.class, fory.getTypeResolver().getTypeDef(C.class, true));
       MemoryBuffer buffer = MemoryUtils.buffer(32);
       serializer.write(buffer, c);
       C newC = serializer.read(buffer);
@@ -131,7 +131,7 @@ public class DuplicateFieldsTest extends ForyTestBase {
               fory,
               C.class,
               CodecUtils.loadOrGenMetaSharedCodecClass(
-                  fory, C.class, fory.getClassResolver().getTypeDef(C.class, true)));
+                  fory, C.class, fory.getTypeResolver().getTypeDef(C.class, true)));
       MemoryBuffer buffer = MemoryUtils.buffer(32);
       serializer.write(buffer, c);
       C newC = serializer.read(buffer);
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java
index 5de178451..782444f1e 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java
@@ -141,10 +141,10 @@ public class EnumSerializerTest extends ForyTestBase {
 
     // serialize enum "B"
     forySerialization.register(cls1);
-    byte[] bytes = forySerialization.serializeJavaObject(cls1.getEnumConstants()[1]);
+    byte[] bytes = forySerialization.serialize(cls1.getEnumConstants()[1]);
 
     foryDeserialize.register(cls2);
-    Object data = foryDeserialize.deserializeJavaObject(bytes, cls2);
+    Object data = foryDeserialize.deserialize(bytes, cls2);
     assertEquals(cls2.getEnumConstants()[0], data);
   }
 
@@ -178,10 +178,10 @@ public class EnumSerializerTest extends ForyTestBase {
 
     // serialize enum "B"
     forySerialization.register(cls1);
-    byte[] bytes = forySerialization.serializeJavaObject(cls1.getEnumConstants()[1]);
+    byte[] bytes = forySerialization.serialize(cls1.getEnumConstants()[1]);
 
     foryDeserialize.register(cls2);
-    Object data = foryDeserialize.deserializeJavaObject(bytes, cls2);
+    Object data = foryDeserialize.deserialize(bytes, cls2);
     assertEquals(cls2.getEnumConstants()[0], data);
   }
 
@@ -214,11 +214,11 @@ public class EnumSerializerTest extends ForyTestBase {
             .build();
 
     forySerialization.register(cls1);
-    byte[] bytes = forySerialization.serializeJavaObject(cls1.getEnumConstants()[0]);
+    byte[] bytes = forySerialization.serialize(cls1.getEnumConstants()[0]);
 
     try {
       foryDeserialize.register(cls2);
-      foryDeserialize.deserializeJavaObject(bytes, cls2);
+      foryDeserialize.deserialize(bytes, cls2);
       fail("expected to throw exception");
     } catch (Exception e) {
       assertTrue(e instanceof DeserializationException);
@@ -254,9 +254,9 @@ public class EnumSerializerTest extends ForyTestBase {
             .withAsyncCompilation(false)
             .build();
 
-    byte[] bytes = forySerialization.serializeJavaObject(null);
+    byte[] bytes = forySerialization.serialize(null);
 
-    Object data = foryDeserialize.deserializeJavaObject(bytes, cls2);
+    Object data = foryDeserialize.deserialize(bytes, cls2);
     assertNull(data);
   }
 
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/LambdaSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/LambdaSerializerTest.java
index 356e81e19..f7859a5f2 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/LambdaSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/LambdaSerializerTest.java
@@ -53,7 +53,7 @@ public class LambdaSerializerTest extends ForyTestBase {
       assertEquals(list.get(0).apply(20), Integer.valueOf(40));
     }
     assertSame(
-        fory.getClassResolver().getSerializerClass(Class.class), Serializers.ClassSerializer.class);
+        fory.getTypeResolver().getSerializerClass(Class.class), Serializers.ClassSerializer.class);
   }
 
   @Test(dataProvider = "foryCopyConfig")
@@ -73,7 +73,7 @@ public class LambdaSerializerTest extends ForyTestBase {
       assertEquals(list.get(0).apply(20), Integer.valueOf(40));
     }
     assertSame(
-        fory.getClassResolver().getSerializerClass(Class.class), Serializers.ClassSerializer.class);
+        fory.getTypeResolver().getSerializerClass(Class.class), Serializers.ClassSerializer.class);
   }
 
   @Test
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/ObjectStreamSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/ObjectStreamSerializerTest.java
index c91c824c2..35e4b2625 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/ObjectStreamSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/ObjectStreamSerializerTest.java
@@ -87,7 +87,7 @@ public class ObjectStreamSerializerTest extends ForyTestBase {
     WriteObjectTestClass o = new WriteObjectTestClass(new char[] {'a', 'b'});
     serDeCheckSerializer(fory, o, "ObjectStreamSerializer");
     assertSame(
-        fory.getClassResolver().getSerializerClass(StringBuilder.class),
+        fory.getTypeResolver().getSerializerClass(StringBuilder.class),
         ObjectStreamSerializer.class);
     StringBuilder buf = (StringBuilder) serDe(fory, new StringBuilder("abc"));
     assertEquals(buf.toString(), "abc");
@@ -170,7 +170,7 @@ public class ObjectStreamSerializerTest extends ForyTestBase {
         WriteObjectTestClass3.class, new ObjectStreamSerializer(fory, WriteObjectTestClass3.class));
 
     assertSame(
-        fory.getClassResolver().getSerializerClass(StringBuffer.class),
+        fory.getTypeResolver().getSerializerClass(StringBuffer.class),
         ObjectStreamSerializer.class);
     // test `putFields`
     StringBuffer newStringBuffer = (StringBuffer) serDe(fory, new StringBuffer("abc"));
@@ -237,7 +237,7 @@ public class ObjectStreamSerializerTest extends ForyTestBase {
     {
       serDeCheck(fory, new ConcurrentHashMap<>(mapData));
       assertSame(
-          fory.getClassResolver().getSerializer(ConcurrentHashMap.class).getClass(),
+          fory.getTypeResolver().getSerializer(ConcurrentHashMap.class).getClass(),
           ObjectStreamSerializer.class);
     }
     {
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/ReplaceResolveSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/ReplaceResolveSerializerTest.java
index b017d7d87..b74163bb2 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/ReplaceResolveSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/ReplaceResolveSerializerTest.java
@@ -89,16 +89,15 @@ public class ReplaceResolveSerializerTest extends ForyTestBase {
     CustomReplaceClass1 o1 = new CustomReplaceClass1("abc");
     serDeCheck(fory, o1);
     assertTrue(
-        fory.getClassResolver().getSerializer(o1.getClass()) instanceof ReplaceResolveSerializer);
+        fory.getTypeResolver().getSerializer(o1.getClass()) instanceof ReplaceResolveSerializer);
 
     serDeCheck(fory, list1);
 
     serDeCheck(fory, map1);
     assertTrue(
-        fory.getClassResolver().getSerializer(list1.getClass())
-            instanceof ReplaceResolveSerializer);
+        fory.getTypeResolver().getSerializer(list1.getClass()) instanceof ReplaceResolveSerializer);
     assertTrue(
-        fory.getClassResolver().getSerializer(map1.getClass()) instanceof ReplaceResolveSerializer);
+        fory.getTypeResolver().getSerializer(map1.getClass()) instanceof ReplaceResolveSerializer);
   }
 
   @Test(dataProvider = "foryCopyConfig")
@@ -169,7 +168,7 @@ public class ReplaceResolveSerializerTest extends ForyTestBase {
     Object[] newObj = (Object[]) serDe(fory, (Object) o);
     assertEquals(newObj, new Object[] {o.copy, o.age});
     assertTrue(
-        fory.getClassResolver().getSerializer(CustomReplaceClass2.class)
+        fory.getTypeResolver().getSerializer(CustomReplaceClass2.class)
             instanceof ReplaceResolveSerializer);
   }
 
@@ -346,7 +345,7 @@ public class ReplaceResolveSerializerTest extends ForyTestBase {
     Object[] newObj = (Object[]) serDe(fory, (Object) o);
     assertEquals(newObj, new Object[] {o.copy, o.age});
     assertTrue(
-        fory.getClassResolver().getSerializer(Subclass1.class) instanceof ReplaceResolveSerializer);
+        fory.getTypeResolver().getSerializer(Subclass1.class) instanceof ReplaceResolveSerializer);
   }
 
   @Test(dataProvider = "foryCopyConfig")
@@ -403,7 +402,7 @@ public class ReplaceResolveSerializerTest extends ForyTestBase {
     Object[] newObj = (Object[]) serDe(fory, (Object) o);
     assertEquals(newObj, new Object[] {o.copy, o.age});
     assertTrue(
-        fory.getClassResolver().getSerializer(Subclass2.class) instanceof ReplaceResolveSerializer);
+        fory.getTypeResolver().getSerializer(Subclass2.class) instanceof ReplaceResolveSerializer);
   }
 
   public static class CustomReplaceClass5 {
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/SerializerFactoryTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/SerializerFactoryTest.java
index 2f913e4c5..5ff75a781 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/SerializerFactoryTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/SerializerFactoryTest.java
@@ -93,7 +93,7 @@ public class SerializerFactoryTest {
             return null;
           }
         });
-    Assert.assertEquals(fory.getClassResolver().getSerializerClass(A.class), KryoSerializer.class);
+    Assert.assertEquals(fory.getTypeResolver().getSerializerClass(A.class), KryoSerializer.class);
     A a = new A();
     a.f1 = "f1";
 
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/StringSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/StringSerializerTest.java
index ef84d4444..bbaa25631 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/StringSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/StringSerializerTest.java
@@ -334,7 +334,7 @@ public class StringSerializerTest extends ForyTestBase {
     }
     Fory fory = Fory.builder().withStringCompressed(true).requireClassRegistration(false).build();
     StringSerializer stringSerializer =
-        (StringSerializer) fory.getClassResolver().getSerializer(String.class);
+        (StringSerializer) fory.getTypeResolver().getSerializer(String.class);
 
     String utf16Str = "你好, Fory" + StringUtils.random(64);
     char[] utf16StrChars = utf16Str.toCharArray();
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java
index 6eb101367..753d74b2d 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java
@@ -104,7 +104,7 @@ public class ChildContainerSerializersTest extends ForyTestBase {
       Assert.assertEquals(newList, list);
       Assert.assertEquals(newList.state, 3);
       Assert.assertEquals(
-          fory.getClassResolver().getSerializer(newList.getClass()).getClass(),
+          fory.getTypeResolver().getSerializer(newList.getClass()).getClass(),
           ChildContainerSerializers.ChildArrayListSerializer.class);
       ArrayList<Integer> innerList =
           new ArrayList<Integer>() {
@@ -115,7 +115,7 @@ public class ChildContainerSerializersTest extends ForyTestBase {
       // innerList captures outer this.
       serDeCheck(fory, innerList);
       Assert.assertEquals(
-          fory.getClassResolver().getSerializer(innerList.getClass()).getClass(),
+          fory.getTypeResolver().getSerializer(innerList.getClass()).getClass(),
           CollectionSerializers.JDKCompatibleCollectionSerializer.class);
     }
     {
@@ -151,7 +151,7 @@ public class ChildContainerSerializersTest extends ForyTestBase {
       Assert.assertEquals(newList, list);
       Assert.assertEquals(newList.state, 3);
       Assert.assertEquals(
-          fory.getClassResolver().getSerializer(newList.getClass()).getClass(),
+          fory.getTypeResolver().getSerializer(newList.getClass()).getClass(),
           ChildContainerSerializers.ChildArrayListSerializer.class);
       ArrayList<Object> innerList =
           new ArrayList<Object>() {
@@ -161,7 +161,7 @@ public class ChildContainerSerializersTest extends ForyTestBase {
           };
       copyCheck(fory, innerList);
       Assert.assertEquals(
-          fory.getClassResolver().getSerializer(innerList.getClass()).getClass(),
+          fory.getTypeResolver().getSerializer(innerList.getClass()).getClass(),
           CollectionSerializers.JDKCompatibleCollectionSerializer.class);
     }
     {
@@ -205,7 +205,7 @@ public class ChildContainerSerializersTest extends ForyTestBase {
       Assert.assertEquals(newMap, map);
       Assert.assertEquals(newMap.state, 3);
       Assert.assertEquals(
-          fory.getClassResolver().getSerializer(newMap.getClass()).getClass(),
+          fory.getTypeResolver().getSerializer(newMap.getClass()).getClass(),
           ChildContainerSerializers.ChildMapSerializer.class);
     }
     {
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
index bd373ae12..fb292f33e 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
@@ -416,17 +416,17 @@ public class CollectionSerializersTest extends ForyTestBase {
     serDe(getJavaFory(), EnumSet.allOf(TestEnum.class));
     Assert.assertEquals(
         getJavaFory()
-            .getClassResolver()
+            .getTypeResolver()
             .getSerializerClass(EnumSet.allOf(TestEnum.class).getClass()),
         CollectionSerializers.EnumSetSerializer.class);
     serDe(getJavaFory(), EnumSet.of(TestEnum.A));
     Assert.assertEquals(
-        getJavaFory().getClassResolver().getSerializerClass(EnumSet.of(TestEnum.A).getClass()),
+        getJavaFory().getTypeResolver().getSerializerClass(EnumSet.of(TestEnum.A).getClass()),
         CollectionSerializers.EnumSetSerializer.class);
     serDe(getJavaFory(), EnumSet.of(TestEnum.A, TestEnum.B));
     Assert.assertEquals(
         getJavaFory()
-            .getClassResolver()
+            .getTypeResolver()
             .getSerializerClass(EnumSet.of(TestEnum.A, TestEnum.B).getClass()),
         CollectionSerializers.EnumSetSerializer.class);
     // TODO test enum which has enums exceed 128.
@@ -473,13 +473,13 @@ public class CollectionSerializersTest extends ForyTestBase {
     serDe(getJavaFory(), BitSet.valueOf(LongStream.range(0, 2).toArray()));
     Assert.assertEquals(
         getJavaFory()
-            .getClassResolver()
+            .getTypeResolver()
             .getSerializerClass(BitSet.valueOf(LongStream.range(0, 2).toArray()).getClass()),
         CollectionSerializers.BitSetSerializer.class);
     serDe(getJavaFory(), BitSet.valueOf(LongStream.range(0, 128).toArray()));
     Assert.assertEquals(
         getJavaFory()
-            .getClassResolver()
+            .getTypeResolver()
             .getSerializerClass(BitSet.valueOf(LongStream.range(0, 128).toArray()).getClass()),
         CollectionSerializers.BitSetSerializer.class);
   }
@@ -494,7 +494,7 @@ public class CollectionSerializersTest extends ForyTestBase {
   public void tesPriorityQueueSerializer() {
     serDe(getJavaFory(), new PriorityQueue<>(Arrays.asList("a", "b", "c")));
     Assert.assertEquals(
-        getJavaFory().getClassResolver().getSerializerClass(PriorityQueue.class),
+        getJavaFory().getTypeResolver().getSerializerClass(PriorityQueue.class),
         CollectionSerializers.PriorityQueueSerializer.class);
   }
 
@@ -511,7 +511,7 @@ public class CollectionSerializersTest extends ForyTestBase {
         new CopyOnWriteArrayList<>(new String[] {"a", "b", "c"});
     Assert.assertEquals(list, serDe(getJavaFory(), list));
     Assert.assertEquals(
-        getJavaFory().getClassResolver().getSerializerClass(CopyOnWriteArrayList.class),
+        getJavaFory().getTypeResolver().getSerializerClass(CopyOnWriteArrayList.class),
         CollectionSerializers.CopyOnWriteArrayListSerializer.class);
   }
 
@@ -554,7 +554,7 @@ public class CollectionSerializersTest extends ForyTestBase {
     set.add("c");
     serDeCheck(fory, set);
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(set.getClass()),
+        fory.getTypeResolver().getSerializerClass(set.getClass()),
         CollectionSerializers.SetFromMapSerializer.class);
     CollectionViewTestStruct struct1 = serDeCheck(fory, new CollectionViewTestStruct(set, set));
     if (fory.trackingRef()) {
@@ -587,7 +587,7 @@ public class CollectionSerializersTest extends ForyTestBase {
     set.add("c");
     Assert.assertEquals(set, serDe(fory, set));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(set.getClass()),
+        fory.getTypeResolver().getSerializerClass(set.getClass()),
         CollectionSerializers.ConcurrentHashMapKeySetViewSerializer.class);
     CollectionViewTestStruct o = serDeCheck(fory, new CollectionViewTestStruct(set, set));
     if (fory.trackingRef()) {
@@ -686,7 +686,7 @@ public class CollectionSerializersTest extends ForyTestBase {
     Assert.assertEquals(serDe(fory, obj).toString(), obj.toString());
     if (fory.getConfig().isCodeGenEnabled()) {
       Assert.assertTrue(
-          fory.getClassResolver()
+          fory.getTypeResolver()
               .getSerializerClass(SimpleBeanCollectionFields.class)
               .getName()
               .contains("Codec"));
@@ -847,7 +847,7 @@ public class CollectionSerializersTest extends ForyTestBase {
     testCollectionFieldsObjectEqual(serDe(fory, obj), obj);
     if (fory.getConfig().isCodeGenEnabled()) {
       Assert.assertTrue(
-          fory.getClassResolver()
+          fory.getTypeResolver()
               .getSerializerClass(CollectionFieldsClass.class)
               .getName()
               .contains("Codec"));
@@ -941,7 +941,7 @@ public class CollectionSerializersTest extends ForyTestBase {
     collection.add("b");
     serDeCheck(fory, collection);
     Assert.assertSame(
-        fory.getClassResolver().getSerializerClass(TestClassForDefaultCollectionSerializer.class),
+        fory.getTypeResolver().getSerializerClass(TestClassForDefaultCollectionSerializer.class),
         CollectionSerializers.DefaultJavaCollectionSerializer.class);
   }
 
@@ -973,7 +973,7 @@ public class CollectionSerializersTest extends ForyTestBase {
     assertEquals(set, read);
 
     assertSame(
-        fory.getClassResolver().getSerializer(setClass).getClass(),
+        fory.getTypeResolver().getSerializer(setClass).getClass(),
         GuavaCollectionSerializers.ImmutableSortedSetSerializer.class);
     buffer.writerIndex(0);
     buffer.readerIndex(0);
@@ -1119,7 +1119,7 @@ public class CollectionSerializersTest extends ForyTestBase {
         new CopyOnWriteArraySet<>(Arrays.asList("Value1", "Value2"));
     Assert.assertEquals(set, serDe(getJavaFory(), set));
     Assert.assertEquals(
-        getJavaFory().getClassResolver().getSerializerClass(CopyOnWriteArraySet.class),
+        getJavaFory().getTypeResolver().getSerializerClass(CopyOnWriteArraySet.class),
         CollectionSerializers.CopyOnWriteArraySetSerializer.class);
   }
 
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/GuavaCollectionSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/GuavaCollectionSerializersTest.java
index 94aaa40c6..a1fb62fe9 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/GuavaCollectionSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/GuavaCollectionSerializersTest.java
@@ -40,11 +40,11 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableListSerializer(Fory fory) {
     serDe(fory, ImmutableList.of(1));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableList.of(1).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableList.of(1).getClass()),
         GuavaCollectionSerializers.ImmutableListSerializer.class);
     serDe(fory, ImmutableList.of(1, 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableList.of(1, 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableList.of(1, 2).getClass()),
         GuavaCollectionSerializers.RegularImmutableListSerializer.class);
   }
 
@@ -58,11 +58,11 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableSetSerializer(Fory fory) {
     serDe(fory, ImmutableSet.of(1));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableSet.of(1).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableSet.of(1).getClass()),
         GuavaCollectionSerializers.ImmutableSetSerializer.class);
     serDe(fory, ImmutableSet.of(1, 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableSet.of(1, 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableSet.of(1, 2).getClass()),
         GuavaCollectionSerializers.ImmutableSetSerializer.class);
   }
 
@@ -70,11 +70,11 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableSetSerializerCopy(Fory fory) {
     copyCheck(fory, ImmutableSet.of(1));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableSet.of(1).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableSet.of(1).getClass()),
         GuavaCollectionSerializers.ImmutableSetSerializer.class);
     copyCheck(fory, ImmutableSet.of(1, 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableSet.of(1, 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableSet.of(1, 2).getClass()),
         GuavaCollectionSerializers.ImmutableSetSerializer.class);
   }
 
@@ -82,7 +82,7 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableSortedSetSerializer(Fory fory) {
     serDe(fory, ImmutableSortedSet.of(1, 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableSortedSet.of(1, 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableSortedSet.of(1, 2).getClass()),
         GuavaCollectionSerializers.ImmutableSortedSetSerializer.class);
   }
 
@@ -90,7 +90,7 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableSortedSetSerializerCopy(Fory fory) {
     copyCheck(fory, ImmutableSortedSet.of(1, 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableSortedSet.of(1, 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableSortedSet.of(1, 2).getClass()),
         GuavaCollectionSerializers.ImmutableSortedSetSerializer.class);
   }
 
@@ -98,7 +98,7 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableMapSerializer(Fory fory) {
     serDe(fory, ImmutableMap.of("k1", 1, "k2", 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableMap.of("k1", 1, "k2", 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableMap.of("k1", 1, "k2", 2).getClass()),
         GuavaCollectionSerializers.ImmutableMapSerializer.class);
   }
 
@@ -106,7 +106,7 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableMapSerializerCopy(Fory fory) {
     copyCheck(fory, ImmutableMap.of("k1", 1, "k2", 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableMap.of("k1", 1, "k2", 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableMap.of("k1", 1, "k2", 2).getClass()),
         GuavaCollectionSerializers.ImmutableMapSerializer.class);
   }
 
@@ -114,11 +114,11 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableBiMapSerializer(Fory fory) {
     serDe(fory, ImmutableBiMap.of("k1", 1));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableBiMap.of("k1", 1).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableBiMap.of("k1", 1).getClass()),
         GuavaCollectionSerializers.ImmutableBiMapSerializer.class);
     serDe(fory, ImmutableBiMap.of("k1", 1, "k2", 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableBiMap.of("k1", 1, "k2", 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableBiMap.of("k1", 1, "k2", 2).getClass()),
         GuavaCollectionSerializers.ImmutableBiMapSerializer.class);
   }
 
@@ -126,11 +126,11 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableBiMapSerializerCopy(Fory fory) {
     copyCheck(fory, ImmutableBiMap.of("k1", 1));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableBiMap.of("k1", 1).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableBiMap.of("k1", 1).getClass()),
         GuavaCollectionSerializers.ImmutableBiMapSerializer.class);
     copyCheck(fory, ImmutableBiMap.of("k1", 1, "k2", 2));
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(ImmutableBiMap.of("k1", 1, "k2", 2).getClass()),
+        fory.getTypeResolver().getSerializerClass(ImmutableBiMap.of("k1", 1, "k2", 2).getClass()),
         GuavaCollectionSerializers.ImmutableBiMapSerializer.class);
   }
 
@@ -138,7 +138,7 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableSortedMapSerializer(Fory fory) {
     serDe(fory, ImmutableSortedMap.of("k1", 1, "k2", 2));
     Assert.assertEquals(
-        fory.getClassResolver()
+        fory.getTypeResolver()
             .getSerializerClass(ImmutableSortedMap.of("k1", 1, "k2", 2).getClass()),
         GuavaCollectionSerializers.ImmutableSortedMapSerializer.class);
   }
@@ -147,7 +147,7 @@ public class GuavaCollectionSerializersTest extends ForyTestBase {
   public void testImmutableSortedMapSerializerCopy(Fory fory) {
     copyCheck(fory, ImmutableSortedMap.of("k1", 1, "k2", 2));
     Assert.assertEquals(
-        fory.getClassResolver()
+        fory.getTypeResolver()
             .getSerializerClass(ImmutableSortedMap.of("k1", 1, "k2", 2).getClass()),
         GuavaCollectionSerializers.ImmutableSortedMapSerializer.class);
   }
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
index 0719a9e87..c5df70595 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/MapSerializersTest.java
@@ -141,7 +141,7 @@ public class MapSerializersTest extends ForyTestBase {
     enumMap.put(TestEnum.B, "str");
     serDe(fory, enumMap);
     Assert.assertEquals(
-        fory.getClassResolver().getSerializerClass(enumMap.getClass()),
+        fory.getTypeResolver().getSerializerClass(enumMap.getClass()),
         MapSerializers.EnumMapSerializer.class);
 
     // testNoArgConstructor
@@ -477,7 +477,7 @@ public class MapSerializersTest extends ForyTestBase {
     enumMap.put(TestEnum.B, "str");
     serDe(getJavaFory(), enumMap);
     Assert.assertEquals(
-        getJavaFory().getClassResolver().getSerializerClass(enumMap.getClass()),
+        getJavaFory().getTypeResolver().getSerializerClass(enumMap.getClass()),
         MapSerializers.EnumMapSerializer.class);
   }
 
@@ -488,7 +488,7 @@ public class MapSerializersTest extends ForyTestBase {
     enumMap.put(TestEnum.B, "str");
     copyCheck(fory, enumMap);
     Assert.assertEquals(
-        getJavaFory().getClassResolver().getSerializerClass(enumMap.getClass()),
+        getJavaFory().getTypeResolver().getSerializerClass(enumMap.getClass()),
         MapSerializers.EnumMapSerializer.class);
   }
 
@@ -631,7 +631,7 @@ public class MapSerializersTest extends ForyTestBase {
     map.put("a", 1);
     map.put("b", 2);
     Assert.assertSame(
-        fory.getClassResolver().getSerializerClass(TestClass1ForDefaultMap.class),
+        fory.getTypeResolver().getSerializerClass(TestClass1ForDefaultMap.class),
         MapSerializers.DefaultJavaMapSerializer.class);
     serDeCheck(fory, map);
 
@@ -639,7 +639,7 @@ public class MapSerializersTest extends ForyTestBase {
     map.put("a", 1);
     map.put("b", 2);
     Assert.assertSame(
-        fory.getClassResolver().getSerializerClass(TestClass2ForDefaultMap.class),
+        fory.getTypeResolver().getSerializerClass(TestClass2ForDefaultMap.class),
         MapSerializers.DefaultJavaMapSerializer.class);
     serDeCheck(fory, map2);
   }
@@ -650,7 +650,7 @@ public class MapSerializersTest extends ForyTestBase {
     map.put("a", 1);
     map.put("b", 2);
     Assert.assertSame(
-        fory.getClassResolver().getSerializerClass(TestClass1ForDefaultMap.class),
+        fory.getTypeResolver().getSerializerClass(TestClass1ForDefaultMap.class),
         MapSerializers.DefaultJavaMapSerializer.class);
     copyCheck(fory, map);
 
@@ -658,7 +658,7 @@ public class MapSerializersTest extends ForyTestBase {
     map.put("a", 1);
     map.put("b", 2);
     Assert.assertSame(
-        fory.getClassResolver().getSerializerClass(TestClass2ForDefaultMap.class),
+        fory.getTypeResolver().getSerializerClass(TestClass2ForDefaultMap.class),
         MapSerializers.DefaultJavaMapSerializer.class);
     copyCheck(fory, map2);
   }
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/SynchronizedSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/SynchronizedSerializersTest.java
index 2215ce464..8533036c9 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/SynchronizedSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/SynchronizedSerializersTest.java
@@ -89,7 +89,7 @@ public class SynchronizedSerializersTest extends ForyTestBase {
       newValue = Platform.getObject(newObj, sourceCollectionFieldOffset);
       assertEquals(innerValue, newValue);
       assertTrue(
-          fory.getClassResolver()
+          fory.getTypeResolver()
               .getSerializerClass(value.getClass())
               .getName()
               .contains("Synchronized"));
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/UnmodifiableSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/UnmodifiableSerializersTest.java
index 5b952ba99..1fb7c25c7 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/UnmodifiableSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/UnmodifiableSerializersTest.java
@@ -98,7 +98,7 @@ public class UnmodifiableSerializersTest extends ForyTestBase {
       newValue = Platform.getObject(newObj, sourceCollectionFieldOffset);
       assertEquals(innerValue, newValue);
       assertTrue(
-          fory.getClassResolver()
+          fory.getTypeResolver()
               .getSerializerClass(value.getClass())
               .getName()
               .contains("Unmodifiable"));
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java
index 47c5286ff..0caaa4f8a 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerTest.java
@@ -61,9 +61,9 @@ public class DifferentPOJOCompatibleSerializerTest extends Assert {
     ClassCompleteField<String> subclass = new ClassCompleteField<>("subclass", "subclass2");
     ClassCompleteField<ClassCompleteField<String>> classCompleteField =
         new ClassCompleteField<>(subclass, subclass);
-    byte[] serialized = getFory().serializeJavaObject(classCompleteField);
+    byte[] serialized = getFory().serialize(classCompleteField);
     ClassMissingField<ClassMissingField<String>> classMissingField =
-        getFory().deserializeJavaObject(serialized, ClassMissingField.class);
+        getFory().deserialize(serialized, ClassMissingField.class);
 
     assertEq(classCompleteField, classMissingField);
   }
@@ -73,10 +73,10 @@ public class DifferentPOJOCompatibleSerializerTest extends Assert {
 
     ClassMissingField<String> subclass = new ClassMissingField<>("subclass");
     ClassMissingField classMissingField = new ClassMissingField(subclass);
-    byte[] serialized = getFory().serializeJavaObject(classMissingField);
+    byte[] serialized = getFory().serialize(classMissingField);
 
     ClassCompleteField classCompleteField =
-        getFory().deserializeJavaObject(serialized, ClassCompleteField.class);
+        getFory().deserialize(serialized, ClassCompleteField.class);
 
     assertEq(classCompleteField, classMissingField);
   }
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerWithRegistrationTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerWithRegistrationTest.java
index 7b97e4f51..cd82a7c1d 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerWithRegistrationTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/compatible/DifferentPOJOCompatibleSerializerWithRegistrationTest.java
@@ -61,9 +61,9 @@ public class DifferentPOJOCompatibleSerializerWithRegistrationTest extends Asser
     ClassCompleteField<String> subclass = new ClassCompleteField<>("subclass", "subclass2");
     ClassCompleteField<ClassCompleteField<String>> classCompleteField =
         new ClassCompleteField<>(subclass, subclass);
-    byte[] serialized = getFory(ClassCompleteField.class).serializeJavaObject(classCompleteField);
+    byte[] serialized = getFory(ClassCompleteField.class).serialize(classCompleteField);
     ClassMissingField<ClassMissingField<String>> classMissingField =
-        getFory(ClassMissingField.class).deserializeJavaObject(serialized, ClassMissingField.class);
+        getFory(ClassMissingField.class).deserialize(serialized, ClassMissingField.class);
 
     assertEq(classCompleteField, classMissingField);
   }
@@ -73,11 +73,10 @@ public class DifferentPOJOCompatibleSerializerWithRegistrationTest extends Asser
 
     ClassMissingField<String> subclass = new ClassMissingField<>("subclass");
     ClassMissingField classMissingField = new ClassMissingField(subclass);
-    byte[] serialized = getFory(ClassMissingField.class).serializeJavaObject(classMissingField);
+    byte[] serialized = getFory(ClassMissingField.class).serialize(classMissingField);
 
     ClassCompleteField classCompleteField =
-        getFory(ClassCompleteField.class)
-            .deserializeJavaObject(serialized, ClassCompleteField.class);
+        getFory(ClassCompleteField.class).deserialize(serialized, ClassCompleteField.class);
 
     assertEq(classCompleteField, classMissingField);
   }
diff --git a/java/fory-core/src/test/java/org/apache/fory/type/DescriptorGrouperTest.java b/java/fory-core/src/test/java/org/apache/fory/type/DescriptorGrouperTest.java
index f5bd07951..c769dad2b 100644
--- a/java/fory-core/src/test/java/org/apache/fory/type/DescriptorGrouperTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/type/DescriptorGrouperTest.java
@@ -77,7 +77,7 @@ public class DescriptorGrouperTest extends ForyTestBase {
   public void testComparatorByTypeAndName() {
     Fory fory = Fory.builder().build();
     List<Descriptor> descriptors = createDescriptors();
-    descriptors.sort(fory.getClassResolver().createTypeAndNameComparator());
+    descriptors.sort(((ClassResolver) fory.getTypeResolver()).createTypeAndNameComparator());
     List<? extends Class<?>> classes =
         descriptors.stream().map(Descriptor::getRawType).collect(Collectors.toList());
     List<Class<?>> expected =
@@ -114,7 +114,7 @@ public class DescriptorGrouperTest extends ForyTestBase {
       descriptors.add(createDescriptor(TypeRef.of(aClass), "f" + index++, -1, "TestClass", false));
     }
     Collections.shuffle(descriptors, new Random(7));
-    descriptors.sort(fory.getClassResolver().getPrimitiveComparator());
+    descriptors.sort(fory.getTypeResolver().getPrimitiveComparator());
     List<? extends Class<?>> classes =
         descriptors.stream().map(Descriptor::getRawType).collect(Collectors.toList());
     // With compression enabled (default): int/long are compressed and go to the end
@@ -143,7 +143,7 @@ public class DescriptorGrouperTest extends ForyTestBase {
     }
     Collections.shuffle(descriptors, new Random(7));
     Fory fory = Fory.builder().build();
-    descriptors.sort(fory.getClassResolver().getPrimitiveComparator());
+    descriptors.sort(fory.getTypeResolver().getPrimitiveComparator());
     List<? extends Class<?>> classes =
         descriptors.stream().map(Descriptor::getRawType).collect(Collectors.toList());
     // With compression enabled (default): int/long are compressed and go to the end
@@ -192,8 +192,8 @@ public class DescriptorGrouperTest extends ForyTestBase {
                 descriptors,
                 false,
                 null,
-                fory.getClassResolver().getPrimitiveComparator(),
-                fory.getClassResolver().createTypeAndNameComparator())
+                fory.getTypeResolver().getPrimitiveComparator(),
+                ((ClassResolver) fory.getTypeResolver()).createTypeAndNameComparator())
             .sort();
     {
       List<? extends Class<?>> classes =
@@ -278,8 +278,8 @@ public class DescriptorGrouperTest extends ForyTestBase {
                 createDescriptors(),
                 false,
                 null,
-                fory.getClassResolver().getPrimitiveComparator(),
-                fory.getClassResolver().createTypeAndNameComparator())
+                fory.getTypeResolver().getPrimitiveComparator(),
+                ((ClassResolver) fory.getTypeResolver()).createTypeAndNameComparator())
             .sort();
     {
       List<? extends Class<?>> classes =
@@ -331,7 +331,7 @@ public class DescriptorGrouperTest extends ForyTestBase {
   @Test
   public void testNormalizedTypeNameComparator() {
     Fory fory = builder().build();
-    ClassResolver classResolver = fory.getClassResolver();
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
     Comparator<Descriptor> comparator = classResolver.createTypeAndNameComparator();
 
     // Create descriptors with different Collection/Map subtypes
@@ -400,7 +400,7 @@ public class DescriptorGrouperTest extends ForyTestBase {
             new TypeRef<ArrayList<String>>() {}, "arrayListField", -1, "TestClass", false));
     Fory fory = Fory.builder().build();
     // Sort with the static comparator
-    descriptors.sort(fory.getClassResolver().createTypeAndNameComparator());
+    descriptors.sort(((ClassResolver) fory.getTypeResolver()).createTypeAndNameComparator());
 
     // Get type names after sorting
     List<String> typeNames =
diff --git a/java/fory-extensions/src/test/java/org/apache/fory/extension/meta/TypeDefEncoderTest.java b/java/fory-extensions/src/test/java/org/apache/fory/extension/meta/TypeDefEncoderTest.java
index aea91d457..f6f97e7de 100644
--- a/java/fory-extensions/src/test/java/org/apache/fory/extension/meta/TypeDefEncoderTest.java
+++ b/java/fory-extensions/src/test/java/org/apache/fory/extension/meta/TypeDefEncoderTest.java
@@ -28,6 +28,7 @@ import org.apache.fory.memory.MemoryBuffer;
 import org.apache.fory.meta.FieldInfo;
 import org.apache.fory.meta.NativeTypeDefEncoder;
 import org.apache.fory.meta.TypeDef;
+import org.apache.fory.resolver.ClassResolver;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -45,10 +46,11 @@ public class TypeDefEncoderTest {
     Fory fory =
         Fory.builder().withMetaShare(true).withMetaCompressor(new ZstdMetaCompressor()).build();
     Class<TestFieldsOrderClass1> type = TestFieldsOrderClass1.class;
-    List<FieldInfo> fieldsInfo = buildFieldsInfo(fory.getClassResolver(), type);
+    ClassResolver classResolver = (ClassResolver) fory.getTypeResolver();
+    List<FieldInfo> fieldsInfo = buildFieldsInfo(classResolver, type);
     MemoryBuffer buffer =
         NativeTypeDefEncoder.encodeTypeDef(
-            fory.getClassResolver(), type, getClassFields(type, fieldsInfo), true);
+            classResolver, type, getClassFields(type, fieldsInfo), true);
     TypeDef typeDef = TypeDef.readTypeDef(fory, buffer);
     Assert.assertEquals(typeDef.getClassName(), type.getName());
     Assert.assertEquals(typeDef.getFieldsInfo().size(), type.getDeclaredFields().length);
diff --git a/java/fory-extensions/src/test/java/org/apache/fory/extension/serializer/ProtobufSerializerTest.java b/java/fory-extensions/src/test/java/org/apache/fory/extension/serializer/ProtobufSerializerTest.java
index 47b4f1e8d..be35ca9e9 100644
--- a/java/fory-extensions/src/test/java/org/apache/fory/extension/serializer/ProtobufSerializerTest.java
+++ b/java/fory-extensions/src/test/java/org/apache/fory/extension/serializer/ProtobufSerializerTest.java
@@ -31,7 +31,7 @@ public class ProtobufSerializerTest {
     Assert.assertEquals(fory.deserialize(fory.serialize(ByteString.empty())), ByteString.empty());
     ByteString bytes = ByteString.copyFrom(new byte[] {1, 2, 3});
     Assert.assertEquals(fory.deserialize(fory.serialize(bytes)), bytes);
-    Class<?> serializerClass = fory.getClassResolver().getSerializerClass(bytes.getClass());
+    Class<?> serializerClass = fory.getTypeResolver().getSerializerClass(bytes.getClass());
     Assert.assertEquals(serializerClass, ByteStringSerializer.class);
   }
 }
diff --git a/java/fory-simd/src/main/java/org/apache/fory/serializer/CompressedArraySerializers.java b/java/fory-simd/src/main/java/org/apache/fory/serializer/CompressedArraySerializers.java
index 7c7fe3edc..9165af1bf 100644
--- a/java/fory-simd/src/main/java/org/apache/fory/serializer/CompressedArraySerializers.java
+++ b/java/fory-simd/src/main/java/org/apache/fory/serializer/CompressedArraySerializers.java
@@ -69,7 +69,7 @@ public final class CompressedArraySerializers {
    * @param fory the Fory instance to configure
    */
   static void registerIfEnabled(Fory fory) {
-    ClassResolver resolver = fory.getClassResolver();
+    ClassResolver resolver = (ClassResolver) fory.getTypeResolver();
     boolean compressInt = fory.getConfig().compressIntArray();
     boolean compressLong = fory.getConfig().compressLongArray();
 
@@ -109,7 +109,7 @@ public final class CompressedArraySerializers {
    * @param fory the Fory instance to register serializers with
    */
   public static void register(Fory fory) {
-    ClassResolver resolver = fory.getClassResolver();
+    ClassResolver resolver = (ClassResolver) fory.getTypeResolver();
     resolver.registerInternalSerializer(int[].class, new CompressedIntArraySerializer(fory));
     resolver.registerInternalSerializer(long[].class, new CompressedLongArraySerializer(fory));
   }
diff --git a/java/fory-testsuite/src/test/java/org/apache/fory/test/Object2ObjectOpenHashMapTest.java b/java/fory-testsuite/src/test/java/org/apache/fory/test/Object2ObjectOpenHashMapTest.java
index d60b0856c..d95070a8d 100644
--- a/java/fory-testsuite/src/test/java/org/apache/fory/test/Object2ObjectOpenHashMapTest.java
+++ b/java/fory-testsuite/src/test/java/org/apache/fory/test/Object2ObjectOpenHashMapTest.java
@@ -40,7 +40,7 @@ public class Object2ObjectOpenHashMapTest extends TestBase {
         builder().withCompatibleMode(CompatibleMode.COMPATIBLE).withCodegen(enableCodegen).build();
 
     TestObject2ObjectOpenHashMap o = new TestObject2ObjectOpenHashMap();
-    byte[] bytes = fory.serializeJavaObject(o);
-    Assert.assertEquals(fory.deserializeJavaObject(bytes, TestObject2ObjectOpenHashMap.class), o);
+    byte[] bytes = fory.serialize(o);
+    Assert.assertEquals(fory.deserialize(bytes, TestObject2ObjectOpenHashMap.class), o);
   }
 }
diff --git a/kotlin/src/main/java/org/apache/fory/serializer/kotlin/KotlinSerializers.java b/kotlin/src/main/java/org/apache/fory/serializer/kotlin/KotlinSerializers.java
index f5db4183f..b9c59c4fa 100644
--- a/kotlin/src/main/java/org/apache/fory/serializer/kotlin/KotlinSerializers.java
+++ b/kotlin/src/main/java/org/apache/fory/serializer/kotlin/KotlinSerializers.java
@@ -32,7 +32,7 @@ import kotlin.uuid.Uuid;
 import org.apache.fory.AbstractThreadSafeFory;
 import org.apache.fory.Fory;
 import org.apache.fory.ThreadSafeFory;
-import org.apache.fory.resolver.ClassResolver;
+import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.collection.CollectionSerializers;
 import org.apache.fory.serializer.collection.MapSerializers;
 import org.apache.fory.util.DefaultValueUtils;
@@ -48,7 +48,7 @@ public class KotlinSerializers {
 
   public static void registerSerializers(Fory fory) {
     DefaultValueUtils.setKotlinDefaultValueSupport(new KotlinDefaultValueSupport());
-    ClassResolver resolver = fory.getClassResolver();
+    TypeResolver resolver = fory.getTypeResolver();
 
     // UByte
     Class ubyteClass = KotlinToJavaClass.INSTANCE.getUByteClass();
diff --git a/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/DurationSerializer.kt b/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/DurationSerializer.kt
index 51fa2d474..abcb45879 100644
--- a/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/DurationSerializer.kt
+++ b/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/DurationSerializer.kt
@@ -41,7 +41,7 @@ public class DurationSerializer(fory: Fory, needToWriteRef: Boolean) :
   ) : this(fory, fory.config.isTimeRefIgnored)
 
   private val durationUnitSerializer: Serializer<DurationUnit> by lazy {
-    fory.classResolver.getSerializer(DurationUnit::class.java)
+    fory.typeResolver.getSerializer(DurationUnit::class.java)
   }
 
   override fun write(buffer: MemoryBuffer, value: Duration) {
diff --git a/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/UnsignedArraySerializers.kt b/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/UnsignedArraySerializers.kt
index 388906848..344ab335a 100644
--- a/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/UnsignedArraySerializers.kt
+++ b/kotlin/src/main/kotlin/org/apache/fory/serializer/kotlin/UnsignedArraySerializers.kt
@@ -32,7 +32,7 @@ public abstract class AbstractDelegatingArraySerializer<T, T_Delegate>(
 ) : Serializer<T>(fory, cls) {
 
   // Lazily initialize the delegatingSerializer here to avoid lookup cost.
-  private val delegatingSerializer by lazy { fory.classResolver.getSerializer(delegateClass) }
+  private val delegatingSerializer by lazy { fory.typeResolver.getSerializer(delegateClass) }
 
   protected abstract fun toDelegateClass(value: T): T_Delegate
 
diff --git a/python/pyfory/meta/typedef_encoder.py b/python/pyfory/meta/typedef_encoder.py
index 49bd540c2..7cfb34889 100644
--- a/python/pyfory/meta/typedef_encoder.py
+++ b/python/pyfory/meta/typedef_encoder.py
@@ -97,11 +97,10 @@ def encode_typedef(type_resolver, cls, include_fields: bool = True):
     # Get the encoded binary (only the written portion, not the full buffer)
     binary = buffer.to_bytes(0, buffer.get_writer_index())
 
-    # Compress if beneficial
-    compressed_binary = type_resolver.get_meta_compressor().compress(binary)
-    is_compressed = len(compressed_binary) < len(binary)
-    if is_compressed:
-        binary = compressed_binary
+    # Temporary xlang behavior: always write TypeDef metadata uncompressed.
+    # Some runtimes still do not support TypeMeta decompression, so keep the
+    # xlang wire payload uncompressed until all xlang implementations support it.
+    is_compressed = False
     # Prepend header
     binary = prepend_header(binary, is_compressed, len(field_infos) > 0)
     # Extract namespace and typename
diff --git a/python/pyfory/tests/test_typedef_encoding.py b/python/pyfory/tests/test_typedef_encoding.py
index a3ec074c7..7496b9f9b 100644
--- a/python/pyfory/tests/test_typedef_encoding.py
+++ b/python/pyfory/tests/test_typedef_encoding.py
@@ -124,6 +124,7 @@ def test_encode_decode_typedef():
         # Encode a TypeDef
         typedef = encode_typedef(resolver, type_)
         print(f"typedef: {typedef}")
+        assert typedef.is_compressed is False
 
         # Create a buffer from the encoded data
         buffer = Buffer(typedef.encoded)
@@ -134,6 +135,7 @@ def test_encode_decode_typedef():
 
         # Verify the decoded TypeDef has the expected properties
         assert decoded_typedef.type_id == typedef.type_id
+        assert decoded_typedef.is_compressed is False
         assert decoded_typedef.is_compressed == typedef.is_compressed
         assert len(decoded_typedef.fields) == len(typedef.fields)
 
diff --git a/rust/fory-core/src/meta/type_meta.rs b/rust/fory-core/src/meta/type_meta.rs
index 771fd2064..368de1e18 100644
--- a/rust/fory-core/src/meta/type_meta.rs
+++ b/rust/fory-core/src/meta/type_meta.rs
@@ -1044,6 +1044,8 @@ impl TypeMeta {
         if write_meta_fields_flag {
             header |= HAS_FIELDS_META_FLAG;
         }
+        // Temporary xlang behavior: keep TypeMeta uncompressed.
+        // Some runtimes still do not support TypeMeta decompression.
         let is_compressed = false;
         if is_compressed {
             header |= COMPRESS_META_FLAG;
diff --git a/scala/src/main/java/org/apache/fory/serializer/scala/ScalaSerializers.java b/scala/src/main/java/org/apache/fory/serializer/scala/ScalaSerializers.java
index f3554edd1..973590000 100644
--- a/scala/src/main/java/org/apache/fory/serializer/scala/ScalaSerializers.java
+++ b/scala/src/main/java/org/apache/fory/serializer/scala/ScalaSerializers.java
@@ -22,7 +22,7 @@ package org.apache.fory.serializer.scala;
 import org.apache.fory.AbstractThreadSafeFory;
 import org.apache.fory.Fory;
 import org.apache.fory.ThreadSafeFory;
-import org.apache.fory.resolver.ClassResolver;
+import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.Serializer;
 import org.apache.fory.serializer.SerializerFactory;
 import scala.collection.immutable.NumericRange;
@@ -39,7 +39,7 @@ public class ScalaSerializers {
   }
 
   public static void registerSerializers(Fory fory) {
-    ClassResolver resolver = setSerializerFactory(fory);
+    TypeResolver resolver = setSerializerFactory(fory);
 
     resolver.registerSerializer(IterableToFactoryClass, new ToFactorySerializers.IterableToFactorySerializer(fory));
     resolver.registerSerializer(MapToFactoryClass, new ToFactorySerializers.MapToFactorySerializer(fory));
@@ -167,8 +167,8 @@ public class ScalaSerializers {
     resolver.register(scala.collection.mutable.BitSet$.class);
   }
 
-  private static ClassResolver setSerializerFactory(Fory fory) {
-    ClassResolver resolver = fory.getClassResolver();
+  private static TypeResolver setSerializerFactory(Fory fory) {
+    TypeResolver resolver = fory.getTypeResolver();
     ScalaDispatcher dispatcher = new ScalaDispatcher();
     SerializerFactory factory = resolver.getSerializerFactory();
     if (factory != null) {
diff --git a/scala/src/main/scala/org/apache/fory/serializer/scala/RangeSerializer.scala b/scala/src/main/scala/org/apache/fory/serializer/scala/RangeSerializer.scala
index fb0754b01..7b4f8d19b 100644
--- a/scala/src/main/scala/org/apache/fory/serializer/scala/RangeSerializer.scala
+++ b/scala/src/main/scala/org/apache/fory/serializer/scala/RangeSerializer.scala
@@ -72,7 +72,7 @@ class NumericRangeSerializer[A, T <: NumericRange[A]](fory: Fory, cls: Class[T])
 
   override def write(buffer: MemoryBuffer, value: T): Unit = {
     val cls = value.start.getClass
-    val resolver = fory.getClassResolver
+    val resolver = fory.getTypeResolver
     val classInfo = resolver.getTypeInfo(cls)
     resolver.writeTypeInfo(buffer, classInfo)
     val serializer = classInfo.getSerializer.asInstanceOf[Serializer[A]]
@@ -83,7 +83,7 @@ class NumericRangeSerializer[A, T <: NumericRange[A]](fory: Fory, cls: Class[T])
   }
 
   override def read(buffer: MemoryBuffer) = {
-    val resolver = fory.getClassResolver
+    val resolver = fory.getTypeResolver
     val classInfo = resolver.readTypeInfo(buffer)
     val serializer = classInfo.getSerializer.asInstanceOf[Serializer[A]]
     val start = serializer.read(buffer)
diff --git a/scala/src/test/scala/org/apache/fory/serializer/scala/CollectionSerializerTest.scala b/scala/src/test/scala/org/apache/fory/serializer/scala/CollectionSerializerTest.scala
index 394f60fed..5e27560f3 100644
--- a/scala/src/test/scala/org/apache/fory/serializer/scala/CollectionSerializerTest.scala
+++ b/scala/src/test/scala/org/apache/fory/serializer/scala/CollectionSerializerTest.scala
@@ -21,6 +21,7 @@ package org.apache.fory.serializer.scala
 
 import org.apache.fory.Fory
 import org.apache.fory.config.Language
+import org.apache.fory.resolver.ClassResolver
 import org.scalatest.matchers.should.Matchers
 import org.scalatest.wordspec.AnyWordSpec
 
@@ -36,7 +37,7 @@ class CollectionSerializerTest extends AnyWordSpec with Matchers {
       .build()
     ScalaSerializers.registerSerializers(fory1)
     if (setFactory) {
-      fory1.getClassResolver.setSerializerFactory(new ScalaDispatcher())
+      fory1.getTypeResolver.asInstanceOf[ClassResolver].setSerializerFactory(new ScalaDispatcher())
     }
     s"fory scala collection support: setOpt $setOpt, setFactory $setFactory" should {
       "serialize/deserialize Seq" in {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@fory.apache.org
For additional commands, e-mail: commits-help@fory.apache.org