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 bb5117ef feat(python): replace "_class" prefix with "_type" in 
metashare (#2290)
bb5117ef is described below

commit bb5117ef27569de44a85f51899ab993fec86b852
Author: urlyy <[email protected]>
AuthorDate: Wed Jun 4 10:39:42 2025 +0800

    feat(python): replace "_class" prefix with "_type" in metashare (#2290)
    
    ## What does this PR do?
    replace "_class" prefix with "_type" in metashare
    
    ## Related issues
    #2289
    
    ## Does this PR introduce any user-facing change?
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
---
 python/pyfory/__init__.py                  |   4 +-
 python/pyfory/_fory.py                     | 126 ++++-----
 python/pyfory/_registry.py                 | 160 ++++++-----
 python/pyfory/_serialization.pyx           | 432 ++++++++++++++---------------
 python/pyfory/_serializer.py               |  90 +++---
 python/pyfory/_struct.py                   |  40 ++-
 python/pyfory/error.py                     |   2 +-
 python/pyfory/format/infer.py              |  10 +-
 python/pyfory/serializer.py                |  16 +-
 python/pyfory/tests/test_cross_language.py |   2 +-
 python/pyfory/tests/test_serializer.py     |  34 +--
 python/pyfory/tests/test_struct.py         |   6 +-
 12 files changed, 459 insertions(+), 463 deletions(-)

diff --git a/python/pyfory/__init__.py b/python/pyfory/__init__.py
index 081dc736..fad053c0 100644
--- a/python/pyfory/__init__.py
+++ b/python/pyfory/__init__.py
@@ -26,10 +26,10 @@ try:
 except ImportError:
     ENABLE_FORY_CYTHON_SERIALIZATION = False
 
-from pyfory._registry import ClassInfo
+from pyfory._registry import TypeInfo
 
 if ENABLE_FORY_CYTHON_SERIALIZATION:
-    from pyfory._serialization import Fory, ClassInfo  # noqa: F401,F811
+    from pyfory._serialization import Fory, TypeInfo  # noqa: F401,F811
 
 from pyfory._struct import (  # noqa: F401,F403,F811 # pylint: 
disable=unused-import
     ComplexObjectSerializer,
diff --git a/python/pyfory/_fory.py b/python/pyfory/_fory.py
index 135266fb..86e83641 100644
--- a/python/pyfory/_fory.py
+++ b/python/pyfory/_fory.py
@@ -47,19 +47,19 @@ logger = logging.getLogger(__name__)
 MAGIC_NUMBER = 0x62D4
 DEFAULT_DYNAMIC_WRITE_META_STR_ID = -1
 DYNAMIC_TYPE_ID = -1
-USE_CLASSNAME = 0
-USE_CLASS_ID = 1
-# preserve 0 as flag for class id not set in ClassInfo`
-NO_CLASS_ID = 0
-INT64_CLASS_ID = TypeId.INT64
-FLOAT64_CLASS_ID = TypeId.FLOAT64
-BOOL_CLASS_ID = TypeId.BOOL
-STRING_CLASS_ID = TypeId.STRING
-# `NOT_NULL_VALUE_FLAG` + `CLASS_ID << 1` in little-endian order
-NOT_NULL_INT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (INT64_CLASS_ID << 8)
-NOT_NULL_FLOAT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (FLOAT64_CLASS_ID 
<< 8)
-NOT_NULL_BOOL_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (BOOL_CLASS_ID << 8)
-NOT_NULL_STRING_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (STRING_CLASS_ID << 
8)
+USE_TYPE_NAME = 0
+USE_TYPE_ID = 1
+# preserve 0 as flag for type id not set in TypeInfo`
+NO_TYPE_ID = 0
+INT64_TYPE_ID = TypeId.INT64
+FLOAT64_TYPE_ID = TypeId.FLOAT64
+BOOL_TYPE_ID = TypeId.BOOL
+STRING_TYPE_ID = TypeId.STRING
+# `NOT_NULL_VALUE_FLAG` + `TYPE_ID << 1` in little-endian order
+NOT_NULL_INT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (INT64_TYPE_ID << 8)
+NOT_NULL_FLOAT64_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (FLOAT64_TYPE_ID << 
8)
+NOT_NULL_BOOL_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (BOOL_TYPE_ID << 8)
+NOT_NULL_STRING_FLAG = NOT_NULL_VALUE_FLAG & 0b11111111 | (STRING_TYPE_ID << 8)
 SMALL_STRING_THRESHOLD = 16
 
 
@@ -100,9 +100,9 @@ class Fory:
         "is_py",
         "ref_tracking",
         "ref_resolver",
-        "class_resolver",
+        "type_resolver",
         "serialization_context",
-        "require_class_registration",
+        "require_type_registration",
         "buffer",
         "pickler",
         "unpickler",
@@ -119,22 +119,22 @@ class Fory:
         self,
         language=Language.XLANG,
         ref_tracking: bool = False,
-        require_class_registration: bool = True,
+        require_type_registration: bool = True,
     ):
         """
-        :param require_class_registration:
-         Whether to require registering classes for serialization, enabled by 
default.
-          If disabled, unknown insecure classes can be deserialized, which can 
be
-          insecure and cause remote code execution attack if the classes
+        :param require_type_registration:
+         Whether to require registering types for serialization, enabled by 
default.
+          If disabled, unknown insecure types can be deserialized, which can be
+          insecure and cause remote code execution attack if the types
           `__new__`/`__init__`/`__eq__`/`__hash__` method contain malicious 
code.
-          Do not disable class registration if you can't ensure your 
environment are
+          Do not disable type registration if you can't ensure your 
environment are
           *indeed secure*. We are not responsible for security risks if
           you disable this option.
         """
         self.language = language
         self.is_py = language == Language.PYTHON
-        self.require_class_registration = (
-            _ENABLE_CLASS_REGISTRATION_FORCIBLY or require_class_registration
+        self.require_type_registration = (
+            _ENABLE_TYPE_REGISTRATION_FORCIBLY or require_type_registration
         )
         self.ref_tracking = ref_tracking
         if self.ref_tracking:
@@ -142,16 +142,16 @@ class Fory:
         else:
             self.ref_resolver = NoRefResolver()
         from pyfory._serialization import MetaStringResolver
-        from pyfory._registry import ClassResolver
+        from pyfory._registry import TypeResolver
 
         self.metastring_resolver = MetaStringResolver()
-        self.class_resolver = ClassResolver(self)
-        self.class_resolver.initialize()
+        self.type_resolver = TypeResolver(self)
+        self.type_resolver.initialize()
         self.serialization_context = SerializationContext()
         self.buffer = Buffer.allocate(32)
-        if not require_class_registration:
+        if not require_type_registration:
             warnings.warn(
-                "Class registration is disabled, unknown classes can be 
deserialized "
+                "Type registration is disabled, unknown types can be 
deserialized "
                 "which may be insecure.",
                 RuntimeWarning,
                 stacklevel=2,
@@ -168,7 +168,7 @@ class Fory:
         self._peer_language = None
 
     def register_serializer(self, cls: type, serializer):
-        self.class_resolver.register_serializer(cls, serializer)
+        self.type_resolver.register_serializer(cls, serializer)
 
     # `Union[type, TypeVar]` is not supported in py3.6
     def register_type(
@@ -180,7 +180,7 @@ class Fory:
         typename: str = None,
         serializer=None,
     ):
-        return self.class_resolver.register_type(
+        return self.type_resolver.register_type(
             cls,
             type_id=type_id,
             namespace=namespace,
@@ -257,7 +257,7 @@ class Fory:
         else:
             return buffer.to_bytes(0, buffer.writer_index)
 
-    def serialize_ref(self, buffer, obj, classinfo=None):
+    def serialize_ref(self, buffer, obj, typeinfo=None):
         cls = type(obj)
         if cls is str:
             buffer.write_int16(NOT_NULL_STRING_FLAG)
@@ -273,29 +273,29 @@ class Fory:
             return
         if self.ref_resolver.write_ref_or_null(buffer, obj):
             return
-        if classinfo is None:
-            classinfo = self.class_resolver.get_classinfo(cls)
-        self.class_resolver.write_typeinfo(buffer, classinfo)
-        classinfo.serializer.write(buffer, obj)
+        if typeinfo is None:
+            typeinfo = self.type_resolver.get_typeinfo(cls)
+        self.type_resolver.write_typeinfo(buffer, typeinfo)
+        typeinfo.serializer.write(buffer, obj)
 
     def serialize_nonref(self, buffer, obj):
         cls = type(obj)
         if cls is str:
-            buffer.write_varuint32(STRING_CLASS_ID)
+            buffer.write_varuint32(STRING_TYPE_ID)
             buffer.write_string(obj)
             return
         elif cls is int:
-            buffer.write_varuint32(INT64_CLASS_ID)
+            buffer.write_varuint32(INT64_TYPE_ID)
             buffer.write_varint64(obj)
             return
         elif cls is bool:
-            buffer.write_varuint32(BOOL_CLASS_ID)
+            buffer.write_varuint32(BOOL_TYPE_ID)
             buffer.write_bool(obj)
             return
         else:
-            classinfo = self.class_resolver.get_classinfo(cls)
-            self.class_resolver.write_typeinfo(buffer, classinfo)
-            classinfo.serializer.write(buffer, obj)
+            typeinfo = self.type_resolver.get_typeinfo(cls)
+            self.type_resolver.write_typeinfo(buffer, typeinfo)
+            typeinfo.serializer.write(buffer, obj)
 
     def xserialize_ref(self, buffer, obj, serializer=None):
         if serializer is None or serializer.need_to_write_ref:
@@ -313,9 +313,9 @@ class Fory:
             serializer.xwrite(buffer, obj)
             return
         cls = type(obj)
-        classinfo = self.class_resolver.get_classinfo(cls)
-        self.class_resolver.write_typeinfo(buffer, classinfo)
-        classinfo.serializer.xwrite(buffer, obj)
+        typeinfo = self.type_resolver.get_typeinfo(cls)
+        self.type_resolver.write_typeinfo(buffer, typeinfo)
+        typeinfo.serializer.xwrite(buffer, obj)
 
     def deserialize(
         self,
@@ -381,8 +381,8 @@ class Fory:
         ref_id = ref_resolver.try_preserve_ref_id(buffer)
         # indicates that the object is first read.
         if ref_id >= NOT_NULL_VALUE_FLAG:
-            classinfo = self.class_resolver.read_typeinfo(buffer)
-            o = classinfo.serializer.read(buffer)
+            typeinfo = self.type_resolver.read_typeinfo(buffer)
+            o = typeinfo.serializer.read(buffer)
             ref_resolver.set_read_object(ref_id, o)
             return o
         else:
@@ -390,8 +390,8 @@ class Fory:
 
     def deserialize_nonref(self, buffer):
         """Deserialize not-null and non-reference object from buffer."""
-        classinfo = self.class_resolver.read_typeinfo(buffer)
-        return classinfo.serializer.read(buffer)
+        typeinfo = self.type_resolver.read_typeinfo(buffer)
+        return typeinfo.serializer.read(buffer)
 
     def xdeserialize_ref(self, buffer, serializer=None):
         if serializer is None or serializer.need_to_write_ref:
@@ -411,7 +411,7 @@ class Fory:
 
     def xdeserialize_nonref(self, buffer, serializer=None):
         if serializer is None:
-            serializer = self.class_resolver.read_typeinfo(buffer).serializer
+            serializer = self.type_resolver.read_typeinfo(buffer).serializer
         return serializer.xread(buffer)
 
     def write_buffer_object(self, buffer, buffer_object: BufferObject):
@@ -457,20 +457,20 @@ class Fory:
             assert self._unsupported_objects is not None
             return next(self._unsupported_objects)
 
-    def write_ref_pyobject(self, buffer, value, classinfo=None):
+    def write_ref_pyobject(self, buffer, value, typeinfo=None):
         if self.ref_resolver.write_ref_or_null(buffer, value):
             return
-        if classinfo is None:
-            classinfo = self.class_resolver.get_classinfo(type(value))
-        self.class_resolver.write_typeinfo(buffer, classinfo)
-        classinfo.serializer.write(buffer, value)
+        if typeinfo is None:
+            typeinfo = self.type_resolver.get_typeinfo(type(value))
+        self.type_resolver.write_typeinfo(buffer, typeinfo)
+        typeinfo.serializer.write(buffer, value)
 
     def read_ref_pyobject(self, buffer):
         return self.deserialize_ref(buffer)
 
     def reset_write(self):
         self.ref_resolver.reset_write()
-        self.class_resolver.reset_write()
+        self.type_resolver.reset_write()
         self.serialization_context.reset()
         self.metastring_resolver.reset_write()
         self.pickler.clear_memo()
@@ -479,7 +479,7 @@ class Fory:
 
     def reset_read(self):
         self.ref_resolver.reset_read()
-        self.class_resolver.reset_read()
+        self.type_resolver.reset_read()
         self.serialization_context.reset()
         self.metastring_resolver.reset_write()
         self.unpickler = None
@@ -521,8 +521,8 @@ class SerializationContext:
             self.objects.clear()
 
 
-_ENABLE_CLASS_REGISTRATION_FORCIBLY = os.getenv(
-    "ENABLE_CLASS_REGISTRATION_FORCIBLY", "0"
+_ENABLE_TYPE_REGISTRATION_FORCIBLY = os.getenv(
+    "ENABLE_TYPE_REGISTRATION_FORCIBLY", "0"
 ) in {
     "1",
     "true",
@@ -532,9 +532,9 @@ _ENABLE_CLASS_REGISTRATION_FORCIBLY = os.getenv(
 class _PicklerStub:
     def dump(self, o):
         raise ValueError(
-            f"Class {type(o)} is not registered, "
-            f"pickle is not allowed when class registration enabled, Please 
register"
-            f"the class or pass unsupported_callback"
+            f"Type {type(o)} is not registered, "
+            f"pickle is not allowed when type registration enabled, Please 
register"
+            f"the type or pass unsupported_callback"
         )
 
     def clear_memo(self):
@@ -544,6 +544,6 @@ class _PicklerStub:
 class _UnpicklerStub:
     def load(self):
         raise ValueError(
-            "pickle is not allowed when class registration enabled, Please 
register"
-            "the class or pass unsupported_callback"
+            "pickle is not allowed when type registration enabled, Please 
register"
+            "the type or pass unsupported_callback"
         )
diff --git a/python/pyfory/_registry.py b/python/pyfory/_registry.py
index 47ca1b72..6c3790c8 100644
--- a/python/pyfory/_registry.py
+++ b/python/pyfory/_registry.py
@@ -74,8 +74,8 @@ from pyfory.type import (
 )
 from pyfory._fory import (
     DYNAMIC_TYPE_ID,
-    # preserve 0 as flag for class id not set in ClassInfo`
-    NO_CLASS_ID,
+    # preserve 0 as flag for type id not set in TypeInfo`
+    NO_TYPE_ID,
 )
 
 try:
@@ -87,10 +87,10 @@ logger = logging.getLogger(__name__)
 
 
 if ENABLE_FORY_CYTHON_SERIALIZATION:
-    from pyfory._serialization import ClassInfo
+    from pyfory._serialization import TypeInfo
 else:
 
-    class ClassInfo:
+    class TypeInfo:
         __slots__ = (
             "cls",
             "type_id",
@@ -103,7 +103,7 @@ else:
         def __init__(
             self,
             cls: type = None,
-            type_id: int = NO_CLASS_ID,
+            type_id: int = NO_TYPE_ID,
             serializer: Serializer = None,
             namespace_bytes=None,
             typename_bytes=None,
@@ -118,26 +118,26 @@ else:
 
         def __repr__(self):
             return (
-                f"ClassInfo(cls={self.cls}, type_id={self.type_id}, "
+                f"TypeInfo(cls={self.cls}, type_id={self.type_id}, "
                 f"serializer={self.serializer})"
             )
 
 
-class ClassResolver:
+class TypeResolver:
     __slots__ = (
         "fory",
         "_metastr_to_str",
         "_type_id_counter",
-        "_classes_info",
+        "_types_info",
         "_hash_to_metastring",
-        "_metastr_to_class",
-        "_hash_to_classinfo",
-        "_dynamic_id_to_classinfo_list",
+        "_metastr_to_type",
+        "_hash_to_typeinfo",
+        "_dynamic_id_to_typeinfo_list",
         "_dynamic_id_to_metastr_list",
         "_dynamic_write_string_id",
         "_dynamic_written_metastr",
-        "_ns_type_to_classinfo",
-        "_named_type_to_classinfo",
+        "_ns_type_to_typeinfo",
+        "_named_type_to_typeinfo",
         "namespace_encoder",
         "namespace_decoder",
         "typename_encoder",
@@ -145,27 +145,27 @@ class ClassResolver:
         "require_registration",
         "metastring_resolver",
         "language",
-        "_type_id_to_classinfo",
+        "_type_id_to_typeinfo",
     )
 
     def __init__(self, fory):
         self.fory = fory
         self.metastring_resolver = fory.metastring_resolver
         self.language = fory.language
-        self.require_registration = fory.require_class_registration
+        self.require_registration = fory.require_type_registration
         self._metastr_to_str = dict()
-        self._metastr_to_class = dict()
+        self._metastr_to_type = dict()
         self._hash_to_metastring = dict()
-        self._hash_to_classinfo = dict()
+        self._hash_to_typeinfo = dict()
         self._dynamic_written_metastr = []
-        self._type_id_to_classinfo = dict()
+        self._type_id_to_typeinfo = dict()
         self._type_id_counter = 64
         self._dynamic_write_string_id = 0
         # hold objects to avoid gc, since `flat_hash_map/vector` doesn't
         # hold python reference.
-        self._classes_info = dict()
-        self._ns_type_to_classinfo = dict()
-        self._named_type_to_classinfo = dict()
+        self._types_info = dict()
+        self._ns_type_to_typeinfo = dict()
+        self._named_type_to_typeinfo = dict()
         self.namespace_encoder = MetaStringEncoder(".", "_")
         self.namespace_decoder = MetaStringDecoder(".", "_")
         self.typename_encoder = MetaStringEncoder("$", "_")
@@ -180,7 +180,7 @@ class ClassResolver:
         register = functools.partial(self._register_type, internal=True)
         register(
             _PickleStub,
-            type_id=PickleSerializer.PICKLE_CLASS_ID,
+            type_id=PickleSerializer.PICKLE_TYPE_ID,
             serializer=PickleSerializer,
         )
         register(
@@ -297,7 +297,7 @@ class ClassResolver:
         serializer=None,
         internal=False,
     ):
-        """Register class with given type id or typename. If typename is not 
None, it will be used for
+        """Register type with given type id or typename. If typename is not 
None, it will be used for
         cross-language serialization."""
         if serializer is not None and not isinstance(serializer, Serializer):
             try:
@@ -315,10 +315,10 @@ class ClassResolver:
                 f"type name {typename} and id {type_id} should not be set at 
the same time"
             )
         if type_id not in {0, None}:
-            # multiple class can have same tpe id
-            if type_id in self._type_id_to_classinfo and cls in 
self._classes_info:
+            # multiple type can have same tpe id
+            if type_id in self._type_id_to_typeinfo and cls in 
self._types_info:
                 raise TypeError(f"{cls} registered already")
-        elif cls in self._classes_info:
+        elif cls in self._types_info:
             raise TypeError(f"{cls} registered already")
         register_type = (
             self._register_xtype
@@ -405,7 +405,7 @@ class ClassResolver:
         if not internal and serializer is None:
             serializer = self._create_serializer(cls)
         if typename is None:
-            classinfo = ClassInfo(cls, type_id, serializer, None, None, 
dynamic_type)
+            typeinfo = TypeInfo(cls, type_id, serializer, None, None, 
dynamic_type)
         else:
             if namespace is None:
                 splits = typename.rsplit(".", 1)
@@ -415,71 +415,71 @@ class ClassResolver:
             ns_meta_bytes = 
self.metastring_resolver.get_metastr_bytes(ns_metastr)
             type_metastr = self.typename_encoder.encode(typename)
             type_meta_bytes = 
self.metastring_resolver.get_metastr_bytes(type_metastr)
-            classinfo = ClassInfo(
+            typeinfo = TypeInfo(
                 cls, type_id, serializer, ns_meta_bytes, type_meta_bytes, 
dynamic_type
             )
-            self._named_type_to_classinfo[(namespace, typename)] = classinfo
-            self._ns_type_to_classinfo[(ns_meta_bytes, type_meta_bytes)] = 
classinfo
-        self._classes_info[cls] = classinfo
+            self._named_type_to_typeinfo[(namespace, typename)] = typeinfo
+            self._ns_type_to_typeinfo[(ns_meta_bytes, type_meta_bytes)] = 
typeinfo
+        self._types_info[cls] = typeinfo
         if type_id > 0 and (
             self.language == Language.PYTHON or not 
TypeId.is_namespaced_type(type_id)
         ):
-            if type_id not in self._type_id_to_classinfo or not internal:
-                self._type_id_to_classinfo[type_id] = classinfo
-        self._classes_info[cls] = classinfo
-        return classinfo
+            if type_id not in self._type_id_to_typeinfo or not internal:
+                self._type_id_to_typeinfo[type_id] = typeinfo
+        self._types_info[cls] = typeinfo
+        return typeinfo
 
     def _next_type_id(self):
         type_id = self._type_id_counter = self._type_id_counter + 1
-        while type_id in self._type_id_to_classinfo:
+        while type_id in self._type_id_to_typeinfo:
             type_id = self._type_id_counter = self._type_id_counter + 1
         return type_id
 
     def register_serializer(self, cls: Union[type, TypeVar], serializer):
         assert isinstance(cls, (type, TypeVar)), cls
-        if cls not in self._classes_info:
+        if cls not in self._types_info:
             raise TypeUnregisteredError(f"{cls} not registered")
-        classinfo = self._classes_info[cls]
+        typeinfo = self._types_info[cls]
         if self.fory.language == Language.PYTHON:
-            classinfo.serializer = serializer
+            typeinfo.serializer = serializer
             return
-        type_id = prev_type_id = classinfo.type_id
-        self._type_id_to_classinfo.pop(prev_type_id)
-        if classinfo.serializer is not serializer:
-            if classinfo.typename_bytes is not None:
-                type_id = classinfo.type_id & 0xFFFFFF00 | TypeId.NAMED_EXT
+        type_id = prev_type_id = typeinfo.type_id
+        self._type_id_to_typeinfo.pop(prev_type_id)
+        if typeinfo.serializer is not serializer:
+            if typeinfo.typename_bytes is not None:
+                type_id = typeinfo.type_id & 0xFFFFFF00 | TypeId.NAMED_EXT
             else:
-                type_id = classinfo.type_id & 0xFFFFFF00 | TypeId.EXT
-        self._type_id_to_classinfo[type_id] = classinfo
+                type_id = typeinfo.type_id & 0xFFFFFF00 | TypeId.EXT
+        self._type_id_to_typeinfo[type_id] = typeinfo
 
     def get_serializer(self, cls: type):
         """
         Returns
         -------
-            Returns or create serializer for the provided class
+            Returns or create serializer for the provided type
         """
-        return self.get_classinfo(cls).serializer
-
-    def get_classinfo(self, cls, create=True):
-        class_info = self._classes_info.get(cls)
-        if class_info is not None:
-            if class_info.serializer is None:
-                class_info.serializer = self._create_serializer(cls)
-            return class_info
+        return self.get_typeinfo(cls).serializer
+
+    def get_typeinfo(self, cls, create=True):
+        type_info = self._types_info.get(cls)
+        if type_info is not None:
+            if type_info.serializer is None:
+                type_info.serializer = self._create_serializer(cls)
+            return type_info
         elif not create:
             return None
         if self.language != Language.PYTHON or (
             self.require_registration and not issubclass(cls, Enum)
         ):
             raise TypeUnregisteredError(f"{cls} not registered")
-        logger.info("Class %s not registered", cls)
+        logger.info("Type %s not registered", cls)
         serializer = self._create_serializer(cls)
         type_id = None
         if self.language == Language.PYTHON:
             if isinstance(serializer, EnumSerializer):
                 type_id = TypeId.NAMED_ENUM
             elif type(serializer) is PickleSerializer:
-                type_id = PickleSerializer.PICKLE_CLASS_ID
+                type_id = PickleSerializer.PICKLE_TYPE_ID
             if not self.require_registration:
                 if isinstance(serializer, DataClassSerializer):
                     type_id = TypeId.NAMED_STRUCT
@@ -497,13 +497,13 @@ class ClassResolver:
 
     def _create_serializer(self, cls):
         for clz in cls.__mro__:
-            class_info = self._classes_info.get(clz)
+            type_info = self._types_info.get(clz)
             if (
-                class_info
-                and class_info.serializer
-                and class_info.serializer.support_subclass()
+                type_info
+                and type_info.serializer
+                and type_info.serializer.support_subclass()
             ):
-                serializer = type(class_info.serializer)(self.fory, cls)
+                serializer = type(type_info.serializer)(self.fory, cls)
                 break
         else:
             if dataclasses.is_dataclass(cls):
@@ -516,34 +516,34 @@ class ClassResolver:
                 serializer = PickleSerializer(self.fory, cls)
         return serializer
 
-    def _load_metabytes_to_classinfo(self, ns_metabytes, type_metabytes):
-        typeinfo = self._ns_type_to_classinfo.get((ns_metabytes, 
type_metabytes))
+    def _load_metabytes_to_typeinfo(self, ns_metabytes, type_metabytes):
+        typeinfo = self._ns_type_to_typeinfo.get((ns_metabytes, 
type_metabytes))
         if typeinfo is not None:
             return typeinfo
         ns = ns_metabytes.decode(self.namespace_decoder)
         typename = type_metabytes.decode(self.typename_decoder)
         # the hash computed between languages may be different.
-        typeinfo = self._named_type_to_classinfo.get((ns, typename))
+        typeinfo = self._named_type_to_typeinfo.get((ns, typename))
         if typeinfo is not None:
-            self._ns_type_to_classinfo[(ns_metabytes, type_metabytes)] = 
typeinfo
+            self._ns_type_to_typeinfo[(ns_metabytes, type_metabytes)] = 
typeinfo
             return typeinfo
         cls = load_class(ns + "#" + typename)
-        classinfo = self.get_classinfo(cls)
-        self._ns_type_to_classinfo[(ns_metabytes, type_metabytes)] = classinfo
-        return classinfo
+        typeinfo = self.get_typeinfo(cls)
+        self._ns_type_to_typeinfo[(ns_metabytes, type_metabytes)] = typeinfo
+        return typeinfo
 
-    def write_typeinfo(self, buffer, classinfo):
-        if classinfo.dynamic_type:
+    def write_typeinfo(self, buffer, typeinfo):
+        if typeinfo.dynamic_type:
             return
-        type_id = classinfo.type_id
+        type_id = typeinfo.type_id
         internal_type_id = type_id & 0xFF
         buffer.write_varuint32(type_id)
         if TypeId.is_namespaced_type(internal_type_id):
             self.metastring_resolver.write_meta_string_bytes(
-                buffer, classinfo.namespace_bytes
+                buffer, typeinfo.namespace_bytes
             )
             self.metastring_resolver.write_meta_string_bytes(
-                buffer, classinfo.typename_bytes
+                buffer, typeinfo.typename_bytes
             )
 
     def read_typeinfo(self, buffer):
@@ -552,23 +552,21 @@ class ClassResolver:
         if TypeId.is_namespaced_type(internal_type_id):
             ns_metabytes = 
self.metastring_resolver.read_meta_string_bytes(buffer)
             type_metabytes = 
self.metastring_resolver.read_meta_string_bytes(buffer)
-            typeinfo = self._ns_type_to_classinfo.get((ns_metabytes, 
type_metabytes))
+            typeinfo = self._ns_type_to_typeinfo.get((ns_metabytes, 
type_metabytes))
             if typeinfo is None:
                 ns = ns_metabytes.decode(self.namespace_decoder)
                 typename = type_metabytes.decode(self.typename_decoder)
-                typeinfo = self._named_type_to_classinfo.get((ns, typename))
+                typeinfo = self._named_type_to_typeinfo.get((ns, typename))
                 if typeinfo is not None:
-                    self._ns_type_to_classinfo[
-                        (ns_metabytes, type_metabytes)
-                    ] = typeinfo
+                    self._ns_type_to_typeinfo[(ns_metabytes, type_metabytes)] 
= typeinfo
                     return typeinfo
-                # TODO(chaokunyang) generate a dynamic class and serializer
+                # TODO(chaokunyang) generate a dynamic type and serializer
                 #  when meta share is enabled.
                 name = ns + "." + typename if ns else typename
                 raise TypeUnregisteredError(f"{name} not registered")
             return typeinfo
         else:
-            return self._type_id_to_classinfo[type_id]
+            return self._type_id_to_typeinfo[type_id]
 
     def reset(self):
         pass
diff --git a/python/pyfory/_serialization.pyx b/python/pyfory/_serialization.pyx
index 9b39efd3..f635dcc9 100644
--- a/python/pyfory/_serialization.pyx
+++ b/python/pyfory/_serialization.pyx
@@ -31,7 +31,7 @@ from pyfory._util import get_bit, set_bit, clear_bit
 from pyfory import _fory as fmod
 from pyfory._fory import Language
 from pyfory._fory import _PicklerStub, _UnpicklerStub, Pickler, Unpickler
-from pyfory._fory import _ENABLE_CLASS_REGISTRATION_FORCIBLY
+from pyfory._fory import _ENABLE_TYPE_REGISTRATION_FORCIBLY
 from pyfory.lib import mmh3
 from pyfory.meta.metastring import Encoding
 from pyfory.type import is_primitive_type
@@ -219,15 +219,15 @@ cdef class MapRefResolver:
         self.read_object = None
 
 
-cdef int8_t USE_CLASSNAME = 0
-cdef int8_t USE_CLASS_ID = 1
-# preserve 0 as flag for class id not set in ClassInfo`
-cdef int8_t NO_CLASS_ID = 0
+cdef int8_t USE_TYPE_NAME = 0
+cdef int8_t USE_TYPE_ID = 1
+# preserve 0 as flag for type id not set in TypeInfo`
+cdef int8_t NO_TYPE_ID = 0
 cdef int8_t DEFAULT_DYNAMIC_WRITE_META_STR_ID = 
fmod.DEFAULT_DYNAMIC_WRITE_META_STR_ID
-cdef int8_t INT64_CLASS_ID = fmod.INT64_CLASS_ID
-cdef int8_t FLOAT64_CLASS_ID = fmod.FLOAT64_CLASS_ID
-cdef int8_t BOOL_CLASS_ID = fmod.BOOL_CLASS_ID
-cdef int8_t STRING_CLASS_ID = fmod.STRING_CLASS_ID
+cdef int8_t INT64_TYPE_ID = fmod.INT64_TYPE_ID
+cdef int8_t FLOAT64_TYPE_ID = fmod.FLOAT64_TYPE_ID
+cdef int8_t BOOL_TYPE_ID = fmod.BOOL_TYPE_ID
+cdef int8_t STRING_TYPE_ID = fmod.STRING_TYPE_ID
 
 cdef int16_t MAGIC_NUMBER = fmod.MAGIC_NUMBER
 cdef int32_t NOT_NULL_INT64_FLAG = fmod.NOT_NULL_INT64_FLAG
@@ -373,7 +373,7 @@ cdef class MetaStringResolver:
 
 
 @cython.final
-cdef class ClassInfo:
+cdef class TypeInfo:
     """
     If dynamic_type is true, the serializer will be a dynamic typed serializer
     and it will write type info when writing the data.
@@ -398,7 +398,7 @@ cdef class ClassInfo:
     def __init__(
             self,
             cls: Union[type, TypeVar] = None,
-            type_id: int = NO_CLASS_ID,
+            type_id: int = NO_TYPE_ID,
             serializer: Serializer = None,
             namespace_bytes: MetaStringBytes = None,
             typename_bytes: MetaStringBytes = None,
@@ -412,33 +412,33 @@ cdef class ClassInfo:
         self.dynamic_type = dynamic_type
 
     def __repr__(self):
-        return f"ClassInfo(cls={self.cls}, type_id={self.type_id}, " \
+        return f"TypeInfo(cls={self.cls}, type_id={self.type_id}, " \
                f"serializer={self.serializer})"
 
 
 @cython.final
-cdef class ClassResolver:
+cdef class TypeResolver:
     cdef:
         readonly Fory fory
         readonly MetaStringResolver metastring_resolver
         object _resolver
-        vector[PyObject *] _c_registered_id_to_class_info
-        # cls -> ClassInfo
-        flat_hash_map[uint64_t, PyObject *] _c_classes_info
-        # hash -> ClassInfo
-        flat_hash_map[pair[int64_t, int64_t], PyObject *] 
_c_meta_hash_to_classinfo
+        vector[PyObject *] _c_registered_id_to_type_info
+        # cls -> TypeInfo
+        flat_hash_map[uint64_t, PyObject *] _c_types_info
+        # hash -> TypeInfo
+        flat_hash_map[pair[int64_t, int64_t], PyObject *] 
_c_meta_hash_to_typeinfo
         MetaStringResolver meta_string_resolver
 
     def __init__(self, fory):
         self.fory = fory
         self.metastring_resolver = fory.metastring_resolver
-        from pyfory._registry import ClassResolver
-        self._resolver = ClassResolver(fory)
+        from pyfory._registry import TypeResolver
+        self._resolver = TypeResolver(fory)
 
     def initialize(self):
         self._resolver.initialize()
-        for classinfo in self._resolver._classes_info.values():
-            self._populate_typeinfo(classinfo)
+        for typeinfo in self._resolver._types_info.values():
+            self._populate_typeinfo(typeinfo)
 
     def register_type(
             self,
@@ -460,72 +460,72 @@ cdef class ClassResolver:
 
     cdef _populate_typeinfo(self, typeinfo):
         type_id = typeinfo.type_id
-        if type_id >= self._c_registered_id_to_class_info.size():
-            self._c_registered_id_to_class_info.resize(type_id * 2, NULL)
+        if type_id >= self._c_registered_id_to_type_info.size():
+            self._c_registered_id_to_type_info.resize(type_id * 2, NULL)
         if type_id > 0 and (self.fory.language == Language.PYTHON or not 
IsNamespacedType(type_id)):
-            self._c_registered_id_to_class_info[type_id] = <PyObject *> 
typeinfo
-        self._c_classes_info[<uintptr_t> <PyObject *> typeinfo.cls] = 
<PyObject *> typeinfo
+            self._c_registered_id_to_type_info[type_id] = <PyObject *> typeinfo
+        self._c_types_info[<uintptr_t> <PyObject *> typeinfo.cls] = <PyObject 
*> typeinfo
         if typeinfo.typename_bytes is not None:
-            self._load_bytes_to_classinfo(type_id, typeinfo.namespace_bytes, 
typeinfo.typename_bytes)
+            self._load_bytes_to_typeinfo(type_id, typeinfo.namespace_bytes, 
typeinfo.typename_bytes)
 
     def register_serializer(self, cls: Union[type, TypeVar], serializer):
-        classinfo1 = self._resolver.get_classinfo(cls)
+        typeinfo1 = self._resolver.get_typeinfo(cls)
         self._resolver.register_serializer(cls, serializer)
-        classinfo2 = self._resolver.get_classinfo(cls)
-        if classinfo1.type_id != classinfo2.type_id:
-            self._c_registered_id_to_class_info[classinfo1.type_id] = NULL
-            self._populate_typeinfo(classinfo2)
+        typeinfo2 = self._resolver.get_typeinfo(cls)
+        if typeinfo1.type_id != typeinfo2.type_id:
+            self._c_registered_id_to_type_info[typeinfo1.type_id] = NULL
+            self._populate_typeinfo(typeinfo2)
 
     cpdef inline Serializer get_serializer(self, cls):
         """
         Returns
         -------
-            Returns or create serializer for the provided class
+            Returns or create serializer for the provided type
         """
-        return self.get_classinfo(cls).serializer
-
-    cpdef inline ClassInfo get_classinfo(self, cls, create=True):
-        cdef PyObject * classinfo_ptr = self._c_classes_info[<uintptr_t> 
<PyObject *> cls]
-        cdef ClassInfo class_info
-        if classinfo_ptr != NULL:
-            class_info = <object> classinfo_ptr
-            if class_info.serializer is not None:
-                return class_info
+        return self.get_typeinfo(cls).serializer
+
+    cpdef inline TypeInfo get_typeinfo(self, cls, create=True):
+        cdef PyObject * typeinfo_ptr = self._c_types_info[<uintptr_t> 
<PyObject *> cls]
+        cdef TypeInfo type_info
+        if typeinfo_ptr != NULL:
+            type_info = <object> typeinfo_ptr
+            if type_info.serializer is not None:
+                return type_info
             else:
-                class_info.serializer = self._resolver._create_serializer(cls)
-                return class_info
+                type_info.serializer = self._resolver._create_serializer(cls)
+                return type_info
         elif not create:
             return None
         else:
-            class_info = self._resolver.get_classinfo(cls, create=create)
-            self._c_classes_info[<uintptr_t> <PyObject *> cls] = <PyObject *> 
class_info
-            self._populate_typeinfo(class_info)
-            return class_info
+            type_info = self._resolver.get_typeinfo(cls, create=create)
+            self._c_types_info[<uintptr_t> <PyObject *> cls] = <PyObject *> 
type_info
+            self._populate_typeinfo(type_info)
+            return type_info
 
-    cdef inline ClassInfo _load_bytes_to_classinfo(
+    cdef inline TypeInfo _load_bytes_to_typeinfo(
             self, int32_t type_id, MetaStringBytes ns_metabytes, 
MetaStringBytes type_metabytes):
-        cdef PyObject * classinfo_ptr = self._c_meta_hash_to_classinfo[
+        cdef PyObject * typeinfo_ptr = self._c_meta_hash_to_typeinfo[
             pair[int64_t, int64_t](ns_metabytes.hashcode, 
type_metabytes.hashcode)]
-        if classinfo_ptr != NULL:
-            return <ClassInfo> classinfo_ptr
-        classinfo = self._resolver._load_metabytes_to_classinfo(ns_metabytes, 
type_metabytes)
-        classinfo_ptr = <PyObject *> classinfo
-        self._c_meta_hash_to_classinfo[pair[int64_t, int64_t](
-            ns_metabytes.hashcode, type_metabytes.hashcode)] = classinfo_ptr
-        return classinfo
-
-    cpdef write_typeinfo(self, Buffer buffer, ClassInfo classinfo):
-        if classinfo.dynamic_type:
+        if typeinfo_ptr != NULL:
+            return <TypeInfo> typeinfo_ptr
+        typeinfo = self._resolver._load_metabytes_to_typeinfo(ns_metabytes, 
type_metabytes)
+        typeinfo_ptr = <PyObject *> typeinfo
+        self._c_meta_hash_to_typeinfo[pair[int64_t, int64_t](
+            ns_metabytes.hashcode, type_metabytes.hashcode)] = typeinfo_ptr
+        return typeinfo
+
+    cpdef write_typeinfo(self, Buffer buffer, TypeInfo typeinfo):
+        if typeinfo.dynamic_type:
             return
         cdef:
-            int32_t type_id = classinfo.type_id
+            int32_t type_id = typeinfo.type_id
             int32_t internal_type_id = type_id & 0xFF
         buffer.write_varuint32(type_id)
         if IsNamespacedType(internal_type_id):
-            self.metastring_resolver.write_meta_string_bytes(buffer, 
classinfo.namespace_bytes)
-            self.metastring_resolver.write_meta_string_bytes(buffer, 
classinfo.typename_bytes)
+            self.metastring_resolver.write_meta_string_bytes(buffer, 
typeinfo.namespace_bytes)
+            self.metastring_resolver.write_meta_string_bytes(buffer, 
typeinfo.typename_bytes)
 
-    cpdef inline ClassInfo read_typeinfo(self, Buffer buffer):
+    cpdef inline TypeInfo read_typeinfo(self, Buffer buffer):
         cdef:
             int32_t type_id = buffer.read_varuint32()
             int32_t internal_type_id = type_id & 0xFF
@@ -533,14 +533,14 @@ cdef class ClassResolver:
         if IsNamespacedType(internal_type_id):
             namespace_bytes = 
self.metastring_resolver.read_meta_string_bytes(buffer)
             typename_bytes = 
self.metastring_resolver.read_meta_string_bytes(buffer)
-            return self._load_bytes_to_classinfo(type_id, namespace_bytes, 
typename_bytes)
-        if type_id < 0 or type_id > self._c_registered_id_to_class_info.size():
+            return self._load_bytes_to_typeinfo(type_id, namespace_bytes, 
typename_bytes)
+        if type_id < 0 or type_id > self._c_registered_id_to_type_info.size():
             raise ValueError(f"Unexpected type_id {type_id}")
-        classinfo_ptr = self._c_registered_id_to_class_info[type_id]
-        if classinfo_ptr == NULL:
+        typeinfo_ptr = self._c_registered_id_to_type_info[type_id]
+        if typeinfo_ptr == NULL:
             raise ValueError(f"Unexpected type_id {type_id}")
-        classinfo = <ClassInfo> classinfo_ptr
-        return classinfo
+        typeinfo = <TypeInfo> typeinfo_ptr
+        return typeinfo
 
     cpdef inline reset(self):
         pass
@@ -556,10 +556,10 @@ cdef class ClassResolver:
 cdef class Fory:
     cdef readonly object language
     cdef readonly c_bool ref_tracking
-    cdef readonly c_bool require_class_registration
+    cdef readonly c_bool require_type_registration
     cdef readonly c_bool is_py
     cdef readonly MapRefResolver ref_resolver
-    cdef readonly ClassResolver class_resolver
+    cdef readonly TypeResolver type_resolver
     cdef readonly MetaStringResolver metastring_resolver
     cdef readonly SerializationContext serialization_context
     cdef Buffer buffer
@@ -575,34 +575,34 @@ cdef class Fory:
             self,
             language=Language.XLANG,
             ref_tracking: bool = False,
-            require_class_registration: bool = True,
+            require_type_registration: bool = True,
     ):
         """
-       :param require_class_registration:
-        Whether to require registering classes for serialization, enabled by 
default.
-         If disabled, unknown insecure classes can be deserialized, which can 
be
-         insecure and cause remote code execution attack if the classes
+       :param require_type_registration:
+        Whether to require registering types for serialization, enabled by 
default.
+         If disabled, unknown insecure types can be deserialized, which can be
+         insecure and cause remote code execution attack if the types
          `__new__`/`__init__`/`__eq__`/`__hash__` method contain malicious 
code.
-         Do not disable class registration if you can't ensure your 
environment are
+         Do not disable type registration if you can't ensure your environment 
are
          *indeed secure*. We are not responsible for security risks if
          you disable this option.
        """
         self.language = language
-        if _ENABLE_CLASS_REGISTRATION_FORCIBLY or require_class_registration:
-            self.require_class_registration = True
+        if _ENABLE_TYPE_REGISTRATION_FORCIBLY or require_type_registration:
+            self.require_type_registration = True
         else:
-            self.require_class_registration = False
+            self.require_type_registration = False
         self.ref_tracking = ref_tracking
         self.ref_resolver = MapRefResolver(ref_tracking)
         self.is_py = self.language == Language.PYTHON
         self.metastring_resolver = MetaStringResolver()
-        self.class_resolver = ClassResolver(self)
-        self.class_resolver.initialize()
+        self.type_resolver = TypeResolver(self)
+        self.type_resolver.initialize()
         self.serialization_context = SerializationContext()
         self.buffer = Buffer.allocate(32)
-        if not require_class_registration:
+        if not require_type_registration:
             warnings.warn(
-                "Class registration is disabled, unknown classes can be 
deserialized "
+                "Type registration is disabled, unknown types can be 
deserialized "
                 "which may be insecure.",
                 RuntimeWarning,
                 stacklevel=2,
@@ -619,7 +619,7 @@ cdef class Fory:
         self._peer_language = None
 
     def register_serializer(self, cls: Union[type, TypeVar], Serializer 
serializer):
-        self.class_resolver.register_serializer(cls, serializer)
+        self.type_resolver.register_serializer(cls, serializer)
 
     def register_type(
             self,
@@ -630,7 +630,7 @@ cdef class Fory:
             typename: str = None,
             serializer=None,
     ):
-        self.class_resolver.register_type(
+        self.type_resolver.register_type(
             cls, type_id=type_id, namespace=namespace, typename=typename, 
serializer=serializer)
 
     def serialize(
@@ -696,7 +696,7 @@ cdef class Fory:
             return buffer.to_bytes(0, buffer.writer_index)
 
     cpdef inline serialize_ref(
-            self, Buffer buffer, obj, ClassInfo classinfo=None):
+            self, Buffer buffer, obj, TypeInfo typeinfo=None):
         cls = type(obj)
         if cls is str:
             buffer.write_int16(NOT_NULL_STRING_FLAG)
@@ -716,32 +716,32 @@ cdef class Fory:
             return
         if self.ref_resolver.write_ref_or_null(buffer, obj):
             return
-        if classinfo is None:
-            classinfo = self.class_resolver.get_classinfo(cls)
-        self.class_resolver.write_typeinfo(buffer, classinfo)
-        classinfo.serializer.write(buffer, obj)
+        if typeinfo is None:
+            typeinfo = self.type_resolver.get_typeinfo(cls)
+        self.type_resolver.write_typeinfo(buffer, typeinfo)
+        typeinfo.serializer.write(buffer, obj)
 
     cpdef inline serialize_nonref(self, Buffer buffer, obj):
         cls = type(obj)
         if cls is str:
-            buffer.write_varuint32(STRING_CLASS_ID)
+            buffer.write_varuint32(STRING_TYPE_ID)
             buffer.write_string(obj)
             return
         elif cls is int:
-            buffer.write_varuint32(INT64_CLASS_ID)
+            buffer.write_varuint32(INT64_TYPE_ID)
             buffer.write_varint64(obj)
             return
         elif cls is bool:
-            buffer.write_varuint32(BOOL_CLASS_ID)
+            buffer.write_varuint32(BOOL_TYPE_ID)
             buffer.write_bool(obj)
             return
         elif cls is float:
-            buffer.write_varuint32(FLOAT64_CLASS_ID)
+            buffer.write_varuint32(FLOAT64_TYPE_ID)
             buffer.write_double(obj)
             return
-        cdef ClassInfo classinfo = self.class_resolver.get_classinfo(cls)
-        self.class_resolver.write_typeinfo(buffer, classinfo)
-        classinfo.serializer.write(buffer, obj)
+        cdef TypeInfo typeinfo = self.type_resolver.get_typeinfo(cls)
+        self.type_resolver.write_typeinfo(buffer, typeinfo)
+        typeinfo.serializer.write(buffer, obj)
 
     cpdef inline xserialize_ref(
             self, Buffer buffer, obj, Serializer serializer=None):
@@ -762,9 +762,9 @@ cdef class Fory:
     cpdef inline xserialize_nonref(
             self, Buffer buffer, obj, Serializer serializer=None):
         if serializer is None:
-            classinfo = self.class_resolver.get_classinfo(type(obj))
-            self.class_resolver.write_typeinfo(buffer, classinfo)
-            serializer = classinfo.serializer
+            typeinfo = self.type_resolver.get_typeinfo(type(obj))
+            self.type_resolver.write_typeinfo(buffer, typeinfo)
+            serializer = typeinfo.serializer
         serializer.xwrite(buffer, obj)
 
     def deserialize(
@@ -782,7 +782,7 @@ cdef class Fory:
 
     cpdef inline _deserialize(
             self, Buffer buffer, buffers=None, unsupported_objects=None):
-        if not self.require_class_registration:
+        if not self.require_type_registration:
             self.unpickler = Unpickler(buffer)
         if unsupported_objects is not None:
             self._unsupported_objects = iter(unsupported_objects)
@@ -830,8 +830,8 @@ cdef class Fory:
         if ref_id < NOT_NULL_VALUE_FLAG:
             return ref_resolver.get_read_object()
         # indicates that the object is first read.
-        cdef ClassInfo classinfo = self.class_resolver.read_typeinfo(buffer)
-        cls = classinfo.cls
+        cdef TypeInfo typeinfo = self.type_resolver.read_typeinfo(buffer)
+        cls = typeinfo.cls
         if cls is str:
             return buffer.read_string()
         elif cls is int:
@@ -840,14 +840,14 @@ cdef class Fory:
             return buffer.read_bool()
         elif cls is float:
             return buffer.read_double()
-        o = classinfo.serializer.read(buffer)
+        o = typeinfo.serializer.read(buffer)
         ref_resolver.set_read_object(ref_id, o)
         return o
 
     cpdef inline deserialize_nonref(self, Buffer buffer):
         """Deserialize not-null and non-reference object from buffer."""
-        cdef ClassInfo classinfo = self.class_resolver.read_typeinfo(buffer)
-        cls = classinfo.cls
+        cdef TypeInfo typeinfo = self.type_resolver.read_typeinfo(buffer)
+        cls = typeinfo.cls
         if cls is str:
             return buffer.read_string()
         elif cls is int:
@@ -856,7 +856,7 @@ cdef class Fory:
             return buffer.read_bool()
         elif cls is float:
             return buffer.read_double()
-        return classinfo.serializer.read(buffer)
+        return typeinfo.serializer.read(buffer)
 
     cpdef inline xdeserialize_ref(self, Buffer buffer, Serializer 
serializer=None):
         cdef MapRefResolver ref_resolver
@@ -883,7 +883,7 @@ cdef class Fory:
     cpdef inline xdeserialize_nonref(
             self, Buffer buffer, Serializer serializer=None):
         if serializer is None:
-            serializer = self.class_resolver.read_typeinfo(buffer).serializer
+            serializer = self.type_resolver.read_typeinfo(buffer).serializer
         return serializer.xread(buffer)
 
     cpdef inline write_buffer_object(self, Buffer buffer, buffer_object):
@@ -928,13 +928,13 @@ cdef class Fory:
             return next(self._unsupported_objects)
 
     cpdef inline write_ref_pyobject(
-            self, Buffer buffer, value, ClassInfo classinfo=None):
+            self, Buffer buffer, value, TypeInfo typeinfo=None):
         if self.ref_resolver.write_ref_or_null(buffer, value):
             return
-        if classinfo is None:
-            classinfo = self.class_resolver.get_classinfo(type(value))
-        self.class_resolver.write_typeinfo(buffer, classinfo)
-        classinfo.serializer.write(buffer, value)
+        if typeinfo is None:
+            typeinfo = self.type_resolver.get_typeinfo(type(value))
+        self.type_resolver.write_typeinfo(buffer, typeinfo)
+        typeinfo.serializer.write(buffer, value)
 
     cpdef inline read_ref_pyobject(self, Buffer buffer):
         cdef MapRefResolver ref_resolver = self.ref_resolver
@@ -942,14 +942,14 @@ cdef class Fory:
         if ref_id < NOT_NULL_VALUE_FLAG:
             return ref_resolver.get_read_object()
         # indicates that the object is first read.
-        cdef ClassInfo classinfo = self.class_resolver.read_typeinfo(buffer)
-        o = classinfo.serializer.read(buffer)
+        cdef TypeInfo typeinfo = self.type_resolver.read_typeinfo(buffer)
+        o = typeinfo.serializer.read(buffer)
         ref_resolver.set_read_object(ref_id, o)
         return o
 
     cpdef inline reset_write(self):
         self.ref_resolver.reset_write()
-        self.class_resolver.reset_write()
+        self.type_resolver.reset_write()
         self.metastring_resolver.reset_write()
         self.serialization_context.reset()
         self.pickler.clear_memo()
@@ -957,7 +957,7 @@ cdef class Fory:
 
     cpdef inline reset_read(self):
         self.ref_resolver.reset_read()
-        self.class_resolver.reset_read()
+        self.type_resolver.reset_read()
         self.metastring_resolver.reset_read()
         self.serialization_context.reset()
         self._buffers = None
@@ -1234,33 +1234,33 @@ cdef int8_t COLLECTION_NOT_SAME_TYPE = 0b1000
 
 
 cdef class CollectionSerializer(Serializer):
-    cdef ClassResolver class_resolver
+    cdef TypeResolver type_resolver
     cdef MapRefResolver ref_resolver
     cdef Serializer elem_serializer
     cdef c_bool is_py
     cdef int8_t elem_tracking_ref
     cdef elem_type
-    cdef ClassInfo elem_typeinfo
+    cdef TypeInfo elem_typeinfo
 
     def __init__(self, fory, type_, elem_serializer=None):
         super().__init__(fory, type_)
-        self.class_resolver = fory.class_resolver
+        self.type_resolver = fory.type_resolver
         self.ref_resolver = fory.ref_resolver
         self.elem_serializer = elem_serializer
         if elem_serializer is None:
             self.elem_type = None
-            self.elem_typeinfo = self.class_resolver.get_classinfo(None)
+            self.elem_typeinfo = self.type_resolver.get_typeinfo(None)
             self.elem_tracking_ref = -1
         else:
             self.elem_type = elem_serializer.type_
-            self.elem_typeinfo = 
fory.class_resolver.get_classinfo(self.elem_type)
+            self.elem_typeinfo = 
fory.type_resolver.get_typeinfo(self.elem_type)
             self.elem_tracking_ref = <int8_t> 
(elem_serializer.need_to_write_ref)
         self.is_py = fory.is_py
 
     cdef pair[int8_t, int64_t] write_header(self, Buffer buffer, value):
         cdef int8_t collect_flag = COLLECTION_DEFAULT_FLAG
         elem_type = self.elem_type
-        cdef ClassInfo elem_typeinfo = self.elem_typeinfo
+        cdef TypeInfo elem_typeinfo = self.elem_typeinfo
         cdef c_bool has_null = False
         cdef c_bool has_different_type = False
         if elem_type is None:
@@ -1275,7 +1275,7 @@ cdef class CollectionSerializer(Serializer):
                     collect_flag |= COLLECTION_NOT_SAME_TYPE
                     has_different_type = True
             if not has_different_type:
-                elem_typeinfo = self.class_resolver.get_classinfo(elem_type)
+                elem_typeinfo = self.type_resolver.get_typeinfo(elem_type)
         else:
             for s in value:
                 if s is None:
@@ -1293,7 +1293,7 @@ cdef class CollectionSerializer(Serializer):
         buffer.write_int8(collect_flag)
         if (not has_different_type and
                 collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE != 0):
-            self.class_resolver.write_typeinfo(buffer, elem_typeinfo)
+            self.type_resolver.write_typeinfo(buffer, elem_typeinfo)
         return pair[int8_t, int64_t](collect_flag, obj2int(elem_typeinfo))
 
     cpdef write(self, Buffer buffer, value):
@@ -1303,10 +1303,10 @@ cdef class CollectionSerializer(Serializer):
         cdef pair[int8_t, int64_t] header_pair = self.write_header(buffer, 
value)
         cdef int8_t collect_flag = header_pair.first
         cdef int64_t elem_typeinfo_ptr = header_pair.second
-        cdef ClassInfo elem_typeinfo = <type> int2obj(elem_typeinfo_ptr)
+        cdef TypeInfo elem_typeinfo = <type> int2obj(elem_typeinfo_ptr)
         cdef elem_type = elem_typeinfo.cls
         cdef MapRefResolver ref_resolver = self.ref_resolver
-        cdef ClassResolver class_resolver = self.class_resolver
+        cdef TypeResolver type_resolver = self.type_resolver
         cdef c_bool is_py = self.is_py
         cdef serializer = type(elem_typeinfo.serializer)
         if (collect_flag & COLLECTION_NOT_SAME_TYPE) == 0:
@@ -1340,12 +1340,12 @@ cdef class CollectionSerializer(Serializer):
                     buffer.write_double(s)
                 else:
                     if not ref_resolver.write_ref_or_null(buffer, s):
-                        classinfo = class_resolver.get_classinfo(cls)
-                        class_resolver.write_typeinfo(buffer, classinfo)
+                        typeinfo = type_resolver.get_typeinfo(cls)
+                        type_resolver.write_typeinfo(buffer, typeinfo)
                         if is_py:
-                            classinfo.serializer.write(buffer, s)
+                            typeinfo.serializer.write(buffer, s)
                         else:
-                            classinfo.serializer.xwrite(buffer, s)
+                            typeinfo.serializer.xwrite(buffer, s)
 
     cdef inline _write_string(self, Buffer buffer, value):
         for s in value:
@@ -1393,43 +1393,43 @@ cdef class CollectionSerializer(Serializer):
         for i in range(len_):
             self._add_element(collection_, i, buffer.read_double())
 
-    cpdef _write_same_type_no_ref(self, Buffer buffer, value, ClassInfo 
classinfo):
+    cpdef _write_same_type_no_ref(self, Buffer buffer, value, TypeInfo 
typeinfo):
         cdef MapRefResolver ref_resolver = self.ref_resolver
-        cdef ClassResolver class_resolver = self.class_resolver
+        cdef TypeResolver type_resolver = self.type_resolver
         if self.is_py:
             for s in value:
-                classinfo.serializer.write(buffer, s)
+                typeinfo.serializer.write(buffer, s)
         else:
             for s in value:
-                classinfo.serializer.xwrite(buffer, s)
+                typeinfo.serializer.xwrite(buffer, s)
 
-    cpdef _read_same_type_no_ref(self, Buffer buffer, int64_t len_, object 
collection_, ClassInfo classinfo):
+    cpdef _read_same_type_no_ref(self, Buffer buffer, int64_t len_, object 
collection_, TypeInfo typeinfo):
         cdef MapRefResolver ref_resolver = self.ref_resolver
-        cdef ClassResolver class_resolver = self.class_resolver
+        cdef TypeResolver type_resolver = self.type_resolver
         if self.is_py:
             for i in range(len_):
-                obj = classinfo.serializer.read(buffer)
+                obj = typeinfo.serializer.read(buffer)
                 self._add_element(collection_, i, obj)
         else:
             for i in range(len_):
-                obj = classinfo.serializer.xread(buffer)
+                obj = typeinfo.serializer.xread(buffer)
                 self._add_element(collection_, i, obj)
 
-    cpdef _write_same_type_ref(self, Buffer buffer, value, ClassInfo 
classinfo):
+    cpdef _write_same_type_ref(self, Buffer buffer, value, TypeInfo typeinfo):
         cdef MapRefResolver ref_resolver = self.ref_resolver
-        cdef ClassResolver class_resolver = self.class_resolver
+        cdef TypeResolver type_resolver = self.type_resolver
         if self.is_py:
             for s in value:
                 if not ref_resolver.write_ref_or_null(buffer, s):
-                    classinfo.serializer.write(buffer, s)
+                    typeinfo.serializer.write(buffer, s)
         else:
             for s in value:
                 if not ref_resolver.write_ref_or_null(buffer, s):
-                    classinfo.serializer.xwrite(buffer, s)
+                    typeinfo.serializer.xwrite(buffer, s)
 
-    cpdef _read_same_type_ref(self, Buffer buffer, int64_t len_, object 
collection_, ClassInfo classinfo):
+    cpdef _read_same_type_ref(self, Buffer buffer, int64_t len_, object 
collection_, TypeInfo typeinfo):
         cdef MapRefResolver ref_resolver = self.ref_resolver
-        cdef ClassResolver class_resolver = self.class_resolver
+        cdef TypeResolver type_resolver = self.type_resolver
         cdef c_bool is_py = self.is_py
         for i in range(len_):
             ref_id = ref_resolver.try_preserve_ref_id(buffer)
@@ -1437,9 +1437,9 @@ cdef class CollectionSerializer(Serializer):
                 obj = ref_resolver.get_read_object()
             else:
                 if is_py:
-                    obj = classinfo.serializer.read(buffer)
+                    obj = typeinfo.serializer.read(buffer)
                 else:
-                    obj = classinfo.serializer.xread(buffer)
+                    obj = typeinfo.serializer.xread(buffer)
                 ref_resolver.set_read_object(ref_id, obj)
             self._add_element(collection_, i, obj)
 
@@ -1452,7 +1452,7 @@ cdef class CollectionSerializer(Serializer):
 cdef class ListSerializer(CollectionSerializer):
     cpdef read(self, Buffer buffer):
         cdef MapRefResolver ref_resolver = self.fory.ref_resolver
-        cdef ClassResolver class_resolver = self.fory.class_resolver
+        cdef TypeResolver type_resolver = self.fory.type_resolver
         cdef int32_t len_ = buffer.read_varuint32()
         cdef list list_ = PyList_New(len_)
         if len_ == 0:
@@ -1460,15 +1460,15 @@ cdef class ListSerializer(CollectionSerializer):
         cdef int8_t collect_flag = buffer.read_int8()
         ref_resolver.reference(list_)
         cdef c_bool is_py = self.is_py
-        cdef ClassInfo classinfo
+        cdef TypeInfo typeinfo
         cdef int32_t type_id = -1
         if (collect_flag & COLLECTION_NOT_SAME_TYPE) == 0:
             if collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE != 0:
-                classinfo = self.class_resolver.read_typeinfo(buffer)
+                typeinfo = self.type_resolver.read_typeinfo(buffer)
             else:
-                classinfo = self.elem_typeinfo
+                typeinfo = self.elem_typeinfo
             if (collect_flag & COLLECTION_HAS_NULL) == 0:
-                type_id = classinfo.type_id
+                type_id = typeinfo.type_id
                 if type_id == <int32_t>TypeId.STRING:
                     self._read_string(buffer, len_, list_)
                     return list_
@@ -1482,12 +1482,12 @@ cdef class ListSerializer(CollectionSerializer):
                     self._read_float(buffer, len_, list_)
                     return list_
             if (collect_flag & COLLECTION_TRACKING_REF) == 0:
-                self._read_same_type_no_ref(buffer, len_, list_, classinfo)
+                self._read_same_type_no_ref(buffer, len_, list_, typeinfo)
             else:
-                self._read_same_type_ref(buffer, len_, list_, classinfo)
+                self._read_same_type_ref(buffer, len_, list_, typeinfo)
         else:
             for i in range(len_):
-                elem = get_next_element(buffer, ref_resolver, class_resolver, 
is_py)
+                elem = get_next_element(buffer, ref_resolver, type_resolver, 
is_py)
                 Py_INCREF(elem)
                 PyList_SET_ITEM(list_, i, elem)
         return list_
@@ -1502,17 +1502,17 @@ cdef class ListSerializer(CollectionSerializer):
 cdef inline get_next_element(
         Buffer buffer,
         MapRefResolver ref_resolver,
-        ClassResolver class_resolver,
+        TypeResolver type_resolver,
         c_bool is_py,
 ):
     cdef int32_t ref_id
-    cdef ClassInfo classinfo
+    cdef TypeInfo typeinfo
     ref_id = ref_resolver.try_preserve_ref_id(buffer)
     if ref_id < NOT_NULL_VALUE_FLAG:
         return ref_resolver.get_read_object()
     # indicates that the object is first read.
-    classinfo = class_resolver.read_typeinfo(buffer)
-    cdef int32_t type_id = classinfo.type_id
+    typeinfo = type_resolver.read_typeinfo(buffer)
+    cdef int32_t type_id = typeinfo.type_id
     # Note that all read operations in fast paths of 
list/tuple/set/dict/sub_dict
     # ust match corresponding writing operations. Otherwise, ref tracking will
     # error.
@@ -1526,9 +1526,9 @@ cdef inline get_next_element(
         return buffer.read_double()
     else:
         if is_py:
-            o = classinfo.serializer.read(buffer)
+            o = typeinfo.serializer.read(buffer)
         else:
-            o = classinfo.serializer.xread(buffer)
+            o = typeinfo.serializer.xread(buffer)
         ref_resolver.set_read_object(ref_id, o)
         return o
 
@@ -1537,22 +1537,22 @@ cdef inline get_next_element(
 cdef class TupleSerializer(CollectionSerializer):
     cpdef inline read(self, Buffer buffer):
         cdef MapRefResolver ref_resolver = self.fory.ref_resolver
-        cdef ClassResolver class_resolver = self.fory.class_resolver
+        cdef TypeResolver type_resolver = self.fory.type_resolver
         cdef int32_t len_ = buffer.read_varuint32()
         cdef tuple tuple_ = PyTuple_New(len_)
         if len_ == 0:
             return tuple_
         cdef int8_t collect_flag = buffer.read_int8()
         cdef c_bool is_py = self.is_py
-        cdef ClassInfo classinfo
+        cdef TypeInfo typeinfo
         cdef int32_t type_id = -1
         if (collect_flag & COLLECTION_NOT_SAME_TYPE) == 0:
             if collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE != 0:
-                classinfo = self.class_resolver.read_typeinfo(buffer)
+                typeinfo = self.type_resolver.read_typeinfo(buffer)
             else:
-                classinfo = self.elem_typeinfo
+                typeinfo = self.elem_typeinfo
             if (collect_flag & COLLECTION_HAS_NULL) == 0:
-                type_id = classinfo.type_id
+                type_id = typeinfo.type_id
                 if type_id == <int32_t>TypeId.STRING:
                     self._read_string(buffer, len_, tuple_)
                     return tuple_
@@ -1566,12 +1566,12 @@ cdef class TupleSerializer(CollectionSerializer):
                     self._read_float(buffer, len_, tuple_)
                     return tuple_
             if (collect_flag & COLLECTION_TRACKING_REF) == 0:
-                self._read_same_type_no_ref(buffer, len_, tuple_, classinfo)
+                self._read_same_type_no_ref(buffer, len_, tuple_, typeinfo)
             else:
-                self._read_same_type_ref(buffer, len_, tuple_, classinfo)
+                self._read_same_type_ref(buffer, len_, tuple_, typeinfo)
         else:
             for i in range(len_):
-                elem = get_next_element(buffer, ref_resolver, class_resolver, 
is_py)
+                elem = get_next_element(buffer, ref_resolver, type_resolver, 
is_py)
                 Py_INCREF(elem)
                 PyTuple_SET_ITEM(tuple_, i, elem)
         return tuple_
@@ -1594,7 +1594,7 @@ cdef class StringArraySerializer(ListSerializer):
 cdef class SetSerializer(CollectionSerializer):
     cpdef inline read(self, Buffer buffer):
         cdef MapRefResolver ref_resolver = self.fory.ref_resolver
-        cdef ClassResolver class_resolver = self.fory.class_resolver
+        cdef TypeResolver type_resolver = self.fory.type_resolver
         cdef set instance = set()
         ref_resolver.reference(instance)
         cdef int32_t len_ = buffer.read_varuint32()
@@ -1602,16 +1602,16 @@ cdef class SetSerializer(CollectionSerializer):
             return instance
         cdef int8_t collect_flag = buffer.read_int8()
         cdef int32_t ref_id
-        cdef ClassInfo classinfo
+        cdef TypeInfo typeinfo
         cdef int32_t type_id = -1
         cdef c_bool is_py = self.is_py
         if (collect_flag & COLLECTION_NOT_SAME_TYPE) == 0:
             if collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE != 0:
-                classinfo = self.class_resolver.read_typeinfo(buffer)
+                typeinfo = self.type_resolver.read_typeinfo(buffer)
             else:
-                classinfo = self.elem_typeinfo
+                typeinfo = self.elem_typeinfo
             if (collect_flag & COLLECTION_HAS_NULL) == 0:
-                type_id = classinfo.type_id
+                type_id = typeinfo.type_id
                 if type_id == <int32_t>TypeId.STRING:
                     self._read_string(buffer, len_, instance)
                     return instance
@@ -1625,9 +1625,9 @@ cdef class SetSerializer(CollectionSerializer):
                     self._read_float(buffer, len_, instance)
                     return instance
             if (collect_flag & COLLECTION_TRACKING_REF) == 0:
-                self._read_same_type_no_ref(buffer, len_, instance, classinfo)
+                self._read_same_type_no_ref(buffer, len_, instance, typeinfo)
             else:
-                self._read_same_type_ref(buffer, len_, instance, classinfo)
+                self._read_same_type_ref(buffer, len_, instance, typeinfo)
         else:
             for i in range(len_):
                 ref_id = ref_resolver.try_preserve_ref_id(buffer)
@@ -1635,8 +1635,8 @@ cdef class SetSerializer(CollectionSerializer):
                     instance.add(ref_resolver.get_read_object())
                     continue
                 # indicates that the object is first read.
-                classinfo = class_resolver.read_typeinfo(buffer)
-                type_id = classinfo.type_id
+                typeinfo = type_resolver.read_typeinfo(buffer)
+                type_id = typeinfo.type_id
                 if type_id == <int32_t>TypeId.STRING:
                     instance.add(buffer.read_string())
                 elif type_id == <int32_t>TypeId.VAR_INT64:
@@ -1647,9 +1647,9 @@ cdef class SetSerializer(CollectionSerializer):
                     instance.add(buffer.read_double())
                 else:
                     if is_py:
-                        o = classinfo.serializer.read(buffer)
+                        o = typeinfo.serializer.read(buffer)
                     else:
-                        o = classinfo.serializer.xread(buffer)
+                        o = typeinfo.serializer.xread(buffer)
                     ref_resolver.set_read_object(ref_id, o)
                     instance.add(o)
         return instance
@@ -1690,7 +1690,7 @@ cdef int32_t NULL_VALUE_KEY_DECL_TYPE_TRACKING_REF = 
VALUE_HAS_NULL | KEY_DECL_T
 
 @cython.final
 cdef class MapSerializer(Serializer):
-    cdef ClassResolver class_resolver
+    cdef TypeResolver type_resolver
     cdef MapRefResolver ref_resolver
     cdef Serializer key_serializer
     cdef Serializer value_serializer
@@ -1698,7 +1698,7 @@ cdef class MapSerializer(Serializer):
 
     def __init__(self, fory, type_, key_serializer=None, 
value_serializer=None):
         super().__init__(fory, type_)
-        self.class_resolver = fory.class_resolver
+        self.type_resolver = fory.type_resolver
         self.ref_resolver = fory.ref_resolver
         self.key_serializer = key_serializer
         self.value_serializer = value_serializer
@@ -1713,12 +1713,12 @@ cdef class MapSerializer(Serializer):
         cdef int64_t key_addr, value_addr
         cdef Py_ssize_t pos = 0
         cdef Fory fory = self.fory
-        cdef ClassResolver class_resolver = fory.class_resolver
+        cdef TypeResolver type_resolver = fory.type_resolver
         cdef MapRefResolver ref_resolver = fory.ref_resolver
         cdef Serializer key_serializer = self.key_serializer
         cdef Serializer value_serializer = self.value_serializer
         cdef type key_cls, value_cls, key_serializer_type, 
value_serializer_type
-        cdef ClassInfo key_classinfo, value_classinfo
+        cdef TypeInfo key_typeinfo, value_typeinfo
         cdef int32_t chunk_size_offset, chunk_header, chunk_size
         cdef c_bool key_write_ref, value_write_ref
         cdef int has_next = PyDict_Next(obj, &pos, <PyObject **>&key_addr, 
<PyObject **>&value_addr)
@@ -1796,15 +1796,15 @@ cdef class MapSerializer(Serializer):
             if key_serializer is not None:
                 chunk_header |= KEY_DECL_TYPE
             else:
-                key_classinfo = self.class_resolver.get_classinfo(key_cls)
-                class_resolver.write_typeinfo(buffer, key_classinfo)
-                key_serializer = key_classinfo.serializer
+                key_typeinfo = self.type_resolver.get_typeinfo(key_cls)
+                type_resolver.write_typeinfo(buffer, key_typeinfo)
+                key_serializer = key_typeinfo.serializer
             if value_serializer is not None:
                 chunk_header |= VALUE_DECL_TYPE
             else:
-                value_classinfo = self.class_resolver.get_classinfo(value_cls)
-                class_resolver.write_typeinfo(buffer, value_classinfo)
-                value_serializer = value_classinfo.serializer
+                value_typeinfo = self.type_resolver.get_typeinfo(value_cls)
+                type_resolver.write_typeinfo(buffer, value_typeinfo)
+                value_serializer = value_typeinfo.serializer
             key_write_ref = key_serializer.need_to_write_ref
             value_write_ref = value_serializer.need_to_write_ref
             if key_write_ref:
@@ -1870,12 +1870,12 @@ cdef class MapSerializer(Serializer):
     cpdef inline read(self, Buffer buffer):
         cdef Fory fory = self.fory
         cdef MapRefResolver ref_resolver = self.ref_resolver
-        cdef ClassResolver class_resolver = self.class_resolver
+        cdef TypeResolver type_resolver = self.type_resolver
         cdef int32_t size = buffer.read_varuint32()
         cdef dict map_ = _PyDict_NewPresized(size)
         ref_resolver.reference(map_)
         cdef int32_t ref_id
-        cdef ClassInfo key_classinfo, value_classinfo
+        cdef TypeInfo key_typeinfo, value_typeinfo
         cdef int32_t chunk_header = 0
         if size != 0:
             chunk_header = buffer.read_uint8()
@@ -1950,9 +1950,9 @@ cdef class MapSerializer(Serializer):
             value_is_declared_type = (chunk_header & VALUE_DECL_TYPE) != 0
             chunk_size = buffer.read_uint8()
             if not key_is_declared_type:
-                key_serializer = 
class_resolver.read_typeinfo(buffer).serializer
+                key_serializer = type_resolver.read_typeinfo(buffer).serializer
             if not value_is_declared_type:
-                value_serializer = 
class_resolver.read_typeinfo(buffer).serializer
+                value_serializer = 
type_resolver.read_typeinfo(buffer).serializer
             key_serializer_type = type(key_serializer)
             value_serializer_type = type(value_serializer)
             for i in range(chunk_size):
@@ -2025,22 +2025,22 @@ cdef class MapSerializer(Serializer):
 
 @cython.final
 cdef class SubMapSerializer(Serializer):
-    cdef ClassResolver class_resolver
+    cdef TypeResolver type_resolver
     cdef MapRefResolver ref_resolver
     cdef Serializer key_serializer
     cdef Serializer value_serializer
 
     def __init__(self, fory, type_, key_serializer=None, 
value_serializer=None):
         super().__init__(fory, type_)
-        self.class_resolver = fory.class_resolver
+        self.type_resolver = fory.type_resolver
         self.ref_resolver = fory.ref_resolver
         self.key_serializer = key_serializer
         self.value_serializer = value_serializer
 
     cpdef inline write(self, Buffer buffer, value):
         buffer.write_varuint32(len(value))
-        cdef ClassInfo key_classinfo
-        cdef ClassInfo value_classinfo
+        cdef TypeInfo key_typeinfo
+        cdef TypeInfo value_typeinfo
         for k, v in value.items():
             key_cls = type(k)
             if key_cls is str:
@@ -2048,9 +2048,9 @@ cdef class SubMapSerializer(Serializer):
                 buffer.write_string(k)
             else:
                 if not self.ref_resolver.write_ref_or_null(buffer, k):
-                    key_classinfo = self.class_resolver.get_classinfo(key_cls)
-                    self.class_resolver.write_typeinfo(buffer, key_classinfo)
-                    key_classinfo.serializer.write(buffer, k)
+                    key_typeinfo = self.type_resolver.get_typeinfo(key_cls)
+                    self.type_resolver.write_typeinfo(buffer, key_typeinfo)
+                    key_typeinfo.serializer.write(buffer, k)
             value_cls = type(v)
             if value_cls is str:
                 buffer.write_int16(NOT_NULL_STRING_FLAG)
@@ -2066,37 +2066,37 @@ cdef class SubMapSerializer(Serializer):
                 buffer.write_double(v)
             else:
                 if not self.ref_resolver.write_ref_or_null(buffer, v):
-                    value_classinfo = self.class_resolver. \
-                        get_classinfo(value_cls)
-                    self.class_resolver.write_typeinfo(buffer, value_classinfo)
-                    value_classinfo.serializer.write(buffer, v)
+                    value_typeinfo = self.type_resolver. \
+                        get_typeinfo(value_cls)
+                    self.type_resolver.write_typeinfo(buffer, value_typeinfo)
+                    value_typeinfo.serializer.write(buffer, v)
 
     cpdef inline read(self, Buffer buffer):
         cdef MapRefResolver ref_resolver = self.fory.ref_resolver
-        cdef ClassResolver class_resolver = self.fory.class_resolver
+        cdef TypeResolver type_resolver = self.fory.type_resolver
         map_ = self.type_()
         ref_resolver.reference(map_)
         cdef int32_t len_ = buffer.read_varuint32()
         cdef int32_t ref_id
-        cdef ClassInfo key_classinfo
-        cdef ClassInfo value_classinfo
+        cdef TypeInfo key_typeinfo
+        cdef TypeInfo value_typeinfo
         for i in range(len_):
             ref_id = ref_resolver.try_preserve_ref_id(buffer)
             if ref_id < NOT_NULL_VALUE_FLAG:
                 key = ref_resolver.get_read_object()
             else:
-                key_classinfo = class_resolver.read_typeinfo(buffer)
-                if key_classinfo.cls is str:
+                key_typeinfo = type_resolver.read_typeinfo(buffer)
+                if key_typeinfo.cls is str:
                     key = buffer.read_string()
                 else:
-                    key = key_classinfo.serializer.read(buffer)
+                    key = key_typeinfo.serializer.read(buffer)
                     ref_resolver.set_read_object(ref_id, key)
             ref_id = ref_resolver.try_preserve_ref_id(buffer)
             if ref_id < NOT_NULL_VALUE_FLAG:
                 value = ref_resolver.get_read_object()
             else:
-                value_classinfo = class_resolver.read_typeinfo(buffer)
-                cls = value_classinfo.cls
+                value_typeinfo = type_resolver.read_typeinfo(buffer)
+                cls = value_typeinfo.cls
                 if cls is str:
                     value = buffer.read_string()
                 elif cls is int:
@@ -2106,7 +2106,7 @@ cdef class SubMapSerializer(Serializer):
                 elif cls is float:
                     value = buffer.read_double()
                 else:
-                    value = value_classinfo.serializer.read(buffer)
+                    value = value_typeinfo.serializer.read(buffer)
                     ref_resolver.set_read_object(ref_id, value)
             map_[key] = value
         return map_
diff --git a/python/pyfory/_serializer.py b/python/pyfory/_serializer.py
index 7ef98b29..dacdae67 100644
--- a/python/pyfory/_serializer.py
+++ b/python/pyfory/_serializer.py
@@ -229,7 +229,7 @@ COLLECTION_NOT_SAME_TYPE = 0b1000
 
 class CollectionSerializer(Serializer):
     __slots__ = (
-        "class_resolver",
+        "type_resolver",
         "ref_resolver",
         "elem_serializer",
         "is_py",
@@ -240,16 +240,16 @@ class CollectionSerializer(Serializer):
 
     def __init__(self, fory, type_, elem_serializer=None):
         super().__init__(fory, type_)
-        self.class_resolver = fory.class_resolver
+        self.type_resolver = fory.type_resolver
         self.ref_resolver = fory.ref_resolver
         self.elem_serializer = elem_serializer
         if elem_serializer is None:
             self.elem_type = None
-            self.elem_typeinfo = self.class_resolver.get_classinfo(None)
+            self.elem_typeinfo = self.type_resolver.get_typeinfo(None)
             self.elem_tracking_ref = -1
         else:
             self.elem_type = elem_serializer.type_
-            self.elem_typeinfo = 
fory.class_resolver.get_classinfo(self.elem_type)
+            self.elem_typeinfo = 
fory.type_resolver.get_typeinfo(self.elem_type)
             self.elem_tracking_ref = int(elem_serializer.need_to_write_ref)
         self.is_py = fory.is_py
 
@@ -271,7 +271,7 @@ class CollectionSerializer(Serializer):
                     collect_flag |= COLLECTION_NOT_SAME_TYPE
                     has_different_type = True
             if not has_different_type and elem_type is not None:
-                elem_typeinfo = self.class_resolver.get_classinfo(elem_type)
+                elem_typeinfo = self.type_resolver.get_typeinfo(elem_type)
         else:
             for s in value:
                 if s is None:
@@ -291,49 +291,49 @@ class CollectionSerializer(Serializer):
             not has_different_type
             and (collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE) != 0
         ):
-            self.class_resolver.write_typeinfo(buffer, elem_typeinfo)
+            self.type_resolver.write_typeinfo(buffer, elem_typeinfo)
         return collect_flag, elem_typeinfo
 
     def write(self, buffer, value):
         if len(value) == 0:
             buffer.write_varuint32(0)
             return
-        collect_flag, classinfo = self.write_header(buffer, value)
+        collect_flag, typeinfo = self.write_header(buffer, value)
         if (collect_flag & COLLECTION_NOT_SAME_TYPE) == 0:
             if (collect_flag & COLLECTION_TRACKING_REF) == 0:
-                self._write_same_type_no_ref(buffer, value, classinfo)
+                self._write_same_type_no_ref(buffer, value, typeinfo)
             else:
-                self._write_same_type_ref(buffer, value, classinfo)
+                self._write_same_type_ref(buffer, value, typeinfo)
         else:
             self._write_different_types(buffer, value)
 
-    def _write_same_type_no_ref(self, buffer, value, classinfo):
+    def _write_same_type_no_ref(self, buffer, value, typeinfo):
         if self.is_py:
             for s in value:
-                classinfo.serializer.write(buffer, s)
+                typeinfo.serializer.write(buffer, s)
         else:
             for s in value:
-                classinfo.serializer.xwrite(buffer, s)
+                typeinfo.serializer.xwrite(buffer, s)
 
-    def _write_same_type_ref(self, buffer, value, classinfo):
+    def _write_same_type_ref(self, buffer, value, typeinfo):
         if self.is_py:
             for s in value:
                 if not self.ref_resolver.write_ref_or_null(buffer, s):
-                    classinfo.serializer.write(buffer, s)
+                    typeinfo.serializer.write(buffer, s)
         else:
             for s in value:
                 if not self.ref_resolver.write_ref_or_null(buffer, s):
-                    classinfo.serializer.xwrite(buffer, s)
+                    typeinfo.serializer.xwrite(buffer, s)
 
     def _write_different_types(self, buffer, value):
         for s in value:
             if not self.ref_resolver.write_ref_or_null(buffer, s):
-                classinfo = self.class_resolver.get_classinfo(type(s))
-                self.class_resolver.write_typeinfo(buffer, classinfo)
+                typeinfo = self.type_resolver.get_typeinfo(type(s))
+                self.type_resolver.write_typeinfo(buffer, typeinfo)
                 if self.is_py:
-                    classinfo.serializer.write(buffer, s)
+                    typeinfo.serializer.write(buffer, s)
                 else:
-                    classinfo.serializer.xwrite(buffer, s)
+                    typeinfo.serializer.xwrite(buffer, s)
 
     def read(self, buffer):
         len_ = buffer.read_varuint32()
@@ -343,13 +343,13 @@ class CollectionSerializer(Serializer):
         collect_flag = buffer.read_int8()
         if (collect_flag & COLLECTION_NOT_SAME_TYPE) == 0:
             if collect_flag & COLLECTION_NOT_DECL_ELEMENT_TYPE != 0:
-                classinfo = self.class_resolver.read_typeinfo(buffer)
+                typeinfo = self.type_resolver.read_typeinfo(buffer)
             else:
-                classinfo = self.elem_typeinfo
+                typeinfo = self.elem_typeinfo
             if (collect_flag & COLLECTION_TRACKING_REF) == 0:
-                self._read_same_type_no_ref(buffer, len_, collection_, 
classinfo)
+                self._read_same_type_no_ref(buffer, len_, collection_, 
typeinfo)
             else:
-                self._read_same_type_ref(buffer, len_, collection_, classinfo)
+                self._read_same_type_ref(buffer, len_, collection_, typeinfo)
         else:
             self._read_different_types(buffer, len_, collection_)
         return collection_
@@ -360,24 +360,24 @@ class CollectionSerializer(Serializer):
     def _add_element(self, collection_, element):
         raise NotImplementedError
 
-    def _read_same_type_no_ref(self, buffer, len_, collection_, classinfo):
+    def _read_same_type_no_ref(self, buffer, len_, collection_, typeinfo):
         if self.is_py:
             for _ in range(len_):
-                self._add_element(collection_, 
classinfo.serializer.read(buffer))
+                self._add_element(collection_, 
typeinfo.serializer.read(buffer))
         else:
             for _ in range(len_):
-                self._add_element(collection_, 
classinfo.serializer.xread(buffer))
+                self._add_element(collection_, 
typeinfo.serializer.xread(buffer))
 
-    def _read_same_type_ref(self, buffer, len_, collection_, classinfo):
+    def _read_same_type_ref(self, buffer, len_, collection_, typeinfo):
         for _ in range(len_):
             ref_id = self.ref_resolver.try_preserve_ref_id(buffer)
             if ref_id < NOT_NULL_VALUE_FLAG:
                 obj = self.ref_resolver.get_read_object()
             else:
                 if self.is_py:
-                    obj = classinfo.serializer.read(buffer)
+                    obj = typeinfo.serializer.read(buffer)
                 else:
-                    obj = classinfo.serializer.xread(buffer)
+                    obj = typeinfo.serializer.xread(buffer)
                 self.ref_resolver.set_read_object(ref_id, obj)
             self._add_element(collection_, obj)
 
@@ -386,7 +386,7 @@ class CollectionSerializer(Serializer):
             self._add_element(
                 collection_,
                 get_next_element(
-                    buffer, self.ref_resolver, self.class_resolver, self.is_py
+                    buffer, self.ref_resolver, self.type_resolver, self.is_py
                 ),
             )
 
@@ -433,15 +433,15 @@ class SetSerializer(CollectionSerializer):
         collection_.add(element)
 
 
-def get_next_element(buffer, ref_resolver, class_resolver, is_py):
+def get_next_element(buffer, ref_resolver, type_resolver, is_py):
     ref_id = ref_resolver.try_preserve_ref_id(buffer)
     if ref_id < NOT_NULL_VALUE_FLAG:
         return ref_resolver.get_read_object()
-    classinfo = class_resolver.read_typeinfo(buffer)
+    typeinfo = type_resolver.read_typeinfo(buffer)
     if is_py:
-        obj = classinfo.serializer.read(buffer)
+        obj = typeinfo.serializer.read(buffer)
     else:
-        obj = classinfo.serializer.xread(buffer)
+        obj = typeinfo.serializer.xread(buffer)
     ref_resolver.set_read_object(ref_id, obj)
     return obj
 
@@ -449,7 +449,7 @@ def get_next_element(buffer, ref_resolver, class_resolver, 
is_py):
 class MapSerializer(Serializer):
     def __init__(self, fory, type_, key_serializer=None, 
value_serializer=None):
         super().__init__(fory, type_)
-        self.class_resolver = fory.class_resolver
+        self.type_resolver = fory.type_resolver
         self.ref_resolver = fory.ref_resolver
         self.key_serializer = key_serializer
         self.value_serializer = value_serializer
@@ -461,7 +461,7 @@ class MapSerializer(Serializer):
         if length == 0:
             return
         fory = self.fory
-        class_resolver = fory.class_resolver
+        type_resolver = fory.type_resolver
         ref_resolver = fory.ref_resolver
         key_serializer = self.key_serializer
         value_serializer = self.value_serializer
@@ -521,16 +521,16 @@ class MapSerializer(Serializer):
             if key_serializer is not None:
                 chunk_header |= KEY_DECL_TYPE
             else:
-                key_classinfo = self.class_resolver.get_classinfo(key_cls)
-                class_resolver.write_typeinfo(buffer, key_classinfo)
-                key_serializer = key_classinfo.serializer
+                key_typeinfo = self.type_resolver.get_typeinfo(key_cls)
+                type_resolver.write_typeinfo(buffer, key_typeinfo)
+                key_serializer = key_typeinfo.serializer
 
             if value_serializer is not None:
                 chunk_header |= VALUE_DECL_TYPE
             else:
-                value_classinfo = self.class_resolver.get_classinfo(value_cls)
-                class_resolver.write_typeinfo(buffer, value_classinfo)
-                value_serializer = value_classinfo.serializer
+                value_typeinfo = self.type_resolver.get_typeinfo(value_cls)
+                type_resolver.write_typeinfo(buffer, value_typeinfo)
+                value_serializer = value_typeinfo.serializer
 
             key_write_ref = (
                 key_serializer.need_to_write_ref if key_serializer else False
@@ -575,7 +575,7 @@ class MapSerializer(Serializer):
     def read(self, buffer):
         fory = self.fory
         ref_resolver = self.ref_resolver
-        class_resolver = self.class_resolver
+        type_resolver = self.type_resolver
         size = buffer.read_varuint32()
         map_ = {}
         ref_resolver.reference(map_)
@@ -636,9 +636,9 @@ class MapSerializer(Serializer):
             value_is_declared_type = (chunk_header & VALUE_DECL_TYPE) != 0
             chunk_size = buffer.read_uint8()
             if not key_is_declared_type:
-                key_serializer = 
class_resolver.read_typeinfo(buffer).serializer
+                key_serializer = type_resolver.read_typeinfo(buffer).serializer
             if not value_is_declared_type:
-                value_serializer = 
class_resolver.read_typeinfo(buffer).serializer
+                value_serializer = 
type_resolver.read_typeinfo(buffer).serializer
             for i in range(chunk_size):
                 if track_key_ref:
                     ref_id = ref_resolver.try_preserve_ref_id(buffer)
diff --git a/python/pyfory/_struct.py b/python/pyfory/_struct.py
index 96a1bf46..e71be2ab 100644
--- a/python/pyfory/_struct.py
+++ b/python/pyfory/_struct.py
@@ -21,7 +21,7 @@ import logging
 import typing
 
 from pyfory.buffer import Buffer
-from pyfory.error import ClassNotCompatibleError
+from pyfory.error import TypeNotCompatibleError
 from pyfory.serializer import (
     ListSerializer,
     MapSerializer,
@@ -96,10 +96,10 @@ class ComplexTypeVisitor(TypeVisitor):
 
     def visit_other(self, field_name, type_, types_path=None):
         if is_subclass(type_, enum.Enum):
-            return self.fory.class_resolver.get_serializer(type_)
+            return self.fory.type_resolver.get_serializer(type_)
         if type_ not in basic_types and not is_py_array_type(type_):
             return None
-        serializer = self.fory.class_resolver.get_serializer(type_)
+        serializer = self.fory.type_resolver.get_serializer(type_)
         assert not isinstance(serializer, (PickleSerializer,))
         return serializer
 
@@ -117,7 +117,7 @@ _UNKNOWN_TYPE_ID = -1
 _time_types = {datetime.date, datetime.datetime, datetime.timedelta}
 
 
-def _sort_fields(class_resolver, field_names, serializers):
+def _sort_fields(type_resolver, field_names, serializers):
     boxed_types = []
     collection_types = []
     map_types = []
@@ -130,7 +130,7 @@ def _sort_fields(class_resolver, field_names, serializers):
         else:
             type_ids.append(
                 (
-                    class_resolver.get_classinfo(serializer.type_).type_id,
+                    type_resolver.get_typeinfo(serializer.type_).type_id,
                     serializer,
                     field_name,
                 )
@@ -185,7 +185,7 @@ class ComplexObjectSerializer(Serializer):
             serializer = infer_field(key, self._type_hints[key], visitor, 
types_path=[])
             self._serializers[index] = serializer
         self._serializers, self._field_names = _sort_fields(
-            fory.class_resolver, self._field_names, self._serializers
+            fory.type_resolver, self._field_names, self._serializers
         )
 
         from pyfory import Language
@@ -218,9 +218,9 @@ class ComplexObjectSerializer(Serializer):
             self._hash = _get_hash(self.fory, self._field_names, 
self._type_hints)
         hash_ = buffer.read_int32()
         if hash_ != self._hash:
-            raise ClassNotCompatibleError(
+            raise TypeNotCompatibleError(
                 f"Hash {hash_} is not consistent with {self._hash} "
-                f"for class {self.type_}",
+                f"for type {self.type_}",
             )
         obj = self.type_.__new__(self.type_)
         self.fory.ref_resolver.reference(obj)
@@ -245,33 +245,31 @@ class StructHashVisitor(TypeVisitor):
 
     def visit_list(self, field_name, elem_type, types_path=None):
         # TODO add list element type to hash.
-        xtype_id = self.fory.class_resolver.get_classinfo(list).type_id
+        xtype_id = self.fory.type_resolver.get_typeinfo(list).type_id
         self._hash = self._compute_field_hash(self._hash, abs(xtype_id))
 
     def visit_dict(self, field_name, key_type, value_type, types_path=None):
         # TODO add map key/value type to hash.
-        xtype_id = self.fory.class_resolver.get_classinfo(dict).type_id
+        xtype_id = self.fory.type_resolver.get_typeinfo(dict).type_id
         self._hash = self._compute_field_hash(self._hash, abs(xtype_id))
 
     def visit_customized(self, field_name, type_, types_path=None):
-        classinfo = self.fory.class_resolver.get_classinfo(type_, create=False)
+        typeinfo = self.fory.type_resolver.get_typeinfo(type_, create=False)
         hash_value = 0
-        if classinfo is not None:
-            hash_value = classinfo.type_id
-            if TypeId.is_namespaced_type(classinfo.type_id):
-                hash_value = compute_string_hash(
-                    classinfo.namespace + classinfo.typename
-                )
+        if typeinfo is not None:
+            hash_value = typeinfo.type_id
+            if TypeId.is_namespaced_type(typeinfo.type_id):
+                hash_value = compute_string_hash(typeinfo.namespace + 
typeinfo.typename)
         self._hash = self._compute_field_hash(self._hash, hash_value)
 
     def visit_other(self, field_name, type_, types_path=None):
-        classinfo = self.fory.class_resolver.get_classinfo(type_, create=False)
-        if classinfo is None:
+        typeinfo = self.fory.type_resolver.get_typeinfo(type_, create=False)
+        if typeinfo is None:
             id_ = 0
         else:
-            serializer = classinfo.serializer
+            serializer = typeinfo.serializer
             assert not isinstance(serializer, (PickleSerializer,))
-            id_ = classinfo.type_id
+            id_ = typeinfo.type_id
             assert id_ is not None, serializer
         id_ = abs(id_)
         self._hash = self._compute_field_hash(self._hash, id_)
diff --git a/python/pyfory/error.py b/python/pyfory/error.py
index 6fb94cc9..84d3173a 100644
--- a/python/pyfory/error.py
+++ b/python/pyfory/error.py
@@ -20,7 +20,7 @@ class ForyError(Exception):
     pass
 
 
-class ClassNotCompatibleError(ForyError):
+class TypeNotCompatibleError(ForyError):
     pass
 
 
diff --git a/python/pyfory/format/infer.py b/python/pyfory/format/infer.py
index 1de2e0c5..551db3cc 100644
--- a/python/pyfory/format/infer.py
+++ b/python/pyfory/format/infer.py
@@ -24,13 +24,13 @@ from functools import partial
 from typing import Optional
 from pyfory.type import get_qualified_classname, TypeVisitor, infer_field
 
-__class_map__ = {}
+__type_map__ = {}
 __schemas__ = {}  # ensure `id(schema)` doesn't get duplicate.
 
 
 def get_cls_by_schema(schema):
     id_ = id(schema)
-    if id_ not in __class_map__:
+    if id_ not in __type_map__:
         meta = {} if schema.metadata is None else schema.metadata
         cls_name = meta.get(b"cls", b"").decode()
         if cls_name:
@@ -45,9 +45,9 @@ def get_cls_by_schema(schema):
             cls_ = record_class_factory(
                 "Record" + str(id(schema)), [f.name for f in schema]
             )
-        __class_map__[id_] = cls_
+        __type_map__[id_] = cls_
         __schemas__[id_] = schema
-    return __class_map__[id_]
+    return __type_map__[id_]
 
 
 def remove_schema(schema):
@@ -55,7 +55,7 @@ def remove_schema(schema):
 
 
 def reset():
-    __class_map__.clear()
+    __type_map__.clear()
     __schemas__.clear()
 
 
diff --git a/python/pyfory/serializer.py b/python/pyfory/serializer.py
index aafb8a29..6437c62e 100644
--- a/python/pyfory/serializer.py
+++ b/python/pyfory/serializer.py
@@ -29,7 +29,7 @@ from pyfory.codegen import (
     gen_read_nullable_basic_stmts,
     compile_function,
 )
-from pyfory.error import ClassNotCompatibleError
+from pyfory.error import TypeNotCompatibleError
 from pyfory.lib.collection import WeakIdentityKeyDictionary
 from pyfory.resolver import NULL_FLAG, NOT_NULL_VALUE_FLAG
 
@@ -357,7 +357,7 @@ class DataClassSerializer(Serializer):
             f"{ref_resolver}.reference({obj})",
             f"read_hash = {buffer}.read_int32()",
             f"if read_hash != {self._hash}:",
-            f"""   raise ClassNotCompatibleError(
+            f"""   raise TypeNotCompatibleError(
             "Hash read_hash is not consistent with {self._hash} for 
{self.type_}")""",
         ]
         if not self._has_slots:
@@ -399,9 +399,9 @@ class DataClassSerializer(Serializer):
     def read(self, buffer):
         hash_ = buffer.read_int32()
         if hash_ != self._hash:
-            raise ClassNotCompatibleError(
+            raise TypeNotCompatibleError(
                 f"Hash {hash_} is not consistent with {self._hash} "
-                f"for class {self.type_}",
+                f"for type {self.type_}",
             )
         obj = self.type_.__new__(self.type_)
         self.fory.ref_resolver.reference(obj)
@@ -536,7 +536,7 @@ class DynamicPyArraySerializer(Serializer):
         return arr
 
     def write(self, buffer, value):
-        buffer.write_varuint32(PickleSerializer.PICKLE_CLASS_ID)
+        buffer.write_varuint32(PickleSerializer.PICKLE_TYPE_ID)
         self.fory.handle_unsupported_write(buffer, value)
 
     def read(self, buffer):
@@ -598,7 +598,7 @@ class Numpy1DArraySerializer(Serializer):
         return np.frombuffer(data, dtype=self.dtype)
 
     def write(self, buffer, value):
-        buffer.write_int8(PickleSerializer.PICKLE_CLASS_ID)
+        buffer.write_int8(PickleSerializer.PICKLE_TYPE_ID)
         self.fory.handle_unsupported_write(buffer, value)
 
     def read(self, buffer):
@@ -621,7 +621,7 @@ class NDArraySerializer(Serializer):
         raise NotImplementedError("Multi-dimensional array not supported 
currently")
 
     def write(self, buffer, value):
-        buffer.write_int8(PickleSerializer.PICKLE_CLASS_ID)
+        buffer.write_int8(PickleSerializer.PICKLE_TYPE_ID)
         self.fory.handle_unsupported_write(buffer, value)
 
     def read(self, buffer):
@@ -654,7 +654,7 @@ class BytesBufferObject(BufferObject):
 
 
 class PickleSerializer(Serializer):
-    PICKLE_CLASS_ID = 96
+    PICKLE_TYPE_ID = 96
 
     def xwrite(self, buffer, value):
         raise NotImplementedError
diff --git a/python/pyfory/tests/test_cross_language.py 
b/python/pyfory/tests/test_cross_language.py
index 789d20d4..f04627ce 100644
--- a/python/pyfory/tests/test_cross_language.py
+++ b/python/pyfory/tests/test_cross_language.py
@@ -495,7 +495,7 @@ def test_struct_hash(data_file_path):
     read_hash = pyfory.Buffer(data_bytes).read_int32()
     fory = pyfory.Fory(language=pyfory.Language.XLANG, ref_tracking=True)
     fory.register_type(ComplexObject1, typename="ComplexObject1")
-    serializer = fory.class_resolver.get_serializer(ComplexObject1)
+    serializer = fory.type_resolver.get_serializer(ComplexObject1)
     from pyfory._struct import _get_hash
 
     v = _get_hash(fory, serializer._field_names, serializer._type_hints)
diff --git a/python/pyfory/tests/test_serializer.py 
b/python/pyfory/tests/test_serializer.py
index da481c24..3daeaca2 100644
--- a/python/pyfory/tests/test_serializer.py
+++ b/python/pyfory/tests/test_serializer.py
@@ -52,7 +52,7 @@ def test_float():
     fory = Fory(language=Language.PYTHON, ref_tracking=True)
     assert ser_de(fory, -1.0) == -1.0
     assert ser_de(fory, 1 / 3) == 1 / 3
-    serializer = fory.class_resolver.get_serializer(float)
+    serializer = fory.type_resolver.get_serializer(float)
     assert type(serializer) is pyfory.Float64Serializer
 
 
@@ -130,18 +130,18 @@ def test_big_chunk_dict(track_ref):
 @pytest.mark.parametrize("language", [Language.XLANG, Language.PYTHON])
 def test_basic_serializer(language):
     fory = Fory(language=language, ref_tracking=True)
-    classinfo = fory.class_resolver.get_classinfo(datetime.datetime)
+    typeinfo = fory.type_resolver.get_typeinfo(datetime.datetime)
     assert isinstance(
-        classinfo.serializer, (TimestampSerializer, 
_serialization.TimestampSerializer)
+        typeinfo.serializer, (TimestampSerializer, 
_serialization.TimestampSerializer)
     )
     if language == Language.XLANG:
-        assert classinfo.type_id == TypeId.TIMESTAMP
-    classinfo = fory.class_resolver.get_classinfo(datetime.date)
+        assert typeinfo.type_id == TypeId.TIMESTAMP
+    typeinfo = fory.type_resolver.get_typeinfo(datetime.date)
     assert isinstance(
-        classinfo.serializer, (DateSerializer, _serialization.DateSerializer)
+        typeinfo.serializer, (DateSerializer, _serialization.DateSerializer)
     )
     if language == Language.XLANG:
-        assert classinfo.type_id == TypeId.LOCAL_DATE
+        assert typeinfo.type_id == TypeId.LOCAL_DATE
     assert ser_de(fory, True) is True
     assert ser_de(fory, False) is False
     assert ser_de(fory, -1) == -1
@@ -256,7 +256,7 @@ class RefTestClass2:
 def test_ref_cleanup(language):
     # FIXME this can't simulate the case where new objects are allocated on 
memory
     #  address of released tmp object.
-    fory = Fory(language=language, ref_tracking=True, 
require_class_registration=False)
+    fory = Fory(language=language, ref_tracking=True, 
require_type_registration=False)
     # TODO support Language.XLANG, current unpickler will error for xlang,
     o1 = RefTestClass1()
     o2 = RefTestClass2(f1=o1)
@@ -273,7 +273,7 @@ def test_ref_cleanup(language):
 
 @pytest.mark.parametrize("language", [Language.XLANG, Language.PYTHON])
 def test_array_serializer(language):
-    fory = Fory(language=language, ref_tracking=True, 
require_class_registration=False)
+    fory = Fory(language=language, ref_tracking=True, 
require_type_registration=False)
     for typecode in PyArraySerializer.typecode_dict.keys():
         arr = array.array(typecode, list(range(10)))
         new_arr = ser_de(fory, arr)
@@ -410,7 +410,7 @@ class RegisterClass:
 
 def test_register_py_serializer():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
 
     class Serializer(pyfory.Serializer):
@@ -464,7 +464,7 @@ def test_register_type():
 
 def test_pickle_fallback():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
     o1 = [1, True, np.dtype(np.int32)]
     data1 = fory.serialize(o1)
@@ -478,7 +478,7 @@ def test_pickle_fallback():
 
 def test_unsupported_callback():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
 
     def f1(x):
@@ -534,7 +534,7 @@ def test_enum():
     assert ser_de(fory, EnumClass.E2) == EnumClass.E2
     assert ser_de(fory, EnumClass.E3) == EnumClass.E3
     assert ser_de(fory, EnumClass.E4) == EnumClass.E4
-    assert isinstance(fory.class_resolver.get_serializer(EnumClass), 
EnumSerializer)
+    assert isinstance(fory.type_resolver.get_serializer(EnumClass), 
EnumSerializer)
 
 
 def test_duplicate_serialize():
@@ -562,7 +562,7 @@ def test_cache_serializer():
 
 def test_pandas_range_index():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
     fory.register_type(
         pd.RangeIndex, serializer=pyfory.PandasRangeIndexSerializer(fory)
@@ -585,7 +585,7 @@ class PyDataClass1:
 
 def test_py_serialize_dataclass():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
     obj1 = PyDataClass1(
         f1=1, f2=-2.0, f3="abc", f4=True, f5="xyz", f6=[1, 2], f7={"k1": "v1"}
@@ -597,7 +597,7 @@ def test_py_serialize_dataclass():
 
 def test_function():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
     c = fory.deserialize(fory.serialize(lambda x: x * 2))
     assert c(2) == 4
@@ -622,7 +622,7 @@ class MapFields:
 
 def test_map_fields_chunk_serializer():
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
 
     simple_dict = {"a": 1, "b": 2, "c": 3}
diff --git a/python/pyfory/tests/test_struct.py 
b/python/pyfory/tests/test_struct.py
index a3f63221..7e65acdb 100644
--- a/python/pyfory/tests/test_struct.py
+++ b/python/pyfory/tests/test_struct.py
@@ -93,7 +93,7 @@ class ChildClass1(SuperClass1):
     f3: Dict[str, pyfory.Float64Type] = None
 
 
-def test_require_class_registration():
+def test_require_type_registration():
     fory = Fory(language=Language.PYTHON, ref_tracking=True)
     obj = ChildClass1(f1="a", f2=-10, f3={"a": -10.0, "b": 1 / 3})
     with pytest.raises(TypeUnregisteredError):
@@ -105,11 +105,11 @@ def test_inheritance():
     print(type_hints)
     assert type_hints.keys() == {"f1", "f2", "f3"}
     fory = Fory(
-        language=Language.PYTHON, ref_tracking=True, 
require_class_registration=False
+        language=Language.PYTHON, ref_tracking=True, 
require_type_registration=False
     )
     obj = ChildClass1(f1="a", f2=-10, f3={"a": -10.0, "b": 1 / 3})
     assert ser_de(fory, obj) == obj
     assert (
-        type(fory.class_resolver.get_serializer(ChildClass1))
+        type(fory.type_resolver.get_serializer(ChildClass1))
         == pyfory.DataClassSerializer
     )


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to