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

(fory) branch main updated: feat(protocol): add float8 and bfloat16 to protocol spec (#3259)

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 f65adde84 feat(protocol): add float8 and bfloat16 to protocol spec (#3259)
f65adde84 is described below

commit f65adde8452ff1312ba0fbe645ae7d3a22e87a7c
Author: Shawn Yang <sh...@gmail.com>
AuthorDate: Wed Feb 4 15:27:27 2026 +0800

    feat(protocol): add float8 and bfloat16 to protocol spec (#3259)
    
    ## Why?
    
    - Add float8 and bfloat16 to the xlang type system for ML/quantized data
    support.
    - Align type IDs and primitive handling across language runtimes and
    specs.
    
    ## What does this PR do?
    
    - Introduces FLOAT8/BFLOAT16 TypeIds (and array TypeIds), shifting
    subsequent IDs, and updates xlang/java specs/type mapping docs.
    - Updates primitive size/skip/type registration logic across C++, Java,
    Go, Rust, Python, JS, and Dart to recognize the new types.
    - Renames Dart constants module (`obj_type` -> `types`) and updates
    references/tests to match the new type IDs.
    
    ## Related issues
    
    #1017
    
    ## Does this PR introduce any user-facing change?
    
    Yes. New FLOAT8/BFLOAT16 types (and arrays) are added to the protocol,
    and type ID values after them are shifted.
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
---
 cpp/fory/serialization/skip.cc                     |  11 ++
 cpp/fory/serialization/struct_serializer.h         |  22 ++-
 cpp/fory/serialization/type_resolver.cc            |   6 +
 cpp/fory/type/type.h                               |  82 +++++-----
 .../uint_annotation_analyzer_test.dart             |   2 +-
 dart/packages/fory/lib/fory.dart                   |   2 +-
 .../lib/src/codegen/analyze/analysis_wrappers.dart |   2 +-
 .../impl/annotation/uint_annotation_analyzer.dart  |   2 +-
 .../analyze/impl/type/type_analyzer_impl.dart      |   2 +-
 .../codegen/analyze/interface/type_analyzer.dart   |   2 +-
 .../lib/src/codegen/meta/impl/type_adapter.dart    |   2 +-
 .../lib/src/codegen/meta/impl/type_immutable.dart  |   2 +-
 .../lib/src/codegen/meta/impl/type_spec_gen.dart   |   2 +-
 dart/packages/fory/lib/src/const/dart_type.dart    |   2 +-
 .../lib/src/const/{obj_type.dart => types.dart}    | 154 +++++++++++-------
 .../fory/lib/src/deserialize_coordinator.dart      |   2 +-
 .../src/exception/deserialization_exception.dart   |   2 +-
 .../lib/src/exception/serialization_exception.dart |   2 +-
 dart/packages/fory/lib/src/fory_context.dart       |   2 +-
 .../lib/src/meta/spec_wraps/type_spec_wrap.dart    |   2 +-
 .../fory/lib/src/meta/specs/class_spec.dart        |   2 +-
 .../fory/lib/src/meta/specs/custom_type_spec.dart  |   2 +-
 .../fory/lib/src/meta/specs/enum_spec.dart         |   2 +-
 .../fory/lib/src/meta/specs/type_spec.dart         |   2 +-
 dart/packages/fory/lib/src/meta/type_info.dart     |   2 +-
 .../lib/src/resolver/impl/xtype_resolver_impl.dart |   4 +-
 .../lib/src/resolver/struct_hash_resolver.dart     |   2 +-
 .../fory/lib/src/serialize_coordinator.dart        |   2 +-
 .../lib/src/serializer/boollist_serializer.dart    |   2 +-
 .../fory/lib/src/serializer/class_serializer.dart  |   2 +-
 .../collection/list/list_serializer.dart           |   2 +-
 .../serializer/collection/map/map_serializer.dart  |   2 +-
 .../serializer/collection/set/set_serializer.dart  |   2 +-
 .../fory/lib/src/serializer/enum_serializer.dart   |   4 +-
 .../src/serializer/primitive_type_serializer.dart  |   2 +-
 .../fory/lib/src/serializer/serializer.dart        |   2 +-
 .../fory/lib/src/serializer/serializer_pool.dart   |   2 +-
 .../fory/lib/src/serializer/string_serializer.dart |   2 +-
 .../lib/src/serializer/time/date_serializer.dart   |   2 +-
 .../src/serializer/time/timestamp_serializer.dart  |   2 +-
 .../serializer/typed_data_array_serializer.dart    |   2 +-
 docs/guide/go/troubleshooting.md                   |   2 +-
 docs/guide/java/configuration.md                   |   2 +-
 docs/guide/java/schema-evolution.md                |  24 +--
 docs/specification/java_serialization_spec.md      | 115 +++++---------
 docs/specification/xlang_serialization_spec.md     | 174 ++++++++++++---------
 docs/specification/xlang_type_mapping.md           |  95 ++++++-----
 go/fory/types.go                                   |  92 ++++++-----
 .../src/main/java/org/apache/fory/Fory.java        |  14 +-
 .../main/java/org/apache/fory/config/Config.java   |  18 +--
 .../java/org/apache/fory/config/ForyBuilder.java   |  25 +--
 .../main/java/org/apache/fory/meta/FieldTypes.java |  13 +-
 .../org/apache/fory/meta/NativeTypeDefDecoder.java |   7 +-
 .../java/org/apache/fory/meta/TypeDefDecoder.java  |   8 +-
 .../org/apache/fory/resolver/ClassResolver.java    |  30 ++--
 .../org/apache/fory/resolver/TypeResolver.java     |  43 +++--
 .../org/apache/fory/resolver/XtypeResolver.java    |  40 ++---
 .../apache/fory/serializer/ArraySerializers.java   |  17 +-
 .../org/apache/fory/serializer/EnumSerializer.java |  10 +-
 .../{NonexistentClass.java => UnknownClass.java}   |  56 +++----
 ...rializers.java => UnknownClassSerializers.java} |  58 ++++---
 .../main/java/org/apache/fory/type/TypeUtils.java  |   4 +-
 .../src/main/java/org/apache/fory/type/Types.java  |  94 ++++++-----
 .../fory-core/native-image.properties              |   8 +-
 .../test/java/org/apache/fory/ForyTestBase.java    |  27 ++++
 .../src/test/java/org/apache/fory/TestUtils.java   |   2 +-
 .../fory/resolver/SerializationContextTest.java    |   2 +-
 .../apache/fory/serializer/EnumSerializerTest.java |   2 +-
 .../serializer/MetaSharedObjectSerializerTest.java |   8 +-
 ...sTest.java => UnknownClassSerializersTest.java} | 119 +++++++-------
 .../collection/ChildContainerSerializersTest.java  |   2 +-
 .../org/apache/fory/xlang/PyCrossLanguageTest.java |   5 +-
 .../fory-testsuite/src/test/java/org/test/Org.java |   2 +-
 javascript/packages/fory/lib/meta/TypeMeta.ts      |  10 +-
 javascript/packages/fory/lib/type.ts               |  82 +++++-----
 javascript/packages/fory/lib/typeInfo.ts           |   4 +
 python/pyfory/format/schema.pxi                    |  36 +++--
 python/pyfory/format/schema.py                     |  48 +++---
 python/pyfory/includes/libformat.pxd               |  78 ++++-----
 python/pyfory/includes/libserialization.pxd        |  78 ++++-----
 python/pyfory/meta/typedef_decoder.py              |   2 +-
 python/pyfory/types.py                             |  86 +++++-----
 rust/fory-core/src/meta/type_meta.rs               |   2 +
 rust/fory-core/src/types.rs                        | 172 +++++++++++---------
 rust/fory-derive/src/object/util.rs                |   4 +
 rust/tests/tests/test_marker.rs                    |  12 +-
 86 files changed, 1145 insertions(+), 938 deletions(-)

diff --git a/cpp/fory/serialization/skip.cc b/cpp/fory/serialization/skip.cc
index 9209c4ae8..946d6fbf4 100644
--- a/cpp/fory/serialization/skip.cc
+++ b/cpp/fory/serialization/skip.cc
@@ -493,10 +493,12 @@ void skip_field_value(ReadContext &ctx, const FieldType &field_type,
   switch (tid) {
   case TypeId::BOOL:
   case TypeId::INT8:
+  case TypeId::FLOAT8:
     ctx.buffer().increase_reader_index(1);
     return;
 
   case TypeId::INT16:
+  case TypeId::BFLOAT16:
   case TypeId::FLOAT16:
     ctx.buffer().increase_reader_index(2);
     return;
@@ -595,9 +597,17 @@ void skip_field_value(ReadContext &ctx, const FieldType &field_type,
   case TypeId::INT16_ARRAY:
   case TypeId::INT32_ARRAY:
   case TypeId::INT64_ARRAY:
+  case TypeId::FLOAT8_ARRAY:
   case TypeId::FLOAT16_ARRAY:
+  case TypeId::BFLOAT16_ARRAY:
   case TypeId::FLOAT32_ARRAY:
   case TypeId::FLOAT64_ARRAY: {
+    if (tid == TypeId::FLOAT8_ARRAY) {
+      ctx.buffer().increase_reader_index(1);
+      if (FORY_PREDICT_FALSE(ctx.has_error())) {
+        return;
+      }
+    }
     // Read array length
     uint32_t len = ctx.read_var_uint32(ctx.error());
     if (FORY_PREDICT_FALSE(ctx.has_error())) {
@@ -609,6 +619,7 @@ void skip_field_value(ReadContext &ctx, const FieldType &field_type,
     switch (tid) {
     case TypeId::INT16_ARRAY:
     case TypeId::FLOAT16_ARRAY:
+    case TypeId::BFLOAT16_ARRAY:
       elem_size = 2;
       break;
     case TypeId::INT32_ARRAY:
diff --git a/cpp/fory/serialization/struct_serializer.h b/cpp/fory/serialization/struct_serializer.h
index 408a288b0..b864539b1 100644
--- a/cpp/fory/serialization/struct_serializer.h
+++ b/cpp/fory/serialization/struct_serializer.h
@@ -75,15 +75,16 @@ namespace detail {
 
 /// Helper to check if a TypeId represents a primitive type.
 /// Per xlang spec, primitive types are: bool, int8-64, var_int32/64,
-/// sli_int64, float16/32/64. For native mode (xlang=false), also includes
-/// unsigned types: u8-64. All other types (string, list, set, map, struct,
-/// enum, etc.) are non-primitive and require ref flags.
+/// sli_int64, float8/16/bfloat16/32/64. For native mode (xlang=false), also
+/// includes unsigned types: u8-64. All other types (string, list, set, map,
+/// struct, enum, etc.) are non-primitive and require ref flags.
 inline constexpr bool is_primitive_type_id(TypeId type_id) {
   return type_id == TypeId::BOOL || type_id == TypeId::INT8 ||
          type_id == TypeId::INT16 || type_id == TypeId::INT32 ||
          type_id == TypeId::VARINT32 || type_id == TypeId::INT64 ||
          type_id == TypeId::VARINT64 || type_id == TypeId::TAGGED_INT64 ||
-         type_id == TypeId::FLOAT16 || type_id == TypeId::FLOAT32 ||
+         type_id == TypeId::FLOAT8 || type_id == TypeId::FLOAT16 ||
+         type_id == TypeId::BFLOAT16 || type_id == TypeId::FLOAT32 ||
          type_id == TypeId::FLOAT64 ||
          // Unsigned types
          type_id == TypeId::UINT8 || type_id == TypeId::UINT16 ||
@@ -1030,10 +1031,12 @@ template <typename T> struct CompileTimeFieldHelpers {
     case TypeId::BOOL:
     case TypeId::INT8:
     case TypeId::UINT8:
+    case TypeId::FLOAT8:
       return 1;
     case TypeId::INT16:
     case TypeId::UINT16:
     case TypeId::FLOAT16:
+    case TypeId::BFLOAT16:
       return 2;
     case TypeId::INT32:
     case TypeId::VARINT32:
@@ -1249,10 +1252,12 @@ template <typename T> struct CompileTimeFieldHelpers {
         switch (static_cast<TypeId>(tid)) {
         case TypeId::BOOL:
         case TypeId::INT8:
+        case TypeId::FLOAT8:
           total += 1;
           break;
         case TypeId::INT16:
         case TypeId::FLOAT16:
+        case TypeId::BFLOAT16:
           total += 2;
           break;
         case TypeId::INT32:
@@ -1313,7 +1318,8 @@ template <typename T> struct CompileTimeFieldHelpers {
       compute_primitive_field_count();
 
   /// Check if a type_id represents a fixed-size primitive (not varint)
-  /// Includes bool, int8, int16, int32, int64, float16, float32, float64
+  /// Includes bool, int8, int16, int32, int64, float8, float16, bfloat16,
+  /// float32, float64
   static constexpr bool is_fixed_size_primitive(uint32_t tid) {
     switch (static_cast<TypeId>(tid)) {
     case TypeId::BOOL:
@@ -1321,7 +1327,9 @@ template <typename T> struct CompileTimeFieldHelpers {
     case TypeId::INT16:
     case TypeId::INT32:
     case TypeId::INT64:
+    case TypeId::FLOAT8:
     case TypeId::FLOAT16:
+    case TypeId::BFLOAT16:
     case TypeId::FLOAT32:
     case TypeId::FLOAT64:
       return true;
@@ -1361,9 +1369,11 @@ template <typename T> struct CompileTimeFieldHelpers {
     switch (static_cast<TypeId>(tid)) {
     case TypeId::BOOL:
     case TypeId::INT8:
+    case TypeId::FLOAT8:
       return 1;
     case TypeId::INT16:
     case TypeId::FLOAT16:
+    case TypeId::BFLOAT16:
       return 2;
     case TypeId::INT32:
       return 4;
@@ -1480,11 +1490,13 @@ template <typename T> struct CompileTimeFieldHelpers {
         case TypeId::BOOL:
         case TypeId::INT8:
         case TypeId::UINT8:
+        case TypeId::FLOAT8:
           total += 1;
           break;
         case TypeId::INT16:
         case TypeId::UINT16:
         case TypeId::FLOAT16:
+        case TypeId::BFLOAT16:
           total += 2;
           break;
         case TypeId::INT32:
diff --git a/cpp/fory/serialization/type_resolver.cc b/cpp/fory/serialization/type_resolver.cc
index a205723d0..87d8003a8 100644
--- a/cpp/fory/serialization/type_resolver.cc
+++ b/cpp/fory/serialization/type_resolver.cc
@@ -727,10 +727,12 @@ int32_t get_primitive_type_size(uint32_t type_id) {
   case TypeId::BOOL:
   case TypeId::INT8:
   case TypeId::UINT8:
+  case TypeId::FLOAT8:
     return 1;
   case TypeId::INT16:
   case TypeId::UINT16:
   case TypeId::FLOAT16:
+  case TypeId::BFLOAT16:
     return 2;
   case TypeId::INT32:
   case TypeId::VARINT32:
@@ -1468,7 +1470,9 @@ void TypeResolver::register_builtin_types() {
   register_type_id_only(TypeId::UINT64);
   register_type_id_only(TypeId::VAR_UINT64);
   register_type_id_only(TypeId::TAGGED_UINT64);
+  register_type_id_only(TypeId::FLOAT8);
   register_type_id_only(TypeId::FLOAT16);
+  register_type_id_only(TypeId::BFLOAT16);
   register_type_id_only(TypeId::FLOAT32);
   register_type_id_only(TypeId::FLOAT64);
   register_type_id_only(TypeId::STRING);
@@ -1483,7 +1487,9 @@ void TypeResolver::register_builtin_types() {
   register_type_id_only(TypeId::UINT16_ARRAY);
   register_type_id_only(TypeId::UINT32_ARRAY);
   register_type_id_only(TypeId::UINT64_ARRAY);
+  register_type_id_only(TypeId::FLOAT8_ARRAY);
   register_type_id_only(TypeId::FLOAT16_ARRAY);
+  register_type_id_only(TypeId::BFLOAT16_ARRAY);
   register_type_id_only(TypeId::FLOAT32_ARRAY);
   register_type_id_only(TypeId::FLOAT64_ARRAY);
   register_type_id_only(TypeId::BINARY);
diff --git a/cpp/fory/type/type.h b/cpp/fory/type/type.h
index 75964282e..d19bc3c5b 100644
--- a/cpp/fory/type/type.h
+++ b/cpp/fory/type/type.h
@@ -55,84 +55,92 @@ enum class TypeId : uint8_t {
   VAR_UINT64 = 14,
   // a 64-bit unsigned integer which uses fory hybrid encoding.
   TAGGED_UINT64 = 15,
+  // an 8-bit floating point number.
+  FLOAT8 = 16,
   // a 16-bit floating point number.
-  FLOAT16 = 16,
+  FLOAT16 = 17,
+  // a 16-bit brain floating point number.
+  BFLOAT16 = 18,
   // a 32-bit floating point number.
-  FLOAT32 = 17,
+  FLOAT32 = 19,
   // a 64-bit floating point number including NaN and Infinity.
-  FLOAT64 = 18,
+  FLOAT64 = 20,
   // a text string encoded using Latin1/UTF16/UTF-8 encoding.
-  STRING = 19,
+  STRING = 21,
   // a sequence of objects.
-  LIST = 20,
+  LIST = 22,
   // an unordered set of unique elements.
-  SET = 21,
+  SET = 23,
   // a map of key-value pairs.
-  MAP = 22,
+  MAP = 24,
   // a data type consisting of a set of named values.
-  ENUM = 23,
+  ENUM = 25,
   // an enum whose value will be serialized as the registered name.
-  NAMED_ENUM = 24,
+  NAMED_ENUM = 26,
   // a morphic(final) type serialized by Fory Struct serializer.
-  STRUCT = 25,
+  STRUCT = 27,
   // a morphic(final) type serialized by Fory compatible Struct serializer.
-  COMPATIBLE_STRUCT = 26,
+  COMPATIBLE_STRUCT = 28,
   // a `struct` whose type mapping will be encoded as a name.
-  NAMED_STRUCT = 27,
+  NAMED_STRUCT = 29,
   // a `compatible_struct` whose type mapping will be encoded as a name.
-  NAMED_COMPATIBLE_STRUCT = 28,
+  NAMED_COMPATIBLE_STRUCT = 30,
   // a type which will be serialized by a customized serializer.
-  EXT = 29,
+  EXT = 31,
   // an `ext` type whose type mapping will be encoded as a name.
-  NAMED_EXT = 30,
+  NAMED_EXT = 32,
   // a union value whose schema identity is not embedded.
-  UNION = 31,
+  UNION = 33,
   // a union value with embedded numeric union type ID.
-  TYPED_UNION = 32,
+  TYPED_UNION = 34,
   // a union value with embedded union type name/TypeDef.
-  NAMED_UNION = 33,
+  NAMED_UNION = 35,
   // a null value with no data.
-  NONE = 34,
+  NONE = 36,
   // an absolute length of time, independent of any calendar/timezone,
   // as a count of nanoseconds.
-  DURATION = 35,
+  DURATION = 37,
   // a point in time, independent of any calendar/timezone, as a count
   // of nanoseconds.
-  TIMESTAMP = 36,
+  TIMESTAMP = 38,
   // a naive date without timezone. The count is days relative to an
   // epoch at UTC midnight on Jan 1, 1970.
-  DATE = 37,
+  DATE = 39,
   // exact decimal value represented as an integer value in two's
   // complement.
-  DECIMAL = 38,
+  DECIMAL = 40,
   // a variable-length array of bytes.
-  BINARY = 39,
+  BINARY = 41,
   // a multidimensional array with varying sub-array sizes but same type.
-  ARRAY = 40,
+  ARRAY = 42,
   // one-dimensional boolean array.
-  BOOL_ARRAY = 41,
+  BOOL_ARRAY = 43,
   // one-dimensional int8 array.
-  INT8_ARRAY = 42,
+  INT8_ARRAY = 44,
   // one-dimensional int16 array.
-  INT16_ARRAY = 43,
+  INT16_ARRAY = 45,
   // one-dimensional int32 array.
-  INT32_ARRAY = 44,
+  INT32_ARRAY = 46,
   // one-dimensional int64 array.
-  INT64_ARRAY = 45,
+  INT64_ARRAY = 47,
   // one-dimensional uint8 array.
-  UINT8_ARRAY = 46,
+  UINT8_ARRAY = 48,
   // one-dimensional uint16 array.
-  UINT16_ARRAY = 47,
+  UINT16_ARRAY = 49,
   // one-dimensional uint32 array.
-  UINT32_ARRAY = 48,
+  UINT32_ARRAY = 50,
   // one-dimensional uint64 array.
-  UINT64_ARRAY = 49,
+  UINT64_ARRAY = 51,
+  // one-dimensional float8 array.
+  FLOAT8_ARRAY = 52,
   // one-dimensional float16 array.
-  FLOAT16_ARRAY = 50,
+  FLOAT16_ARRAY = 53,
+  // one-dimensional bfloat16 array.
+  BFLOAT16_ARRAY = 54,
   // one-dimensional float32 array.
-  FLOAT32_ARRAY = 51,
+  FLOAT32_ARRAY = 55,
   // one-dimensional float64 array.
-  FLOAT64_ARRAY = 52,
+  FLOAT64_ARRAY = 56,
   // C++ specific types (not part of xlang spec)
   // 8-bits character.
   CHAR = 64,
diff --git a/dart/packages/fory-test/test/codegen_test/uint_annotation_analyzer_test.dart b/dart/packages/fory-test/test/codegen_test/uint_annotation_analyzer_test.dart
index 84621f0f9..8312d87ad 100644
--- a/dart/packages/fory-test/test/codegen_test/uint_annotation_analyzer_test.dart
+++ b/dart/packages/fory-test/test/codegen_test/uint_annotation_analyzer_test.dart
@@ -23,7 +23,7 @@ import 'package:analyzer/dart/element/element.dart';
 import 'package:build_test/build_test.dart';
 import 'package:fory/src/codegen/analyze/impl/annotation/uint_annotation_analyzer.dart';
 import 'package:fory/src/codegen/entity/location_mark.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:test/test.dart';
 
 void main() {
diff --git a/dart/packages/fory/lib/fory.dart b/dart/packages/fory/lib/fory.dart
index 61add53da..d2b4f89e4 100644
--- a/dart/packages/fory/lib/fory.dart
+++ b/dart/packages/fory/lib/fory.dart
@@ -38,7 +38,7 @@ export 'src/meta/specs/enum_spec.dart';
 export 'src/fory_impl.dart';
 
 // Constants
-export 'src/const/obj_type.dart';
+export 'src/const/types.dart';
 
 // User-related
 export 'src/furiable.dart';
diff --git a/dart/packages/fory/lib/src/codegen/analyze/analysis_wrappers.dart b/dart/packages/fory/lib/src/codegen/analyze/analysis_wrappers.dart
index 3eae799a1..5195a0d36 100644
--- a/dart/packages/fory/lib/src/codegen/analyze/analysis_wrappers.dart
+++ b/dart/packages/fory/lib/src/codegen/analyze/analysis_wrappers.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:analyzer/dart/element/type.dart';
 
 typedef TypeDecision = ({InterfaceType type, bool forceNullable});
diff --git a/dart/packages/fory/lib/src/codegen/analyze/impl/annotation/uint_annotation_analyzer.dart b/dart/packages/fory/lib/src/codegen/analyze/impl/annotation/uint_annotation_analyzer.dart
index 208de6a85..fef13f0f0 100644
--- a/dart/packages/fory/lib/src/codegen/analyze/impl/annotation/uint_annotation_analyzer.dart
+++ b/dart/packages/fory/lib/src/codegen/analyze/impl/annotation/uint_annotation_analyzer.dart
@@ -24,7 +24,7 @@ import 'package:fory/src/codegen/analyze/annotation/location_level_ensure.dart';
 import 'package:fory/src/codegen/const/location_level.dart';
 import 'package:fory/src/codegen/entity/location_mark.dart';
 import 'package:fory/src/codegen/exception/annotation_exception.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 /// Result of uint annotation analysis
 class UintAnnotationResult {
diff --git a/dart/packages/fory/lib/src/codegen/analyze/impl/type/type_analyzer_impl.dart b/dart/packages/fory/lib/src/codegen/analyze/impl/type/type_analyzer_impl.dart
index 7330a3156..7dd6d26e6 100644
--- a/dart/packages/fory/lib/src/codegen/analyze/impl/type/type_analyzer_impl.dart
+++ b/dart/packages/fory/lib/src/codegen/analyze/impl/type/type_analyzer_impl.dart
@@ -29,7 +29,7 @@ import 'package:fory/src/codegen/const/location_level.dart';
 import 'package:fory/src/codegen/entity/location_mark.dart';
 import 'package:fory/src/codegen/meta/impl/type_immutable.dart';
 import 'package:fory/src/codegen/meta/impl/type_spec_gen.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 class TypeAnalyzerImpl extends TypeAnalyzer{
 
diff --git a/dart/packages/fory/lib/src/codegen/analyze/interface/type_analyzer.dart b/dart/packages/fory/lib/src/codegen/analyze/interface/type_analyzer.dart
index 819267ee9..7b0c6b940 100644
--- a/dart/packages/fory/lib/src/codegen/analyze/interface/type_analyzer.dart
+++ b/dart/packages/fory/lib/src/codegen/analyze/interface/type_analyzer.dart
@@ -22,7 +22,7 @@ import 'package:fory/src/codegen/analyze/annotation/location_level_ensure.dart';
 import 'package:fory/src/codegen/const/location_level.dart';
 import 'package:fory/src/codegen/entity/location_mark.dart';
 import 'package:fory/src/codegen/meta/impl/type_spec_gen.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 abstract class TypeAnalyzer{
 
diff --git a/dart/packages/fory/lib/src/codegen/meta/impl/type_adapter.dart b/dart/packages/fory/lib/src/codegen/meta/impl/type_adapter.dart
index 53df787df..c0cc2f19e 100644
--- a/dart/packages/fory/lib/src/codegen/meta/impl/type_adapter.dart
+++ b/dart/packages/fory/lib/src/codegen/meta/impl/type_adapter.dart
@@ -23,7 +23,7 @@ import 'package:fory/src/codegen/meta/impl/type_spec_gen.dart';
 import 'package:fory/src/codegen/meta/lib_import_pack.dart';
 import 'package:fory/src/codegen/tool/codegen_tool.dart';
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 final class TypeAdapter extends GenExport{
   final TypeSpecGen typeSpec;
diff --git a/dart/packages/fory/lib/src/codegen/meta/impl/type_immutable.dart b/dart/packages/fory/lib/src/codegen/meta/impl/type_immutable.dart
index ea70e3a1c..30fcb329d 100644
--- a/dart/packages/fory/lib/src/codegen/meta/impl/type_immutable.dart
+++ b/dart/packages/fory/lib/src/codegen/meta/impl/type_immutable.dart
@@ -18,7 +18,7 @@
  */
 
 import 'package:meta/meta.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 @immutable
 class TypeImmutable {
diff --git a/dart/packages/fory/lib/src/codegen/meta/impl/type_spec_gen.dart b/dart/packages/fory/lib/src/codegen/meta/impl/type_spec_gen.dart
index 55570ce45..1d7a8d5c6 100644
--- a/dart/packages/fory/lib/src/codegen/meta/impl/type_spec_gen.dart
+++ b/dart/packages/fory/lib/src/codegen/meta/impl/type_spec_gen.dart
@@ -22,7 +22,7 @@ import 'package:fory/src/codegen/meta/gen_export.dart';
 import 'package:fory/src/codegen/meta/impl/type_immutable.dart';
 import 'package:fory/src/codegen/meta/lib_import_pack.dart';
 import 'package:fory/src/codegen/tool/codegen_tool.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 class TypeSpecGen extends GenExport{
   final TypeImmutable immutablePart;
diff --git a/dart/packages/fory/lib/src/const/dart_type.dart b/dart/packages/fory/lib/src/const/dart_type.dart
index e2fdf36fd..0612e9032 100644
--- a/dart/packages/fory/lib/src/const/dart_type.dart
+++ b/dart/packages/fory/lib/src/const/dart_type.dart
@@ -29,7 +29,7 @@ import 'package:fory/src/datatype/uint8.dart';
 import 'package:fory/src/datatype/uint16.dart';
 import 'package:fory/src/datatype/uint32.dart';
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/datatype/local_date.dart';
 import 'package:fory/src/datatype/timestamp.dart';
 
diff --git a/dart/packages/fory/lib/src/const/obj_type.dart b/dart/packages/fory/lib/src/const/types.dart
similarity index 73%
rename from dart/packages/fory/lib/src/const/obj_type.dart
rename to dart/packages/fory/lib/src/const/types.dart
index d91c25262..07d38f0e9 100644
--- a/dart/packages/fory/lib/src/const/obj_type.dart
+++ b/dart/packages/fory/lib/src/const/types.dart
@@ -61,139 +61,175 @@ enum ObjType {
   /// sli_int64: a 64-bit signed integer which uses fory SLI encoding.
   SLI_INT64(8, true), // 8
 
+  /// Unsigned 8-bit integer
+  UINT8(9, true), // 9
+
+  /// Unsigned 16-bit little-endian integer
+  UINT16(10, true), // 10
+
+  /// Unsigned 32-bit little-endian integer
+  UINT32(11, true), // 11
+
+  /// var_uint32: a 32-bit unsigned integer which uses fory var_uint32 encoding.
+  VAR_UINT32(12, true), // 12
+
+  /// Unsigned 64-bit little-endian integer
+  UINT64(13, true), // 13
+
+  /// var_uint64: a 64-bit unsigned integer which uses fory var_uint64 encoding.
+  VAR_UINT64(14, true), // 14
+
+  /// tagged_uint64: a 64-bit unsigned integer which uses fory tagged var_uint64 encoding.
+  TAGGED_UINT64(15, true), // 15
+
+  /// float8: an 8-bit floating point number.
+  FLOAT8(16, true), // 16
+
   /// float16: a 16-bit floating point number.
-  FLOAT16(9, true), // 9
+  FLOAT16(17, true), // 17
+
+  /// bfloat16: a 16-bit brain floating point number.
+  BFLOAT16(18, true), // 18
 
   // x
   /// float32: a 32-bit floating point number.
-  FLOAT32(10, true), // 10
+  FLOAT32(19, true), // 19
 
   // x
   /// float64: a 64-bit floating point number including NaN and Infinity.
-  FLOAT64(11, true), // 11
+  FLOAT64(20, true), // 20
 
   // x
   /// string: a text string encoded using Latin1/UTF16/UTF-8 encoding.
-  STRING(12, true), // 12
+  STRING(21, true), // 21
+
+  // x
+  /// A sequence of objects.
+  LIST(22, false), // 22
+
+  // x
+  /// An unordered set of unique elements.
+  SET(23, false), // 23
+
+  // x
+  /// A map of key-value pairs. Mutable types such as `list/map/set/array/tensor/arrow` are not
+  /// allowed as key of map.
+  MAP(24, false), // 24
 
   // x
   /// enum: a data type consisting of a set of named values.
-  ENUM(13, true), // 13
+  ENUM(25, true), // 25
 
   /// named_enum: an enum whose value will be serialized as the registered name.
-  NAMED_ENUM(14, true), // 14
+  NAMED_ENUM(26, true), // 26
 
   /// A dynamic(final) type serialized by Fory Struct serializer. i.e. it doesn't have subclasses.
   /// Suppose we're deserializing {@code List<SomeClass>}, we can save dynamic serializer dispatch
   /// since `SomeClass` is dynamic(final).
-  STRUCT(15, false), // 15
+  STRUCT(27, false), // 27
 
   /// A dynamic(final) type serialized by Fory compatible Struct serializer.
-  COMPATIBLE_STRUCT(16, false), // 16
+  COMPATIBLE_STRUCT(28, false), // 28
 
   // x
   /// A `struct` whose type mapping will be encoded as a name.
-  NAMED_STRUCT(17, false), // 17
+  NAMED_STRUCT(29, false), // 29
 
   /// A `compatible_struct` whose type mapping will be encoded as a name.
-  NAMED_COMPATIBLE_STRUCT(18, false), // 18
+  NAMED_COMPATIBLE_STRUCT(30, false), // 30
 
   /// A type which will be serialized by a customized serializer.
-  EXT(19, false), // 19
+  EXT(31, false), // 31
 
   /// An `ext` type whose type mapping will be encoded as a name.
-  NAMED_EXT(20, false), // 20
+  NAMED_EXT(32, false), // 32
 
-  // x
-  /// A sequence of objects.
-  LIST(21, false), // 21
+  /// A tagged union value whose schema identity is not embedded.
+  UNION(33, false), // 33
 
-  // x
-  /// An unordered set of unique elements.
-  SET(22, false), // 22
+  /// A union value with embedded numeric union type ID.
+  TYPED_UNION(34, false), // 34
 
-  // x
-  /// A map of key-value pairs. Mutable types such as `list/map/set/array/tensor/arrow` are not
-  /// allowed as key of map.
-  MAP(23, false), // 23
+  /// A union value with embedded union type name/TypeDef.
+  NAMED_UNION(35, false), // 35
+
+  /// Represents an empty/unit value with no data (e.g., for empty union alternatives).
+  NONE(36, true), // 36
 
   /// An absolute length of time, independent of any calendar/timezone, as a count of nanoseconds.
-  DURATION(24, true), // 24
+  DURATION(37, true), // 37
 
   // TODO: here time
   // x
   /// A point in time, independent of any calendar/timezone, as a count of nanoseconds. The count is
   /// relative to an epoch at UTC midnight on January 1, 1970.
-  TIMESTAMP(25, true), // 25
+  TIMESTAMP(38, true), // 38
 
   // TODO: here time
   /// A naive date without timezone. The count is days relative to an epoch at UTC midnight on Jan 1,
   /// 1970.
-  DATE(26, true), // 26
+  DATE(39, true), // 39
 
   /// Exact decimal value represented as an integer value in two's complement.
-  DECIMAL(27, true), // 27
+  DECIMAL(40, true), // 40
 
   // x
   /// A variable-length array of bytes.
-  BINARY(28, true), // 28
+  BINARY(41, true), // 41
 
   /// x
   /// A multidimensional array where every sub-array can have different sizes but all have the same
   /// type. Only numeric components allowed. Other arrays will be taken as List. The implementation
   /// should support interoperability between array and list.
-  ARRAY(29, false), // 29
+  ARRAY(42, false), // 42
 
   /// One dimensional bool array.
-  BOOL_ARRAY(30, true), // 30
+  BOOL_ARRAY(43, true), // 43
 
   /// One dimensional int8 array.
-  INT8_ARRAY(31, true), // 31
+  INT8_ARRAY(44, true), // 44
 
   /// One dimensional int16 array.
-  INT16_ARRAY(32, true), // 32
+  INT16_ARRAY(45, true), // 45
 
   /// One dimensional int32 array.
-  INT32_ARRAY(33, true), // 33
+  INT32_ARRAY(46, true), // 46
 
   /// One dimensional int64 array.
-  INT64_ARRAY(34, true), // 34
-
-  /// One dimensional half_float_16 array.
-  FLOAT16_ARRAY(35, true), // 35
+  INT64_ARRAY(47, true), // 47
 
-  /// One dimensional float32 array.
-  FLOAT32_ARRAY(36, true), // 36
+  /// One dimensional uint8 array.
+  UINT8_ARRAY(48, true), // 48
 
-  /// One dimensional float64 array.
-  FLOAT64_ARRAY(37, true), // 37
+  /// One dimensional uint16 array.
+  UINT16_ARRAY(49, true), // 49
 
-  /// An (arrow record batch) object.
-  ARROW_RECORD_BATCH(38, false), // 38
+  /// One dimensional uint32 array.
+  UINT32_ARRAY(50, true), // 50
 
-  /// An (arrow table) object.
-  ARROW_TABLE(39, false), // 39
+  /// One dimensional uint64 array.
+  UINT64_ARRAY(51, true), // 51
 
-  /// Unsigned 8-bit integer
-  UINT8(40, true), // 40
+  /// One dimensional float8 array.
+  FLOAT8_ARRAY(52, true), // 52
 
-  /// Unsigned 16-bit little-endian integer
-  UINT16(41, true), // 41
+  /// One dimensional half_float_16 array.
+  FLOAT16_ARRAY(53, true), // 53
 
-  /// Unsigned 32-bit little-endian integer
-  UINT32(42, true), // 42
+  /// One dimensional bfloat16 array.
+  BFLOAT16_ARRAY(54, true), // 54
 
-  /// var_uint32: a 32-bit unsigned integer which uses fory var_uint32 encoding.
-  VAR_UINT32(43, true), // 43
+  /// One dimensional float32 array.
+  FLOAT32_ARRAY(55, true), // 55
 
-  /// Unsigned 64-bit little-endian integer
-  UINT64(44, true), // 44
+  /// One dimensional float64 array.
+  FLOAT64_ARRAY(56, true), // 56
 
-  /// var_uint64: a 64-bit unsigned integer which uses fory var_uint64 encoding.
-  VAR_UINT64(45, true), // 45
+  /// An (arrow record batch) object.
+  ARROW_RECORD_BATCH(57, false), // 57
 
-  /// tagged_uint64: a 64-bit unsigned integer which uses fory tagged var_uint64 encoding.
-  TAGGED_UINT64(46, true); // 46
+  /// An (arrow table) object.
+  ARROW_TABLE(58, false); // 58
 
   final int id;
   final bool independent;
@@ -202,7 +238,7 @@ enum ObjType {
 
   static ObjType? fromId(int id) {
     // The current implementation is linear, so it's simpler here. If the id and ordinal become irregular in the future, this won't work.
-    if (id >= 1 && id <= 46) return ObjType.values[id];
+    if (id >= 0 && id < ObjType.values.length) return ObjType.values[id];
     return null;
   }
 
diff --git a/dart/packages/fory/lib/src/deserialize_coordinator.dart b/dart/packages/fory/lib/src/deserialize_coordinator.dart
index 4f9f7254f..3805542c5 100644
--- a/dart/packages/fory/lib/src/deserialize_coordinator.dart
+++ b/dart/packages/fory/lib/src/deserialize_coordinator.dart
@@ -20,7 +20,7 @@
 import 'dart:typed_data';
 import 'package:fory/src/collection/stack.dart';
 import 'package:fory/src/config/fory_config.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/const/ref_flag.dart';
 import 'package:fory/src/datatype/float32.dart';
 import 'package:fory/src/datatype/int16.dart';
diff --git a/dart/packages/fory/lib/src/exception/deserialization_exception.dart b/dart/packages/fory/lib/src/exception/deserialization_exception.dart
index 9073a230b..6bfc9704f 100644
--- a/dart/packages/fory/lib/src/exception/deserialization_exception.dart
+++ b/dart/packages/fory/lib/src/exception/deserialization_exception.dart
@@ -19,7 +19,7 @@
 
 import 'package:fory/src/exception/fory_exception.dart';
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 abstract class DeserializationException extends ForyException {
   final String? _where;
diff --git a/dart/packages/fory/lib/src/exception/serialization_exception.dart b/dart/packages/fory/lib/src/exception/serialization_exception.dart
index 91f29e0f6..6bde0e1f6 100644
--- a/dart/packages/fory/lib/src/exception/serialization_exception.dart
+++ b/dart/packages/fory/lib/src/exception/serialization_exception.dart
@@ -19,7 +19,7 @@
 
 import 'package:fory/src/exception/fory_exception.dart';
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 abstract class SerializationException extends ForyException {
   final String? _where;
diff --git a/dart/packages/fory/lib/src/fory_context.dart b/dart/packages/fory/lib/src/fory_context.dart
index 0cc38e438..f17738e4c 100644
--- a/dart/packages/fory/lib/src/fory_context.dart
+++ b/dart/packages/fory/lib/src/fory_context.dart
@@ -25,7 +25,7 @@ import 'package:fory/src/meta/type_info.dart';
 import 'package:fory/src/serializer/serializer.dart';
 import 'package:fory/src/serializer/serializer_pool.dart';
 import 'package:fory/src/const/dart_type.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 class ForyContext {
   // Cannot be static because TypeInfo contains the Ser field
diff --git a/dart/packages/fory/lib/src/meta/spec_wraps/type_spec_wrap.dart b/dart/packages/fory/lib/src/meta/spec_wraps/type_spec_wrap.dart
index cf4d04729..edcf5f437 100644
--- a/dart/packages/fory/lib/src/meta/spec_wraps/type_spec_wrap.dart
+++ b/dart/packages/fory/lib/src/meta/spec_wraps/type_spec_wrap.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/meta/specs/field_spec.dart';
 import 'package:fory/src/meta/specs/type_spec.dart';
 import 'package:fory/src/serializer/serializer.dart';
diff --git a/dart/packages/fory/lib/src/meta/specs/class_spec.dart b/dart/packages/fory/lib/src/meta/specs/class_spec.dart
index a0de34557..03e63ec13 100644
--- a/dart/packages/fory/lib/src/meta/specs/class_spec.dart
+++ b/dart/packages/fory/lib/src/meta/specs/class_spec.dart
@@ -18,7 +18,7 @@
  */
 
 import 'package:collection/collection.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/meta/specs/custom_type_spec.dart';
 import 'package:fory/src/meta/specs/field_spec.dart';
 
diff --git a/dart/packages/fory/lib/src/meta/specs/custom_type_spec.dart b/dart/packages/fory/lib/src/meta/specs/custom_type_spec.dart
index 70f3b1a97..81bfa6364 100644
--- a/dart/packages/fory/lib/src/meta/specs/custom_type_spec.dart
+++ b/dart/packages/fory/lib/src/meta/specs/custom_type_spec.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 abstract class CustomTypeSpec{
   final Type dartType;
diff --git a/dart/packages/fory/lib/src/meta/specs/enum_spec.dart b/dart/packages/fory/lib/src/meta/specs/enum_spec.dart
index adaf0838b..b1933c5b9 100644
--- a/dart/packages/fory/lib/src/meta/specs/enum_spec.dart
+++ b/dart/packages/fory/lib/src/meta/specs/enum_spec.dart
@@ -20,7 +20,7 @@
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:fory/src/meta/specs/custom_type_spec.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 
 // Enums do not need tags because they are not allowed to be transmitted directly; they should always be within a class.
 // Enums do not support inheritance, which makes serialization much easier as there will be no cases where the specific class is unknown.
diff --git a/dart/packages/fory/lib/src/meta/specs/type_spec.dart b/dart/packages/fory/lib/src/meta/specs/type_spec.dart
index 78f19b6b6..097d26640 100644
--- a/dart/packages/fory/lib/src/meta/specs/type_spec.dart
+++ b/dart/packages/fory/lib/src/meta/specs/type_spec.dart
@@ -18,7 +18,7 @@
  */
 
 import 'package:collection/collection.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/meta/specs/enum_spec.dart';
 
 class TypeSpec{
diff --git a/dart/packages/fory/lib/src/meta/type_info.dart b/dart/packages/fory/lib/src/meta/type_info.dart
index 7286626a0..b833bc295 100644
--- a/dart/packages/fory/lib/src/meta/type_info.dart
+++ b/dart/packages/fory/lib/src/meta/type_info.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/meta/meta_string_byte.dart';
 import 'package:fory/src/serializer/serializer.dart';
 
diff --git a/dart/packages/fory/lib/src/resolver/impl/xtype_resolver_impl.dart b/dart/packages/fory/lib/src/resolver/impl/xtype_resolver_impl.dart
index d231e2d11..a8eac82fc 100644
--- a/dart/packages/fory/lib/src/resolver/impl/xtype_resolver_impl.dart
+++ b/dart/packages/fory/lib/src/resolver/impl/xtype_resolver_impl.dart
@@ -20,7 +20,7 @@
 import 'dart:collection';
 import 'package:fory/src/codegen/entity/struct_hash_pair.dart';
 import 'package:fory/src/collection/long_long_key.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/dev_annotation/optimize.dart';
 import 'package:fory/src/exception/registration_exception.dart' show UnregisteredTagException, UnregisteredTypeException;
 import 'package:fory/src/fory_context.dart';
@@ -203,7 +203,7 @@ final class XtypeResolverImpl extends XtypeResolver {
     String qualifiedName = StringUtil.addingTypeNameAndNs(ns, tn);
     TypeInfo? typeInfo = _ctx.tag2TypeInfo[qualifiedName];
     if (typeInfo == null) {
-      // TODO: Does not support non-existent class, foryJava seems to have some support
+      // TODO: Does not support non-existent or unknown class, foryJava seems to have some support
       throw UnregisteredTagException(qualifiedName);
     }
     _tagHash2Info[key] = typeInfo;
diff --git a/dart/packages/fory/lib/src/resolver/struct_hash_resolver.dart b/dart/packages/fory/lib/src/resolver/struct_hash_resolver.dart
index bd6a94d67..6fda45b51 100644
--- a/dart/packages/fory/lib/src/resolver/struct_hash_resolver.dart
+++ b/dart/packages/fory/lib/src/resolver/struct_hash_resolver.dart
@@ -19,7 +19,7 @@
 
 import 'dart:collection';
 import 'package:fory/src/codegen/entity/struct_hash_pair.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/meta/specs/field_spec.dart';
 import 'package:fory/src/util/string_util.dart';
 
diff --git a/dart/packages/fory/lib/src/serialize_coordinator.dart b/dart/packages/fory/lib/src/serialize_coordinator.dart
index 7b109d38f..655cf8731 100644
--- a/dart/packages/fory/lib/src/serialize_coordinator.dart
+++ b/dart/packages/fory/lib/src/serialize_coordinator.dart
@@ -20,7 +20,7 @@
 import 'dart:typed_data';
 import 'package:fory/src/collection/stack.dart';
 import 'package:fory/src/config/fory_config.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/const/ref_flag.dart';
 import 'package:fory/src/memory/byte_writer.dart';
 import 'package:fory/src/meta/type_info.dart';
diff --git a/dart/packages/fory/lib/src/serializer/boollist_serializer.dart b/dart/packages/fory/lib/src/serializer/boollist_serializer.dart
index 8a943fa37..d2948043c 100644
--- a/dart/packages/fory/lib/src/serializer/boollist_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/boollist_serializer.dart
@@ -19,7 +19,7 @@
 
 import 'dart:typed_data';
 import 'package:collection/collection.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/serializer/array_serializer.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/memory/byte_reader.dart';
diff --git a/dart/packages/fory/lib/src/serializer/class_serializer.dart b/dart/packages/fory/lib/src/serializer/class_serializer.dart
index a32e6c5bc..0e7808e2e 100644
--- a/dart/packages/fory/lib/src/serializer/class_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/class_serializer.dart
@@ -19,7 +19,7 @@
 
 import 'package:fory/src/codegen/entity/struct_hash_pair.dart';
 import 'package:fory/src/config/fory_config.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/exception/deserialization_exception.dart';
 import 'package:fory/src/memory/byte_reader.dart';
diff --git a/dart/packages/fory/lib/src/serializer/collection/list/list_serializer.dart b/dart/packages/fory/lib/src/serializer/collection/list/list_serializer.dart
index 1337a393b..71d0eefa8 100644
--- a/dart/packages/fory/lib/src/serializer/collection/list/list_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/collection/list/list_serializer.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/memory/byte_reader.dart';
 import 'package:fory/src/meta/spec_wraps/type_spec_wrap.dart';
diff --git a/dart/packages/fory/lib/src/serializer/collection/map/map_serializer.dart b/dart/packages/fory/lib/src/serializer/collection/map/map_serializer.dart
index a298dca3e..af3a3ec04 100644
--- a/dart/packages/fory/lib/src/serializer/collection/map/map_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/collection/map/map_serializer.dart
@@ -21,7 +21,7 @@ import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/dev_annotation/optimize.dart';
 import 'package:fory/src/meta/spec_wraps/type_spec_wrap.dart';
 import 'package:fory/src/collection/stack.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/memory/byte_reader.dart';
 import 'package:fory/src/memory/byte_writer.dart';
 import 'package:fory/src/serializer_pack.dart';
diff --git a/dart/packages/fory/lib/src/serializer/collection/set/set_serializer.dart b/dart/packages/fory/lib/src/serializer/collection/set/set_serializer.dart
index 6d94f19d9..06428ed73 100644
--- a/dart/packages/fory/lib/src/serializer/collection/set/set_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/collection/set/set_serializer.dart
@@ -25,7 +25,7 @@
 /// we still need to implement this separately, which may introduce duplicate code.
 library;
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/memory/byte_reader.dart';
 import 'package:fory/src/meta/spec_wraps/type_spec_wrap.dart';
diff --git a/dart/packages/fory/lib/src/serializer/enum_serializer.dart b/dart/packages/fory/lib/src/serializer/enum_serializer.dart
index d99424c3a..c59dbb4c0 100644
--- a/dart/packages/fory/lib/src/serializer/enum_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/enum_serializer.dart
@@ -18,7 +18,7 @@
  */
 
 import 'package:fory/src/config/fory_config.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/exception/deserialization_exception.dart';
 import 'package:fory/src/memory/byte_reader.dart';
@@ -57,7 +57,7 @@ final class EnumSerializer extends CustomSerializer<Enum>{
   @override
   Enum read(ByteReader br, int refId, DeserializerPack pack) {
     int index = br.readVarUint32Small7();
-    // foryJava supports deserializeNonexistentEnumValueAsNull,
+    // foryJava supports deserializeUnknownEnumValueAsNull,
     // but here in Dart, it will definitely throw an error if the index is out of range
     if (index < 0 || index >= values.length) {
       throw DeserializationRangeException(index, values);
diff --git a/dart/packages/fory/lib/src/serializer/primitive_type_serializer.dart b/dart/packages/fory/lib/src/serializer/primitive_type_serializer.dart
index 40a13871d..c8ac17ac2 100644
--- a/dart/packages/fory/lib/src/serializer/primitive_type_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/primitive_type_serializer.dart
@@ -18,7 +18,7 @@
  */
 
 import 'package:fory/src/config/fory_config.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/datatype/float32.dart';
 import 'package:fory/src/datatype/fory_fixed_num.dart';
 import 'package:fory/src/datatype/int16.dart';
diff --git a/dart/packages/fory/lib/src/serializer/serializer.dart b/dart/packages/fory/lib/src/serializer/serializer.dart
index 9a62fe4b2..5877b6dd9 100644
--- a/dart/packages/fory/lib/src/serializer/serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/serializer.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/memory/byte_reader.dart';
 import 'package:fory/src/memory/byte_writer.dart';
diff --git a/dart/packages/fory/lib/src/serializer/serializer_pool.dart b/dart/packages/fory/lib/src/serializer/serializer_pool.dart
index ca6fbbb2c..92c993e99 100644
--- a/dart/packages/fory/lib/src/serializer/serializer_pool.dart
+++ b/dart/packages/fory/lib/src/serializer/serializer_pool.dart
@@ -22,7 +22,7 @@ import 'dart:typed_data';
 import 'package:collection/collection.dart';
 import 'package:fory/src/config/fory_config.dart';
 import 'package:fory/src/const/dart_type.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/datatype/float32.dart';
 import 'package:fory/src/datatype/int16.dart';
 import 'package:fory/src/datatype/int32.dart';
diff --git a/dart/packages/fory/lib/src/serializer/string_serializer.dart b/dart/packages/fory/lib/src/serializer/string_serializer.dart
index d85ecf67b..7e508f0ba 100644
--- a/dart/packages/fory/lib/src/serializer/string_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/string_serializer.dart
@@ -19,7 +19,7 @@
 
 import 'dart:typed_data';
 import 'package:fory/src/config/fory_config.dart';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/exception/deserialization_exception.dart';
 import 'package:fory/src/memory/byte_reader.dart';
diff --git a/dart/packages/fory/lib/src/serializer/time/date_serializer.dart b/dart/packages/fory/lib/src/serializer/time/date_serializer.dart
index ea1a48bc6..fbb5f82ac 100644
--- a/dart/packages/fory/lib/src/serializer/time/date_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/time/date_serializer.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/datatype/local_date.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/memory/byte_reader.dart';
diff --git a/dart/packages/fory/lib/src/serializer/time/timestamp_serializer.dart b/dart/packages/fory/lib/src/serializer/time/timestamp_serializer.dart
index c80b90161..a81cd140b 100644
--- a/dart/packages/fory/lib/src/serializer/time/timestamp_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/time/timestamp_serializer.dart
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/datatype/timestamp.dart';
 import 'package:fory/src/deserializer_pack.dart';
 import 'package:fory/src/memory/byte_reader.dart';
diff --git a/dart/packages/fory/lib/src/serializer/typed_data_array_serializer.dart b/dart/packages/fory/lib/src/serializer/typed_data_array_serializer.dart
index cefa513c7..ac7e9de1f 100644
--- a/dart/packages/fory/lib/src/serializer/typed_data_array_serializer.dart
+++ b/dart/packages/fory/lib/src/serializer/typed_data_array_serializer.dart
@@ -18,7 +18,7 @@
  */
 
 import 'dart:typed_data';
-import 'package:fory/src/const/obj_type.dart';
+import 'package:fory/src/const/types.dart';
 import 'package:fory/src/dev_annotation/optimize.dart';
 import 'package:fory/src/memory/byte_reader.dart';
 import 'package:fory/src/memory/byte_writer.dart';
diff --git a/docs/guide/go/troubleshooting.md b/docs/guide/go/troubleshooting.md
index fe3528c3b..529bba8df 100644
--- a/docs/guide/go/troubleshooting.md
+++ b/docs/guide/go/troubleshooting.md
@@ -189,7 +189,7 @@ f.Deserialize(fullData, &target)
 
 **Error**: `invalid reference ID`
 
-**Cause**: Reference to non-existent object in serialized data.
+**Cause**: Reference to non-existent or unknown object in serialized data.
 
 **Solutions**:
 
diff --git a/docs/guide/java/configuration.md b/docs/guide/java/configuration.md
index b600bb1b7..b0b2a9363 100644
--- a/docs/guide/java/configuration.md
+++ b/docs/guide/java/configuration.md
@@ -42,7 +42,7 @@ This page documents all configuration options available through `ForyBuilder`.
 | `metaShareEnabled`                  | Enables or disables meta share mode.                                                                                                                                                                                                                                                                                                                                                                                                                                 [...]
 | `scopedMetaShareEnabled`            | Scoped meta share focuses on a single serialization process. Metadata created or identified during this process is exclusive to it and is not shared with by other serializations.                                                                                                                                                                                                                                                                                   [...]
 | `metaCompressor`                    | Set a compressor for meta compression. Note that the passed MetaCompressor should be thread-safe. By default, a `Deflater` based compressor `DeflaterMetaCompressor` will be used. Users can pass other compressor such as `zstd` for better compression rate.                                                                                                                                                                                                       [...]
-| `deserializeNonexistentClass`       | Enables or disables deserialization/skipping of data for non-existent classes.                                                                                                                                                                                                                                                                                                                                                                                       [...]
+| `deserializeUnknownClass`           | Enables or disables deserialization/skipping of data for non-existent or unknown classes.                                                                                                                                                                                                                                                                                                                                                                            [...]
 | `codeGenEnabled`                    | Disabling may result in faster initial serialization but slower subsequent serializations.                                                                                                                                                                                                                                                                                                                                                                           [...]
 | `asyncCompilationEnabled`           | If enabled, serialization uses interpreter mode first and switches to JIT serialization after async serializer JIT for a class is finished.                                                                                                                                                                                                                                                                                                                          [...]
 | `scalaOptimizationEnabled`          | Enables or disables Scala-specific serialization optimization.                                                                                                                                                                                                                                                                                                                                                                                                       [...]
diff --git a/docs/guide/java/schema-evolution.md b/docs/guide/java/schema-evolution.md
index c1f8d5e56..c2be9b169 100644
--- a/docs/guide/java/schema-evolution.md
+++ b/docs/guide/java/schema-evolution.md
@@ -19,7 +19,7 @@ license: |
   limitations under the License.
 ---
 
-This page covers schema evolution, meta sharing, and handling non-existent classes.
+This page covers schema evolution, meta sharing, and handling non-existent/unknown classes.
 
 ## Handling Class Schema Evolution
 
@@ -98,15 +98,15 @@ Object newObj = fory.execute(
 
 For more details, please refer to the [Meta Sharing specification](https://fory.apache.org/docs/specification/fory_java_serialization_spec#meta-share).
 
-## Deserialize Non-existent Classes
+## Deserialize Unknown Classes
 
-Fory supports deserializing non-existent classes. This feature can be enabled by `ForyBuilder#deserializeNonexistentClass(true)`.
+Fory supports deserializing non-existent or unknown classes. This feature can be enabled by `ForyBuilder#deserializeUnknownClass(true)`.
 
 When enabled and metadata sharing is enabled, Fory will store the deserialized data of this type in a lazy subclass of Map. By using the lazy map implemented by Fory, the rebalance cost of filling map during deserialization can be avoided, which further improves performance.
 
 If this data is sent to another process and the class exists in this process, the data will be deserialized into the object of this type without losing any information.
 
-If metadata sharing is not enabled, the new class data will be skipped and a `NonexistentSkipClass` stub object will be returned.
+If metadata sharing is not enabled, the new class data will be skipped and a `UnknownSkipClass` stub object will be returned.
 
 ## Copy/Map Object from One Type to Another
 
@@ -192,14 +192,14 @@ public class DeserializeIntoType {
 
 ## Configuration Options
 
-| Option                        | Description                         | Default                   |
-| ----------------------------- | ----------------------------------- | ------------------------- |
-| `compatibleMode`              | `SCHEMA_CONSISTENT` or `COMPATIBLE` | `SCHEMA_CONSISTENT`       |
-| `checkClassVersion`           | Check class schema consistency      | `false`                   |
-| `metaShareEnabled`            | Enable meta sharing                 | `true` if Compatible mode |
-| `scopedMetaShareEnabled`      | Scoped meta share per serialization | `true` if Compatible mode |
-| `deserializeNonexistentClass` | Handle non-existent classes         | `true` if Compatible mode |
-| `metaCompressor`              | Compressor for meta compression     | `DeflaterMetaCompressor`  |
+| Option                    | Description                            | Default                   |
+| ------------------------- | -------------------------------------- | ------------------------- |
+| `compatibleMode`          | `SCHEMA_CONSISTENT` or `COMPATIBLE`    | `SCHEMA_CONSISTENT`       |
+| `checkClassVersion`       | Check class schema consistency         | `false`                   |
+| `metaShareEnabled`        | Enable meta sharing                    | `true` if Compatible mode |
+| `scopedMetaShareEnabled`  | Scoped meta share per serialization    | `true` if Compatible mode |
+| `deserializeUnknownClass` | Handle non-existent or unknown classes | `true` if Compatible mode |
+| `metaCompressor`          | Compressor for meta compression        | `DeflaterMetaCompressor`  |
 
 ## Best Practices
 
diff --git a/docs/specification/java_serialization_spec.md b/docs/specification/java_serialization_spec.md
index 5e72d4226..a6957370b 100644
--- a/docs/specification/java_serialization_spec.md
+++ b/docs/specification/java_serialization_spec.md
@@ -83,84 +83,55 @@ full_type_id = (user_type_id << 8) | internal_type_id
 - Named types use `NAMED_*` internal IDs and carry names in metadata rather than embedding a user
   ID.
 
-### Shared internal type IDs (0-32)
-
-Java native mode shares the xlang internal IDs for basic types and user-defined enum/struct/ext
-tags. These IDs are stable across languages.
-
-| Type ID | Name                    |
-| ------- | ----------------------- |
-| 0       | UNKNOWN                 |
-| 1       | BOOL                    |
-| 2       | INT8                    |
-| 3       | INT16                   |
-| 4       | INT32                   |
-| 5       | VARINT32                |
-| 6       | INT64                   |
-| 7       | VARINT64                |
-| 8       | TAGGED_INT64            |
-| 9       | UINT8                   |
-| 10      | UINT16                  |
-| 11      | UINT32                  |
-| 12      | VAR_UINT32              |
-| 13      | UINT64                  |
-| 14      | VAR_UINT64              |
-| 15      | TAGGED_UINT64           |
-| 16      | FLOAT16                 |
-| 17      | FLOAT32                 |
-| 18      | FLOAT64                 |
-| 19      | STRING                  |
-| 20      | LIST                    |
-| 21      | SET                     |
-| 22      | MAP                     |
-| 23      | ENUM                    |
-| 24      | NAMED_ENUM              |
-| 25      | STRUCT                  |
-| 26      | COMPATIBLE_STRUCT       |
-| 27      | NAMED_STRUCT            |
-| 28      | NAMED_COMPATIBLE_STRUCT |
-| 29      | EXT                     |
-| 30      | NAMED_EXT               |
-| 31      | UNION                   |
-| 32      | NONE                    |
+### Shared internal type IDs (0-63)
+
+Java native mode shares the xlang internal IDs for all values below 64. IDs `0~56` are defined by
+the xlang spec, while `57~63` are reserved for future internal use. These IDs are stable across
+languages.
+
+See the internal type ID table in
+[Xlang Serialization Format](xlang_serialization_spec.md#internal-type-id-table).
+Java shares all IDs `< 64`, with `57~63` reserved for future internal use.
 
 ### Java native built-in type IDs
 
-Java native serialization assigns Java-specific built-ins starting at `Types.NONE + 1`.
-Type IDs greater than 32 are not shared with xlang; they are only valid in Java native mode.
+Java native serialization assigns Java-specific built-ins starting at
+`Types.BOUND + 5` (`Types.BOUND` is 64; 5 IDs are reserved for future use).
+Type IDs in `0~56` are shared with xlang; `57~63` are reserved; `64+` are only
+valid in Java native mode.
 
 | Type ID | Name                       | Description                    |
 | ------- | -------------------------- | ------------------------------ |
-| 33      | VOID_ID                    | java.lang.Void                 |
-| 34      | CHAR_ID                    | java.lang.Character            |
-| 35      | PRIMITIVE_VOID_ID          | void                           |
-| 36      | PRIMITIVE_BOOL_ID          | boolean                        |
-| 37      | PRIMITIVE_INT8_ID          | byte                           |
-| 38      | PRIMITIVE_CHAR_ID          | char                           |
-| 39      | PRIMITIVE_INT16_ID         | short                          |
-| 40      | PRIMITIVE_INT32_ID         | int                            |
-| 41      | PRIMITIVE_FLOAT32_ID       | float                          |
-| 42      | PRIMITIVE_INT64_ID         | long                           |
-| 43      | PRIMITIVE_FLOAT64_ID       | double                         |
-| 44      | PRIMITIVE_BOOLEAN_ARRAY_ID | boolean[]                      |
-| 45      | PRIMITIVE_BYTE_ARRAY_ID    | byte[]                         |
-| 46      | PRIMITIVE_CHAR_ARRAY_ID    | char[]                         |
-| 47      | PRIMITIVE_SHORT_ARRAY_ID   | short[]                        |
-| 48      | PRIMITIVE_INT_ARRAY_ID     | int[]                          |
-| 49      | PRIMITIVE_FLOAT_ARRAY_ID   | float[]                        |
-| 50      | PRIMITIVE_LONG_ARRAY_ID    | long[]                         |
-| 51      | PRIMITIVE_DOUBLE_ARRAY_ID  | double[]                       |
-| 52      | STRING_ARRAY_ID            | String[]                       |
-| 53      | OBJECT_ARRAY_ID            | Object[]                       |
-| 54      | ARRAYLIST_ID               | java.util.ArrayList            |
-| 55      | HASHMAP_ID                 | java.util.HashMap              |
-| 56      | HASHSET_ID                 | java.util.HashSet              |
-| 57      | CLASS_ID                   | java.lang.Class                |
-| 58      | EMPTY_OBJECT_ID            | empty object stub              |
-| 59      | LAMBDA_STUB_ID             | lambda stub                    |
-| 60      | JDK_PROXY_STUB_ID          | JDK proxy stub                 |
-| 61      | REPLACE_STUB_ID            | writeReplace/readResolve stub  |
-| 62      | NONEXISTENT_META_SHARED_ID | meta-shared unknown class stub |
+| 69      | VOID_ID                    | java.lang.Void                 |
+| 70      | CHAR_ID                    | java.lang.Character            |
+| 71      | PRIMITIVE_VOID_ID          | void                           |
+| 72      | PRIMITIVE_BOOL_ID          | boolean                        |
+| 73      | PRIMITIVE_INT8_ID          | byte                           |
+| 74      | PRIMITIVE_CHAR_ID          | char                           |
+| 75      | PRIMITIVE_INT16_ID         | short                          |
+| 76      | PRIMITIVE_INT32_ID         | int                            |
+| 77      | PRIMITIVE_FLOAT32_ID       | float                          |
+| 78      | PRIMITIVE_INT64_ID         | long                           |
+| 79      | PRIMITIVE_FLOAT64_ID       | double                         |
+| 80      | PRIMITIVE_BOOLEAN_ARRAY_ID | boolean[]                      |
+| 81      | PRIMITIVE_BYTE_ARRAY_ID    | byte[]                         |
+| 82      | PRIMITIVE_CHAR_ARRAY_ID    | char[]                         |
+| 83      | PRIMITIVE_SHORT_ARRAY_ID   | short[]                        |
+| 84      | PRIMITIVE_INT_ARRAY_ID     | int[]                          |
+| 85      | PRIMITIVE_FLOAT_ARRAY_ID   | float[]                        |
+| 86      | PRIMITIVE_LONG_ARRAY_ID    | long[]                         |
+| 87      | PRIMITIVE_DOUBLE_ARRAY_ID  | double[]                       |
+| 88      | STRING_ARRAY_ID            | String[]                       |
+| 89      | OBJECT_ARRAY_ID            | Object[]                       |
+| 90      | ARRAYLIST_ID               | java.util.ArrayList            |
+| 91      | HASHMAP_ID                 | java.util.HashMap              |
+| 92      | HASHSET_ID                 | java.util.HashSet              |
+| 93      | CLASS_ID                   | java.lang.Class                |
+| 94      | EMPTY_OBJECT_ID            | empty object stub              |
+| 95      | LAMBDA_STUB_ID             | lambda stub                    |
+| 96      | JDK_PROXY_STUB_ID          | JDK proxy stub                 |
+| 97      | REPLACE_STUB_ID            | writeReplace/readResolve stub  |
+| 98      | NONEXISTENT_META_SHARED_ID | meta-shared unknown class stub |
 
 ### Registration and named types
 
diff --git a/docs/specification/xlang_serialization_spec.md b/docs/specification/xlang_serialization_spec.md
index 670bfe111..b611d8fd8 100644
--- a/docs/specification/xlang_serialization_spec.md
+++ b/docs/specification/xlang_serialization_spec.md
@@ -51,7 +51,9 @@ This specification defines the Fory xlang binary format. The format is dynamic r
 - uint64: a 64-bit unsigned integer.
 - var_uint64: a 64-bit unsigned integer which use fory PVL encoding.
 - tagged_uint64: a 64-bit unsigned integer which use fory Hybrid encoding.
+- float8: an 8-bit floating point number.
 - float16: a 16-bit floating point number.
+- bfloat16: a 16-bit brain floating point number.
 - float32: a 32-bit floating point number.
 - float64: a 64-bit floating point number including NaN and Infinity.
 - string: a text string encoded using Latin1/UTF16/UTF-8 encoding.
@@ -81,11 +83,13 @@ This specification defines the Fory xlang binary format. The format is dynamic r
   - int16_array: one dimensional int16 array.
   - int32_array: one dimensional int32 array.
   - int64_array: one dimensional int64 array.
+  - float8_array: one dimensional float8 array.
   - float16_array: one dimensional half_float_16 array.
+  - bfloat16_array: one dimensional bfloat16 array.
   - float32_array: one dimensional float32 array.
   - float64_array: one dimensional float64 array.
 - union: a tagged union type that can hold one of several alternative types. The active alternative is identified by an index.
-- typed_union: a union value with embedded numeric union type ID.
+- typed_union: a union value with registered numeric union type ID.
 - named_union: a union value with embedded union type name or shared TypeDef.
 - none: represents an empty/unit value with no data (e.g., for empty union alternatives).
 
@@ -150,10 +154,9 @@ Such information can be provided in other languages too:
 
 ### Type ID
 
-All internal data types use an 8-bit internal ID (`0~255`, with `0~50` defined here). Users can
-register types by numeric ID (`0~4095` in current implementations). User IDs are encoded together
-with the internal type ID:
-`(user_type_id << 8) | internal_type_id`.
+All internal data types use an 8-bit internal ID (`0~255`, with `0~56` defined here). Users can
+register types by numeric ID (`0~0xFFFFFFFE` in current implementations). User IDs are encoded
+separately from the internal type ID; there is no bit shifting/packing.
 
 Named types (`NAMED_*`) do not embed a user ID; their names are carried in metadata instead.
 
@@ -177,66 +180,68 @@ Named types (`NAMED_*`) do not embed a user ID; their names are carried in metad
 | 13      | UINT64                  | 64-bit unsigned integer                             |
 | 14      | VAR_UINT64              | Variable-length encoded 64-bit unsigned integer     |
 | 15      | TAGGED_UINT64           | Hybrid encoded 64-bit unsigned integer              |
-| 16      | FLOAT16                 | 16-bit floating point (half precision)              |
-| 17      | FLOAT32                 | 32-bit floating point (single precision)            |
-| 18      | FLOAT64                 | 64-bit floating point (double precision)            |
-| 19      | STRING                  | UTF-8/UTF-16/Latin1 encoded string                  |
-| 20      | LIST                    | Ordered collection (List, Array, Vector)            |
-| 21      | SET                     | Unordered collection of unique elements             |
-| 22      | MAP                     | Key-value mapping                                   |
-| 23      | ENUM                    | Enum registered by numeric ID                       |
-| 24      | NAMED_ENUM              | Enum registered by namespace + type name            |
-| 25      | STRUCT                  | Struct registered by numeric ID (schema consistent) |
-| 26      | COMPATIBLE_STRUCT       | Struct with schema evolution support (by ID)        |
-| 27      | NAMED_STRUCT            | Struct registered by namespace + type name          |
-| 28      | NAMED_COMPATIBLE_STRUCT | Struct with schema evolution (by name)              |
-| 29      | EXT                     | Extension type registered by numeric ID             |
-| 30      | NAMED_EXT               | Extension type registered by namespace + type name  |
-| 31      | UNION                   | Union value, schema identity not embedded           |
-| 32      | TYPED_UNION             | Union with embedded numeric union type ID           |
-| 33      | NAMED_UNION             | Union with embedded union type name/TypeDef         |
-| 34      | NONE                    | Empty/unit type (no data)                           |
-| 35      | DURATION                | Time duration (seconds + nanoseconds)               |
-| 36      | TIMESTAMP               | Point in time (seconds + nanoseconds since epoch)   |
-| 37      | DATE                    | Date without timezone (days since epoch)            |
-| 38      | DECIMAL                 | Arbitrary precision decimal                         |
-| 39      | BINARY                  | Raw binary data                                     |
-| 40      | ARRAY                   | Generic array type                                  |
-| 41      | BOOL_ARRAY              | 1D boolean array                                    |
-| 42      | INT8_ARRAY              | 1D int8 array                                       |
-| 43      | INT16_ARRAY             | 1D int16 array                                      |
-| 44      | INT32_ARRAY             | 1D int32 array                                      |
-| 45      | INT64_ARRAY             | 1D int64 array                                      |
-| 46      | UINT8_ARRAY             | 1D uint8 array                                      |
-| 47      | UINT16_ARRAY            | 1D uint16 array                                     |
-| 48      | UINT32_ARRAY            | 1D uint32 array                                     |
-| 49      | UINT64_ARRAY            | 1D uint64 array                                     |
-| 50      | FLOAT16_ARRAY           | 1D float16 array                                    |
-| 51      | FLOAT32_ARRAY           | 1D float32 array                                    |
-| 52      | FLOAT64_ARRAY           | 1D float64 array                                    |
+| 16      | FLOAT8                  | 8-bit floating point (float8)                       |
+| 17      | FLOAT16                 | 16-bit floating point (half precision)              |
+| 18      | BFLOAT16                | 16-bit brain floating point                         |
+| 19      | FLOAT32                 | 32-bit floating point (single precision)            |
+| 20      | FLOAT64                 | 64-bit floating point (double precision)            |
+| 21      | STRING                  | UTF-8/UTF-16/Latin1 encoded string                  |
+| 22      | LIST                    | Ordered collection (List, Array, Vector)            |
+| 23      | SET                     | Unordered collection of unique elements             |
+| 24      | MAP                     | Key-value mapping                                   |
+| 25      | ENUM                    | Enum registered by numeric ID                       |
+| 26      | NAMED_ENUM              | Enum registered by namespace + type name            |
+| 27      | STRUCT                  | Struct registered by numeric ID (schema consistent) |
+| 28      | COMPATIBLE_STRUCT       | Struct with schema evolution support (by ID)        |
+| 29      | NAMED_STRUCT            | Struct registered by namespace + type name          |
+| 30      | NAMED_COMPATIBLE_STRUCT | Struct with schema evolution (by name)              |
+| 31      | EXT                     | Extension type registered by numeric ID             |
+| 32      | NAMED_EXT               | Extension type registered by namespace + type name  |
+| 33      | UNION                   | Union value, schema identity not embedded           |
+| 34      | TYPED_UNION             | Union value with registered numeric type ID         |
+| 35      | NAMED_UNION             | Union value with embedded type name/TypeDef         |
+| 36      | NONE                    | Empty/unit type (no data)                           |
+| 37      | DURATION                | Time duration (seconds + nanoseconds)               |
+| 38      | TIMESTAMP               | Point in time (seconds + nanoseconds since epoch)   |
+| 39      | DATE                    | Date without timezone (days since epoch)            |
+| 40      | DECIMAL                 | Arbitrary precision decimal                         |
+| 41      | BINARY                  | Raw binary data                                     |
+| 42      | ARRAY                   | Generic array type                                  |
+| 43      | BOOL_ARRAY              | 1D boolean array                                    |
+| 44      | INT8_ARRAY              | 1D int8 array                                       |
+| 45      | INT16_ARRAY             | 1D int16 array                                      |
+| 46      | INT32_ARRAY             | 1D int32 array                                      |
+| 47      | INT64_ARRAY             | 1D int64 array                                      |
+| 48      | UINT8_ARRAY             | 1D uint8 array                                      |
+| 49      | UINT16_ARRAY            | 1D uint16 array                                     |
+| 50      | UINT32_ARRAY            | 1D uint32 array                                     |
+| 51      | UINT64_ARRAY            | 1D uint64 array                                     |
+| 52      | FLOAT8_ARRAY            | 1D float8 array                                     |
+| 53      | FLOAT16_ARRAY           | 1D float16 array                                    |
+| 54      | BFLOAT16_ARRAY          | 1D bfloat16 array                                   |
+| 55      | FLOAT32_ARRAY           | 1D float32 array                                    |
+| 56      | FLOAT64_ARRAY           | 1D float64 array                                    |
 
 #### Type ID Encoding for User Types
 
-When registering user types (struct/ext/enum/union), the full type ID combines user ID and internal type ID:
-
-```
-Full Type ID = (user_type_id << 8) | internal_type_id
-```
+When registering user types (struct/ext/enum/union), the internal type ID is written as the 8-bit
+kind. The user type ID is written separately as an unsigned varint32 (small7); there is no bit
+shift or packing.
 
 **Examples:**
 
-| User ID | Type              | Internal ID | Full Type ID     | Decimal |
-| ------- | ----------------- | ----------- | ---------------- | ------- |
-| 0       | STRUCT            | 25          | `(0 << 8) \| 25` | 25      |
-| 0       | ENUM              | 23          | `(0 << 8) \| 23` | 23      |
-| 1       | STRUCT            | 25          | `(1 << 8) \| 25` | 281     |
-| 1       | COMPATIBLE_STRUCT | 26          | `(1 << 8) \| 26` | 282     |
-| 2       | NAMED_STRUCT      | 27          | `(2 << 8) \| 27` | 539     |
+| User ID | Type              | Internal ID | Encoded User ID | Decimal |
+| ------- | ----------------- | ----------- | --------------- | ------- |
+| 0       | STRUCT            | 27          | 0               | 0       |
+| 0       | ENUM              | 25          | 0               | 0       |
+| 1       | STRUCT            | 27          | 1               | 1       |
+| 1       | COMPATIBLE_STRUCT | 28          | 1               | 1       |
+| 2       | NAMED_STRUCT      | 29          | 2               | 2       |
 
 When reading type IDs:
 
-- Extract internal type: `internal_type_id = full_type_id & 0xFF`
-- Extract user type ID: `user_type_id = full_type_id >> 8`
+- Read internal type ID from the type ID field.
+- If the internal type is a user-registered kind, read `user_type_id` as varuint32.
 
 ### Type mapping
 
@@ -401,9 +406,9 @@ followed by optional type-specific metadata.
 
 - The type ID is written as an unsigned varint32 (small7).
 - Internal types use their internal type ID directly (low 8 bits).
-- User-registered types use a full type ID: `(user_type_id << 8) | internal_type_id`.
-  - `user_type_id` is a numeric ID (0-4095 in current implementations).
-  - `internal_type_id` is one of `ENUM`, `STRUCT`, `COMPATIBLE_STRUCT`, `EXT`, or `UNION`.
+- User-registered types write the internal type ID, then write `user_type_id` as varuint32.
+  - `user_type_id` is a numeric ID (0~0xFFFFFFFE in current implementations).
+  - `internal_type_id` is one of `ENUM`, `STRUCT`, `COMPATIBLE_STRUCT`, `EXT`, or `TYPED_UNION`.
 - Named types do not embed a user ID. They use `NAMED_*` internal type IDs and carry a namespace
   and type name (or shared TypeDef) instead.
 
@@ -411,7 +416,7 @@ followed by optional type-specific metadata.
 
 After the type ID:
 
-- **ENUM / STRUCT / EXT / TYPED_UNION**: no extra bytes (registration by ID required on both sides).
+- **ENUM / STRUCT / EXT / TYPED_UNION**: no extra bytes beyond the `user_type_id` (registration by ID required on both sides).
 - **COMPATIBLE_STRUCT**:
   - If meta share is enabled, write a shared TypeDef entry (see below).
   - If meta share is disabled, no extra bytes.
@@ -912,6 +917,24 @@ else:
 
 Note: TAGGED_INT64 uses 30 bits + sign for values [-2^30, 2^30-1], while TAGGED_UINT64 uses full 31 bits for unsigned values [0, 2^31-1].
 
+#### float8
+
+- size: 1 byte
+- format:
+  - float8 has 4 kinds: float8 kind enum: float8_e4m3fn, float8_e4m3fnuz, float8_e5m2, float8_e5m2fnuz
+  - when serialize as field, write raw 8 bits as one byte directly
+  - when serialize as an object: write type kind as a byte, then write value byte
+
+#### float16
+
+- size: 2 bytes
+- format: encode the specified floating-point value according to the IEEE 754 standard binary16 format, preserving NaN values, then write as binary by little endian order.
+
+#### bfloat16
+
+- size: 2 bytes
+- format: encode the specified floating-point value according to the IEEE 754 standard bfloat16 format, preserving NaN values, then write as binary by little endian order.
+
 #### float32
 
 - size: 4 byte
@@ -1112,6 +1135,11 @@ then copy the whole buffer into the stream.
 Such serialization won't compress the array. If users want to compress primitive array, users need to register custom
 serializers for such types or mark it as list type.
 
+Float array specifics:
+
+- float16/bfloat16 array: write `varuint` length, then raw bytes in little endian order.
+- float8 array: write element type kind as a byte, then `varuint` length, then raw bytes in little endian order.
+
 #### Multi-dimensional arrays
 
 Xlang does not define a dedicated tensor encoding. Multi-dimensional arrays are serialized as
@@ -1342,15 +1370,15 @@ Rules:
 
 | Type ID | Name        | Meaning                                              |
 | ------: | ----------- | ---------------------------------------------------- |
-|      31 | UNION       | Union value, schema identity not embedded            |
-|      32 | TYPED_UNION | Union value with embedded registered numeric type ID |
-|      33 | NAMED_UNION | Union value with embedded type name / shared TypeDef |
+|      33 | UNION       | Union value, schema identity not embedded            |
+|      34 | TYPED_UNION | Union value with registered numeric type ID          |
+|      35 | NAMED_UNION | Union value with embedded type name / shared TypeDef |
 
 Type meta encoding:
 
-- `UNION (31)`: no additional type meta payload.
-- `TYPED_UNION (32)`: no additional type meta payload (numeric ID is carried in the full type ID itself).
-- `NAMED_UNION (33)`: followed by named type meta (namespace + type name, or shared TypeDef marker/body).
+- `UNION (33)`: no additional type meta payload.
+- `TYPED_UNION (34)`: write `user_type_id` as varuint32 after the type ID.
+- `NAMED_UNION (35)`: followed by named type meta (namespace + type name, or shared TypeDef marker/body).
 
 #### Union value payload
 
@@ -1375,27 +1403,27 @@ This is required even for primitives so unknown alternatives can be skipped safe
 **UNION (schema known from context)**
 
 ```
-| ... outer ref meta ... | type_id=UNION(31) | case_id | case_value |
+| ... outer ref meta ... | type_id=UNION(33) | case_id | case_value |
 ```
 
-**TYPED_UNION (schema embedded by numeric id)**
+**TYPED_UNION (schema identified by numeric id)**
 
 ```
-| ... outer ref meta ... | embedded type id | case_id | case_value |
+| ... outer ref meta ... | type_id=TYPED_UNION(34) | user_type_id | case_id | case_value |
 ```
 
-embedded type id: `type_id=(user_type_id << 8) | TYPED_UNION(32)`
+user_type_id: varuint32 numeric registration ID for the union schema.
 
 **NAMED_UNION (schema embedded by name/typedef)**
 
 ```
-| ... outer ref meta ... | type_id=NAMED_UNION(33) | name_or_typedef | case_id | case_value |
+| ... outer ref meta ... | type_id=NAMED_UNION(35) | name_or_typedef | case_id | case_value |
 ```
 
 #### Decoding rules
 
 1. Read outer ref meta and `type_id`.
-2. If `TYPED_UNION`, resolve the union schema from the full type ID.
+2. If `TYPED_UNION`, read `user_type_id` and resolve the union schema by ID.
 3. If `NAMED_UNION`, read named type meta and resolve the union schema.
 4. Read `case_id`.
 5. Read `case_value` as Any-style value (ref meta + type meta + value).
@@ -1581,7 +1609,7 @@ Meta strings are required for enum and struct serialization (encoding field name
     - [ ] Support registration by numeric ID
     - [ ] Support registration by namespace + type name
     - [ ] Maintain type → serializer mapping
-    - [ ] Generate type IDs: `(user_id << 8) | internal_type_id`
+    - [ ] Generate type IDs: write internal type ID, then `user_type_id` as varuint32
 
 14. **Field Ordering**
     - [ ] Implement the spec-defined grouping and ordering (primitive/boxed/built-in, collections/maps, other)
diff --git a/docs/specification/xlang_type_mapping.md b/docs/specification/xlang_type_mapping.md
index 9390e56d6..533661b3f 100644
--- a/docs/specification/xlang_type_mapping.md
+++ b/docs/specification/xlang_type_mapping.md
@@ -25,6 +25,27 @@ Note:
 - `int16_t[n]/vector<T>` indicates `int16_t[n]/vector<int16_t>`
 - The cross-language serialization is not stable, do not use it in your production environment.
 
+## User Type IDs
+
+When registering user types (struct/ext/enum/union), the internal type ID is written as the 8-bit
+kind, and the user type ID is written separately as an unsigned varint32. There is no bit
+shift/packing, and `user_type_id` can be in the range `0~0xFFFFFFFE`.
+
+**Examples:**
+
+| User ID | Type              | Internal ID | Encoded User ID | Decimal |
+| ------- | ----------------- | ----------- | --------------- | ------- |
+| 0       | STRUCT            | 27          | 0               | 0       |
+| 0       | ENUM              | 25          | 0               | 0       |
+| 1       | STRUCT            | 27          | 1               | 1       |
+| 1       | COMPATIBLE_STRUCT | 28          | 1               | 1       |
+| 2       | NAMED_STRUCT      | 29          | 2               | 2       |
+
+When reading type IDs:
+
+- Read internal type ID from the type ID field.
+- If the internal type is a user-registered kind, read `user_type_id` as varuint32.
+
 ## Type Mapping
 
 | Fory Type               | Fory Type ID | Java            | Python                   | Javascript          | C++                            | Golang           | Rust              |
@@ -44,41 +65,45 @@ Note:
 | uint64                  | 13           | long/Long       | int/pyfory.fixed_uint64  | Type.uint64()       | uint64_t                       | uint64           | u64               |
 | var_uint64              | 14           | long/Long       | int/pyfory.uint64        | Type.varUInt64()    | uint64_t                       | uint64           | u64               |
 | tagged_uint64           | 15           | long/Long       | int/pyfory.tagged_uint64 | Type.taggedUInt64() | uint64_t                       | uint64           | u64               |
-| float16                 | 16           | float/Float     | float/pyfory.float16     | Type.float16()      | fory::float16_t                | fory.float16     | fory::f16         |
-| float32                 | 17           | float/Float     | float/pyfory.float32     | Type.float32()      | float                          | float32          | f32               |
-| float64                 | 18           | double/Double   | float/pyfory.float64     | Type.float64()      | double                         | float64          | f64               |
-| string                  | 19           | String          | str                      | String              | string                         | string           | String/str        |
-| list                    | 20           | List/Collection | list/tuple               | array               | vector                         | slice            | Vec               |
-| set                     | 21           | Set             | set                      | /                   | set                            | fory.Set         | Set               |
-| map                     | 22           | Map             | dict                     | Map                 | unordered_map                  | map              | HashMap           |
-| enum                    | 23           | Enum subclasses | enum subclasses          | /                   | enum                           | /                | enum              |
-| named_enum              | 24           | Enum subclasses | enum subclasses          | /                   | enum                           | /                | enum              |
-| struct                  | 25           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
-| compatible_struct       | 26           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
-| named_struct            | 27           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
-| named_compatible_struct | 28           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
-| ext                     | 29           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
-| named_ext               | 30           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
-| union                   | 31           | Union           | typing.Union             | /                   | `std::variant<Ts...>`          | /                | tagged union enum |
-| none                    | 32           | null            | None                     | null                | `std::monostate`               | nil              | `()`              |
-| duration                | 33           | Duration        | timedelta                | Number              | duration                       | Duration         | Duration          |
-| timestamp               | 34           | Instant         | datetime                 | Number              | std::chrono::nanoseconds       | Time             | DateTime          |
-| date                    | 35           | Date            | datetime                 | Number              | fory::serialization::Date      | Time             | DateTime          |
-| decimal                 | 36           | BigDecimal      | Decimal                  | bigint              | /                              | /                | /                 |
-| binary                  | 37           | byte[]          | bytes                    | /                   | `uint8_t[n]/vector<T>`         | `[n]uint8/[]T`   | `Vec<uint8_t>`    |
-| array                   | 38           | array           | np.ndarray               | /                   | /                              | array/slice      | Vec               |
-| bool_array              | 39           | bool[]          | ndarray(np.bool\_)       | /                   | `bool[n]`                      | `[n]bool/[]T`    | `Vec<bool>`       |
-| int8_array              | 40           | byte[]          | ndarray(int8)            | /                   | `int8_t[n]/vector<T>`          | `[n]int8/[]T`    | `Vec<i8>`         |
-| int16_array             | 41           | short[]         | ndarray(int16)           | /                   | `int16_t[n]/vector<T>`         | `[n]int16/[]T`   | `Vec<i16>`        |
-| int32_array             | 42           | int[]           | ndarray(int32)           | /                   | `int32_t[n]/vector<T>`         | `[n]int32/[]T`   | `Vec<i32>`        |
-| int64_array             | 43           | long[]          | ndarray(int64)           | /                   | `int64_t[n]/vector<T>`         | `[n]int64/[]T`   | `Vec<i64>`        |
-| uint8_array             | 44           | short[]         | ndarray(uint8)           | /                   | `uint8_t[n]/vector<T>`         | `[n]uint8/[]T`   | `Vec<u8>`         |
-| uint16_array            | 45           | int[]           | ndarray(uint16)          | /                   | `uint16_t[n]/vector<T>`        | `[n]uint16/[]T`  | `Vec<u16>`        |
-| uint32_array            | 46           | long[]          | ndarray(uint32)          | /                   | `uint32_t[n]/vector<T>`        | `[n]uint32/[]T`  | `Vec<u32>`        |
-| uint64_array            | 47           | long[]          | ndarray(uint64)          | /                   | `uint64_t[n]/vector<T>`        | `[n]uint64/[]T`  | `Vec<u64>`        |
-| float16_array           | 48           | float[]         | ndarray(float16)         | /                   | `fory::float16_t[n]/vector<T>` | `[n]float16/[]T` | `Vec<fory::f16>`  |
-| float32_array           | 49           | float[]         | ndarray(float32)         | /                   | `float[n]/vector<T>`           | `[n]float32/[]T` | `Vec<f32>`        |
-| float64_array           | 50           | double[]        | ndarray(float64)         | /                   | `double[n]/vector<T>`          | `[n]float64/[]T` | `Vec<f64>`        |
+| float8                  | 16           | /               | /                        | /                   | /                              | /                | /                 |
+| float16                 | 17           | float/Float     | float/pyfory.float16     | Type.float16()      | fory::float16_t                | fory.float16     | fory::f16         |
+| bfloat16                | 18           | /               | /                        | /                   | /                              | /                | /                 |
+| float32                 | 19           | float/Float     | float/pyfory.float32     | Type.float32()      | float                          | float32          | f32               |
+| float64                 | 20           | double/Double   | float/pyfory.float64     | Type.float64()      | double                         | float64          | f64               |
+| string                  | 21           | String          | str                      | String              | string                         | string           | String/str        |
+| list                    | 22           | List/Collection | list/tuple               | array               | vector                         | slice            | Vec               |
+| set                     | 23           | Set             | set                      | /                   | set                            | fory.Set         | Set               |
+| map                     | 24           | Map             | dict                     | Map                 | unordered_map                  | map              | HashMap           |
+| enum                    | 25           | Enum subclasses | enum subclasses          | /                   | enum                           | /                | enum              |
+| named_enum              | 26           | Enum subclasses | enum subclasses          | /                   | enum                           | /                | enum              |
+| struct                  | 27           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
+| compatible_struct       | 28           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
+| named_struct            | 29           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
+| named_compatible_struct | 30           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
+| ext                     | 31           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
+| named_ext               | 32           | pojo/record     | data class               | object              | struct/class                   | struct           | struct            |
+| union                   | 33           | Union           | typing.Union             | /                   | `std::variant<Ts...>`          | /                | tagged union enum |
+| none                    | 36           | null            | None                     | null                | `std::monostate`               | nil              | `()`              |
+| duration                | 37           | Duration        | timedelta                | Number              | duration                       | Duration         | Duration          |
+| timestamp               | 38           | Instant         | datetime                 | Number              | std::chrono::nanoseconds       | Time             | DateTime          |
+| date                    | 39           | Date            | datetime                 | Number              | fory::serialization::Date      | Time             | DateTime          |
+| decimal                 | 40           | BigDecimal      | Decimal                  | bigint              | /                              | /                | /                 |
+| binary                  | 41           | byte[]          | bytes                    | /                   | `uint8_t[n]/vector<T>`         | `[n]uint8/[]T`   | `Vec<uint8_t>`    |
+| array                   | 42           | array           | np.ndarray               | /                   | /                              | array/slice      | Vec               |
+| bool_array              | 43           | bool[]          | ndarray(np.bool\_)       | /                   | `bool[n]`                      | `[n]bool/[]T`    | `Vec<bool>`       |
+| int8_array              | 44           | byte[]          | ndarray(int8)            | /                   | `int8_t[n]/vector<T>`          | `[n]int8/[]T`    | `Vec<i8>`         |
+| int16_array             | 45           | short[]         | ndarray(int16)           | /                   | `int16_t[n]/vector<T>`         | `[n]int16/[]T`   | `Vec<i16>`        |
+| int32_array             | 46           | int[]           | ndarray(int32)           | /                   | `int32_t[n]/vector<T>`         | `[n]int32/[]T`   | `Vec<i32>`        |
+| int64_array             | 47           | long[]          | ndarray(int64)           | /                   | `int64_t[n]/vector<T>`         | `[n]int64/[]T`   | `Vec<i64>`        |
+| uint8_array             | 48           | short[]         | ndarray(uint8)           | /                   | `uint8_t[n]/vector<T>`         | `[n]uint8/[]T`   | `Vec<u8>`         |
+| uint16_array            | 49           | int[]           | ndarray(uint16)          | /                   | `uint16_t[n]/vector<T>`        | `[n]uint16/[]T`  | `Vec<u16>`        |
+| uint32_array            | 50           | long[]          | ndarray(uint32)          | /                   | `uint32_t[n]/vector<T>`        | `[n]uint32/[]T`  | `Vec<u32>`        |
+| uint64_array            | 51           | long[]          | ndarray(uint64)          | /                   | `uint64_t[n]/vector<T>`        | `[n]uint64/[]T`  | `Vec<u64>`        |
+| float8_array            | 52           | /               | /                        | /                   | /                              | /                | /                 |
+| float16_array           | 53           | float[]         | ndarray(float16)         | /                   | `fory::float16_t[n]/vector<T>` | `[n]float16/[]T` | `Vec<fory::f16>`  |
+| bfloat16_array          | 54           | /               | /                        | /                   | /                              | /                | /                 |
+| float32_array           | 55           | float[]         | ndarray(float32)         | /                   | `float[n]/vector<T>`           | `[n]float32/[]T` | `Vec<f32>`        |
+| float64_array           | 56           | double[]        | ndarray(float64)         | /                   | `double[n]/vector<T>`          | `[n]float64/[]T` | `Vec<f64>`        |
 
 ## Type info(not implemented currently)
 
diff --git a/go/fory/types.go b/go/fory/types.go
index c56190365..a0ee730b4 100644
--- a/go/fory/types.go
+++ b/go/fory/types.go
@@ -57,80 +57,88 @@ const (
 	VAR_UINT64 = 14
 	// TAGGED_UINT64 a 64-bit unsigned integer which uses fory hybrid encoding
 	TAGGED_UINT64 = 15
+	// FLOAT8 1-byte floating point value
+	FLOAT8 = 16
 	// FLOAT16 2-byte floating point value
-	FLOAT16 = 16
+	FLOAT16 = 17
+	// BFLOAT16 2-byte brain floating point value
+	BFLOAT16 = 18
 	// FLOAT32 4-byte floating point value
-	FLOAT32 = 17
+	FLOAT32 = 19
 	// FLOAT64 8-byte floating point value
-	FLOAT64 = 18
+	FLOAT64 = 20
 	// STRING UTF8 variable-length string as List<Char>
-	STRING = 19
+	STRING = 21
 	// LIST A list of some logical data type
-	LIST = 20
+	LIST = 22
 	// SET an unordered set of unique elements
-	SET = 21
+	SET = 23
 	// MAP Map a repeated struct logical type
-	MAP = 22
+	MAP = 24
 	// ENUM a data type consisting of a set of named values
-	ENUM = 23
+	ENUM = 25
 	// NAMED_ENUM an enum whose value will be serialized as the registered name
-	NAMED_ENUM = 24
+	NAMED_ENUM = 26
 	// STRUCT a morphic(final) type serialized by Fory Struct serializer
-	STRUCT = 25
+	STRUCT = 27
 	// COMPATIBLE_STRUCT a morphic(final) type serialized by Fory compatible Struct serializer
-	COMPATIBLE_STRUCT = 26
+	COMPATIBLE_STRUCT = 28
 	// NAMED_STRUCT a struct whose type mapping will be encoded as a name
-	NAMED_STRUCT = 27
+	NAMED_STRUCT = 29
 	// NAMED_COMPATIBLE_STRUCT a compatible_struct whose type mapping will be encoded as a name
-	NAMED_COMPATIBLE_STRUCT = 28
+	NAMED_COMPATIBLE_STRUCT = 30
 	// EXT a type which will be serialized by a customized serializer
-	EXT = 29
+	EXT = 31
 	// NAMED_EXT an ext type whose type mapping will be encoded as a name
-	NAMED_EXT = 30
+	NAMED_EXT = 32
 	// UNION a union value whose schema identity is not embedded
-	UNION = 31
+	UNION = 33
 	// TYPED_UNION a union value with embedded numeric union type ID
-	TYPED_UNION = 32
+	TYPED_UNION = 34
 	// NAMED_UNION a union value with embedded union type name/TypeDef
-	NAMED_UNION = 33
+	NAMED_UNION = 35
 	// NONE a null value with no data
-	NONE = 34
+	NONE = 36
 	// DURATION Measure of elapsed time in either seconds milliseconds microseconds
-	DURATION = 35
+	DURATION = 37
 	// TIMESTAMP Exact timestamp encoded with seconds(int64) + nanos(uint32) since UNIX epoch
-	TIMESTAMP = 36
+	TIMESTAMP = 38
 	// DATE a naive date without timezone
-	DATE = 37
+	DATE = 39
 	// DECIMAL Precision- and scale-based decimal type
-	DECIMAL = 38
+	DECIMAL = 40
 	// BINARY Variable-length bytes (no guarantee of UTF8-ness)
-	BINARY = 39
+	BINARY = 41
 	// ARRAY a multidimensional array which every sub-array can have different sizes but all have the same type
-	ARRAY = 40
+	ARRAY = 42
 	// BOOL_ARRAY one dimensional bool array
-	BOOL_ARRAY = 41
+	BOOL_ARRAY = 43
 	// INT8_ARRAY one dimensional int8 array
-	INT8_ARRAY = 42
+	INT8_ARRAY = 44
 	// INT16_ARRAY one dimensional int16 array
-	INT16_ARRAY = 43
+	INT16_ARRAY = 45
 	// INT32_ARRAY one dimensional int32 array
-	INT32_ARRAY = 44
+	INT32_ARRAY = 46
 	// INT64_ARRAY one dimensional int64 array
-	INT64_ARRAY = 45
+	INT64_ARRAY = 47
 	// UINT8_ARRAY one dimensional uint8 array
-	UINT8_ARRAY = 46
+	UINT8_ARRAY = 48
 	// UINT16_ARRAY one dimensional uint16 array
-	UINT16_ARRAY = 47
+	UINT16_ARRAY = 49
 	// UINT32_ARRAY one dimensional uint32 array
-	UINT32_ARRAY = 48
+	UINT32_ARRAY = 50
 	// UINT64_ARRAY one dimensional uint64 array
-	UINT64_ARRAY = 49
+	UINT64_ARRAY = 51
+	// FLOAT8_ARRAY one dimensional float8 array
+	FLOAT8_ARRAY = 52
 	// FLOAT16_ARRAY one dimensional float16 array
-	FLOAT16_ARRAY = 50
+	FLOAT16_ARRAY = 53
+	// BFLOAT16_ARRAY one dimensional bfloat16 array
+	BFLOAT16_ARRAY = 54
 	// FLOAT32_ARRAY one dimensional float32 array
-	FLOAT32_ARRAY = 51
+	FLOAT32_ARRAY = 55
 	// FLOAT64_ARRAY one dimensional float64 array
-	FLOAT64_ARRAY = 52
+	FLOAT64_ARRAY = 56
 )
 
 // IsNamespacedType checks whether the given type ID is a namespace type
@@ -180,7 +188,9 @@ func isPrimitiveType(typeID TypeId) bool {
 		UINT64,
 		VAR_UINT64,
 		TAGGED_UINT64,
+		FLOAT8,
 		FLOAT16,
+		BFLOAT16,
 		FLOAT32,
 		FLOAT64:
 		return true
@@ -195,7 +205,7 @@ func isPrimitiveType(typeID TypeId) bool {
 func NeedWriteRef(typeID TypeId) bool {
 	switch typeID {
 	case BOOL, INT8, INT16, INT32, INT64, VARINT32, VARINT64, TAGGED_INT64,
-		FLOAT32, FLOAT64, FLOAT16,
+		FLOAT32, FLOAT64, FLOAT16, FLOAT8, BFLOAT16,
 		STRING, TIMESTAMP, DATE, DURATION, NONE:
 		return false
 	default:
@@ -230,7 +240,9 @@ func isPrimitiveArrayType(typeID TypeId) bool {
 		UINT16_ARRAY,
 		UINT32_ARRAY,
 		UINT64_ARRAY,
+		FLOAT8_ARRAY,
 		FLOAT16_ARRAY,
+		BFLOAT16_ARRAY,
 		FLOAT32_ARRAY,
 		FLOAT64_ARRAY:
 		return true
@@ -245,7 +257,9 @@ var primitiveTypeSizes = map[TypeId]int{
 	UINT8:         1,
 	INT16:         2,
 	UINT16:        2,
+	FLOAT8:        1,
 	FLOAT16:       2,
+	BFLOAT16:      2,
 	INT32:         4,
 	VARINT32:      4,
 	UINT32:        4,
@@ -495,7 +509,7 @@ func IsPrimitiveTypeId(typeId TypeId) bool {
 	switch typeId {
 	case BOOL, INT8, INT16, INT32, VARINT32, INT64, VARINT64, TAGGED_INT64,
 		UINT8, UINT16, UINT32, VAR_UINT32, UINT64, VAR_UINT64, TAGGED_UINT64,
-		FLOAT16, FLOAT32, FLOAT64, STRING:
+		FLOAT8, FLOAT16, BFLOAT16, FLOAT32, FLOAT64, STRING:
 		return true
 	default:
 		return false
diff --git a/java/fory-core/src/main/java/org/apache/fory/Fory.java b/java/fory-core/src/main/java/org/apache/fory/Fory.java
index 9285571dd..c1781d5ca 100644
--- a/java/fory-core/src/main/java/org/apache/fory/Fory.java
+++ b/java/fory-core/src/main/java/org/apache/fory/Fory.java
@@ -61,11 +61,11 @@ import org.apache.fory.resolver.XtypeResolver;
 import org.apache.fory.serializer.ArraySerializers;
 import org.apache.fory.serializer.BufferCallback;
 import org.apache.fory.serializer.BufferObject;
-import org.apache.fory.serializer.NonexistentClass.NonexistentMetaShared;
 import org.apache.fory.serializer.PrimitiveSerializers.LongSerializer;
 import org.apache.fory.serializer.Serializer;
 import org.apache.fory.serializer.SerializerFactory;
 import org.apache.fory.serializer.StringSerializer;
+import org.apache.fory.serializer.UnknownClass.UnknownStruct;
 import org.apache.fory.serializer.collection.CollectionSerializers.ArrayListSerializer;
 import org.apache.fory.serializer.collection.MapSerializers.HashMapSerializer;
 import org.apache.fory.type.Generics;
@@ -500,7 +500,7 @@ public final class Fory implements BaseFory {
   public void xwriteRef(MemoryBuffer buffer, Object obj) {
     if (!refResolver.writeRefOrNull(buffer, obj)) {
       TypeInfo typeInfo = xtypeResolver.getTypeInfo(obj.getClass());
-      if (typeInfo.getCls() == NonexistentMetaShared.class) {
+      if (typeInfo.getCls() == UnknownStruct.class) {
         depth++;
         typeInfo.getSerializer().xwrite(buffer, obj);
         depth--;
@@ -514,7 +514,7 @@ public final class Fory implements BaseFory {
   public void xwriteRef(MemoryBuffer buffer, Object obj, TypeInfoHolder classInfoHolder) {
     if (!refResolver.writeRefOrNull(buffer, obj)) {
       TypeInfo typeInfo = xtypeResolver.getTypeInfo(obj.getClass(), classInfoHolder);
-      if (typeInfo.getCls() == NonexistentMetaShared.class) {
+      if (typeInfo.getCls() == UnknownStruct.class) {
         depth++;
         typeInfo.getSerializer().xwrite(buffer, obj);
         depth--;
@@ -527,7 +527,7 @@ public final class Fory implements BaseFory {
 
   public void xwriteRef(MemoryBuffer buffer, Object obj, TypeInfo typeInfo) {
     if (!refResolver.writeRefOrNull(buffer, obj)) {
-      if (typeInfo.getCls() == NonexistentMetaShared.class) {
+      if (typeInfo.getCls() == UnknownStruct.class) {
         depth++;
         typeInfo.getSerializer().xwrite(buffer, obj);
         depth--;
@@ -559,7 +559,7 @@ public final class Fory implements BaseFory {
 
   public void xwriteNonRef(MemoryBuffer buffer, Object obj) {
     TypeInfo typeInfo = xtypeResolver.getTypeInfo(obj.getClass());
-    if (typeInfo.getCls() == NonexistentMetaShared.class) {
+    if (typeInfo.getCls() == UnknownStruct.class) {
       depth++;
       typeInfo.getSerializer().xwrite(buffer, obj);
       depth--;
@@ -571,7 +571,7 @@ public final class Fory implements BaseFory {
 
   public void xwriteNonRef(MemoryBuffer buffer, Object obj, TypeInfoHolder holder) {
     TypeInfo typeInfo = xtypeResolver.getTypeInfo(obj.getClass(), holder);
-    if (typeInfo.getCls() == NonexistentMetaShared.class) {
+    if (typeInfo.getCls() == UnknownStruct.class) {
       depth++;
       typeInfo.getSerializer().xwrite(buffer, obj);
       depth--;
@@ -582,7 +582,7 @@ public final class Fory implements BaseFory {
   }
 
   public void xwriteNonRef(MemoryBuffer buffer, Object obj, TypeInfo typeInfo) {
-    if (typeInfo.getCls() == NonexistentMetaShared.class) {
+    if (typeInfo.getCls() == UnknownStruct.class) {
       depth++;
       typeInfo.getSerializer().xwrite(buffer, obj);
       depth--;
diff --git a/java/fory-core/src/main/java/org/apache/fory/config/Config.java b/java/fory-core/src/main/java/org/apache/fory/config/Config.java
index cc2a6c32d..e07ada4ec 100644
--- a/java/fory-core/src/main/java/org/apache/fory/config/Config.java
+++ b/java/fory-core/src/main/java/org/apache/fory/config/Config.java
@@ -58,7 +58,7 @@ public class Config implements Serializable {
   private final boolean scopedMetaShareEnabled;
   private final MetaCompressor metaCompressor;
   private final boolean asyncCompilationEnabled;
-  private final boolean deserializeNonexistentClass;
+  private final boolean deserializeUnknownClass;
   private final boolean scalaOptimizationEnabled;
   private transient int configHash;
   private final UnknownEnumValueStrategy unknownEnumValueStrategy;
@@ -92,11 +92,11 @@ public class Config implements Serializable {
     metaShareEnabled = builder.metaShareEnabled;
     scopedMetaShareEnabled = builder.scopedMetaShareEnabled;
     metaCompressor = builder.metaCompressor;
-    deserializeNonexistentClass = builder.deserializeNonexistentClass;
-    if (deserializeNonexistentClass) {
+    deserializeUnknownClass = builder.deserializeUnknownClass;
+    if (deserializeUnknownClass) {
       Preconditions.checkArgument(
           metaShareEnabled || compatibleMode == CompatibleMode.COMPATIBLE,
-          "Configuration error: deserializeNonexistentClass=true requires either "
+          "Configuration error: deserializeUnknownClass=true requires either "
               + "metaShareEnabled=true to access type information OR compatibleMode=COMPATIBLE "
               + "to automatically resolve class schemas.");
     }
@@ -139,7 +139,7 @@ public class Config implements Serializable {
   }
 
   /** ignore Enum Deserialize array out of bounds return null. */
-  public boolean deserializeNonexistentEnumValueAsNull() {
+  public boolean deserializeUnknownEnumValueAsNull() {
     return unknownEnumValueStrategy == UnknownEnumValueStrategy.RETURN_NULL;
   }
 
@@ -263,8 +263,8 @@ public class Config implements Serializable {
    * Whether deserialize/skip data of un-existed class. If not enabled, an exception will be thrown
    * if class not exist.
    */
-  public boolean deserializeNonexistentClass() {
-    return deserializeNonexistentClass;
+  public boolean deserializeUnknownClass() {
+    return deserializeUnknownClass;
   }
 
   /**
@@ -322,7 +322,7 @@ public class Config implements Serializable {
         && scopedMetaShareEnabled == config.scopedMetaShareEnabled
         && Objects.equals(metaCompressor, config.metaCompressor)
         && asyncCompilationEnabled == config.asyncCompilationEnabled
-        && deserializeNonexistentClass == config.deserializeNonexistentClass
+        && deserializeUnknownClass == config.deserializeUnknownClass
         && scalaOptimizationEnabled == config.scalaOptimizationEnabled
         && xlang == config.xlang
         && compatibleMode == config.compatibleMode
@@ -360,7 +360,7 @@ public class Config implements Serializable {
         scopedMetaShareEnabled,
         metaCompressor,
         asyncCompilationEnabled,
-        deserializeNonexistentClass,
+        deserializeUnknownClass,
         scalaOptimizationEnabled);
   }
 
diff --git a/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java b/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
index b1c76e1a8..7e4bc0fde 100644
--- a/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/config/ForyBuilder.java
@@ -78,7 +78,7 @@ public final class ForyBuilder {
   Boolean metaShareEnabled;
   Boolean scopedMetaShareEnabled;
   boolean codeGenEnabled = true;
-  Boolean deserializeNonexistentClass;
+  Boolean deserializeUnknownClass;
   boolean asyncCompilationEnabled = false;
   boolean registerGuavaTypes = true;
   boolean scalaOptimizationEnabled = false;
@@ -132,9 +132,12 @@ public final class ForyBuilder {
   }
 
   /** ignore Enum Deserialize array out of bounds. */
-  public ForyBuilder deserializeNonexistentEnumValueAsNull(
-      boolean deserializeNonexistentEnumValueAsNull) {
-    this.unknownEnumValueStrategy = UnknownEnumValueStrategy.RETURN_NULL;
+  public ForyBuilder deserializeUnknownEnumValueAsNull(boolean deserializeUnknownEnumValueAsNull) {
+    if (deserializeUnknownEnumValueAsNull) {
+      this.unknownEnumValueStrategy = UnknownEnumValueStrategy.RETURN_NULL;
+    } else {
+      this.unknownEnumValueStrategy = UnknownEnumValueStrategy.NOT_ALLOWED;
+    }
     return this;
   }
 
@@ -350,10 +353,10 @@ public final class ForyBuilder {
   /**
    * Whether deserialize/skip data of un-existed class.
    *
-   * @see Config#deserializeNonexistentClass()
+   * @see Config#deserializeUnknownClass()
    */
-  public ForyBuilder withDeserializeNonexistentClass(boolean deserializeNonexistentClass) {
-    this.deserializeNonexistentClass = deserializeNonexistentClass;
+  public ForyBuilder withDeserializeUnknownClass(boolean deserializeUnknownClass) {
+    this.deserializeUnknownClass = deserializeUnknownClass;
     return this;
   }
 
@@ -453,8 +456,8 @@ public final class ForyBuilder {
     }
     if (compatibleMode == CompatibleMode.COMPATIBLE) {
       checkClassVersion = false;
-      if (deserializeNonexistentClass == null) {
-        deserializeNonexistentClass = true;
+      if (deserializeUnknownClass == null) {
+        deserializeUnknownClass = true;
       }
       if (scopedMetaShareEnabled == null) {
         if (metaShareEnabled == null) {
@@ -469,8 +472,8 @@ public final class ForyBuilder {
         }
       }
     } else {
-      if (deserializeNonexistentClass == null) {
-        deserializeNonexistentClass = false;
+      if (deserializeUnknownClass == null) {
+        deserializeUnknownClass = false;
       }
       if (scopedMetaShareEnabled != null && scopedMetaShareEnabled) {
         LOG.warn("Scoped meta share is for CompatibleMode only, disable it for {}", compatibleMode);
diff --git a/java/fory-core/src/main/java/org/apache/fory/meta/FieldTypes.java b/java/fory-core/src/main/java/org/apache/fory/meta/FieldTypes.java
index d42b5460f..61d4def60 100644
--- a/java/fory-core/src/main/java/org/apache/fory/meta/FieldTypes.java
+++ b/java/fory-core/src/main/java/org/apache/fory/meta/FieldTypes.java
@@ -52,7 +52,7 @@ import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.resolver.TypeInfo;
 import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.resolver.XtypeResolver;
-import org.apache.fory.serializer.NonexistentClass;
+import org.apache.fory.serializer.UnknownClass;
 import org.apache.fory.type.Descriptor;
 import org.apache.fory.type.GenericType;
 import org.apache.fory.type.TypeUtils;
@@ -550,7 +550,7 @@ public class FieldTypes {
         }
         LOG.warn("Class {} not registered, take it as Struct type for deserialization.", typeId);
         boolean isEnum = internalTypeId == Types.ENUM;
-        cls = NonexistentClass.getNonexistentClass(isEnum, 0, resolver.getFory().isShareMeta());
+        cls = UnknownClass.getUnknowClass(isEnum, 0, resolver.getFory().isShareMeta());
         return TypeRef.of(cls, new TypeExtMeta(typeId, nullable, trackingRef));
       }
       if (resolver instanceof XtypeResolver) {
@@ -563,7 +563,7 @@ public class FieldTypes {
       if (cls == null) {
         LOG.warn("Class {} not registered, take it as Struct type for deserialization.", typeId);
         boolean isEnum = internalTypeId == Types.ENUM;
-        cls = NonexistentClass.getNonexistentClass(isEnum, 0, resolver.getFory().isShareMeta());
+        cls = UnknownClass.getUnknowClass(isEnum, 0, resolver.getFory().isShareMeta());
       }
       return TypeRef.of(cls, new TypeExtMeta(typeId, nullable, trackingRef));
     }
@@ -881,7 +881,7 @@ public class FieldTypes {
       if (declared != null && declared.getRawType().isEnum()) {
         return declared;
       }
-      return TypeRef.of(NonexistentClass.NonexistentEnum.class);
+      return TypeRef.of(UnknownClass.UnknownEnum.class);
     }
 
     @Override
@@ -924,10 +924,9 @@ public class FieldTypes {
       }
       TypeRef<?> componentTypeRef = componentType.toTypeToken(classResolver, declared);
       Class<?> componentRawType = componentTypeRef.getRawType();
-      if (NonexistentClass.class.isAssignableFrom(componentRawType)) {
+      if (UnknownClass.class.isAssignableFrom(componentRawType)) {
         return TypeRef.of(
-            NonexistentClass.getNonexistentClass(
-                componentType instanceof EnumFieldType, dimensions, true),
+            UnknownClass.getUnknowClass(componentType instanceof EnumFieldType, dimensions, true),
             new TypeExtMeta(typeId, nullable, trackingRef));
       } else {
         return TypeRef.of(
diff --git a/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefDecoder.java b/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefDecoder.java
index 49c7c5dd1..aa9947865 100644
--- a/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefDecoder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/meta/NativeTypeDefDecoder.java
@@ -36,7 +36,7 @@ import org.apache.fory.meta.FieldTypes.FieldType;
 import org.apache.fory.meta.MetaString.Encoding;
 import org.apache.fory.resolver.ClassResolver;
 import org.apache.fory.resolver.TypeResolver;
-import org.apache.fory.serializer.NonexistentClass;
+import org.apache.fory.serializer.UnknownClass;
 import org.apache.fory.type.Types;
 import org.apache.fory.util.Preconditions;
 
@@ -90,8 +90,7 @@ class NativeTypeDefDecoder {
         }
         Class<?> cls = resolver.getRegisteredClassByTypeId(typeId, userTypeId);
         if (cls == null) {
-          classSpec =
-              new ClassSpec(NonexistentClass.NonexistentMetaShared.class, typeId, userTypeId);
+          classSpec = new ClassSpec(UnknownClass.UnknownStruct.class, typeId, userTypeId);
           className = classSpec.entireClassName;
         } else {
           className = cls.getName();
@@ -112,7 +111,7 @@ class NativeTypeDefDecoder {
           Class<?> cls =
               resolver.loadClassForMeta(
                   decodedSpec.entireClassName, decodedSpec.isEnum, decodedSpec.dimension);
-          if (NonexistentClass.isNonexistent(cls)) {
+          if (UnknownClass.isUnknowClass(cls)) {
             int typeId;
             if (decodedSpec.isEnum) {
               typeId = Types.NAMED_ENUM;
diff --git a/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefDecoder.java b/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefDecoder.java
index cb4b38066..916b0c721 100644
--- a/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefDecoder.java
+++ b/java/fory-core/src/main/java/org/apache/fory/meta/TypeDefDecoder.java
@@ -38,7 +38,7 @@ import org.apache.fory.meta.FieldTypes.FieldType;
 import org.apache.fory.meta.MetaString.Encoding;
 import org.apache.fory.resolver.TypeInfo;
 import org.apache.fory.resolver.XtypeResolver;
-import org.apache.fory.serializer.NonexistentClass;
+import org.apache.fory.serializer.UnknownClass;
 import org.apache.fory.util.StringUtils;
 import org.apache.fory.util.Utils;
 
@@ -68,7 +68,7 @@ class TypeDefDecoder {
       }
       TypeInfo userTypeInfo = resolver.getUserTypeInfo(namespace, typeName);
       if (userTypeInfo == null) {
-        classSpec = new ClassSpec(NonexistentClass.NonexistentMetaShared.class);
+        classSpec = new ClassSpec(UnknownClass.UnknownStruct.class);
       } else {
         classSpec = new ClassSpec(userTypeInfo.getCls());
       }
@@ -77,7 +77,7 @@ class TypeDefDecoder {
       int userTypeId = buffer.readVarUint32();
       TypeInfo userTypeInfo = resolver.getUserTypeInfo(userTypeId);
       if (userTypeInfo == null) {
-        classSpec = new ClassSpec(NonexistentClass.NonexistentMetaShared.class, typeId, userTypeId);
+        classSpec = new ClassSpec(UnknownClass.UnknownStruct.class, typeId, userTypeId);
       } else {
         classSpec = new ClassSpec(userTypeInfo.getCls(), typeId, userTypeId);
       }
@@ -90,7 +90,7 @@ class TypeDefDecoder {
       LOG.info("[Java TypeDef DECODED] " + typeDef);
       // Compute and print diff with local TypeDef
       Class<?> cls = classSpec.type;
-      if (cls != null && cls != NonexistentClass.NonexistentMetaShared.class) {
+      if (cls != null && cls != UnknownClass.UnknownStruct.class) {
         TypeDef localDef = TypeDef.buildTypeDef(resolver.getFory(), cls);
         String diff = typeDef.computeDiff(localDef);
         if (diff != null) {
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
index f5a34b4c1..e7c4ebfc9 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/ClassResolver.java
@@ -116,11 +116,6 @@ import org.apache.fory.serializer.JdkProxySerializer;
 import org.apache.fory.serializer.LambdaSerializer;
 import org.apache.fory.serializer.LocaleSerializer;
 import org.apache.fory.serializer.NoneSerializer;
-import org.apache.fory.serializer.NonexistentClass;
-import org.apache.fory.serializer.NonexistentClass.NonexistentMetaShared;
-import org.apache.fory.serializer.NonexistentClass.NonexistentSkip;
-import org.apache.fory.serializer.NonexistentClassSerializers;
-import org.apache.fory.serializer.NonexistentClassSerializers.NonexistentClassSerializer;
 import org.apache.fory.serializer.ObjectSerializer;
 import org.apache.fory.serializer.OptionalSerializers;
 import org.apache.fory.serializer.PrimitiveSerializers;
@@ -131,6 +126,10 @@ import org.apache.fory.serializer.SerializerFactory;
 import org.apache.fory.serializer.Serializers;
 import org.apache.fory.serializer.StringSerializer;
 import org.apache.fory.serializer.TimeSerializers;
+import org.apache.fory.serializer.UnknownClass;
+import org.apache.fory.serializer.UnknownClass.UnknownEmptyStruct;
+import org.apache.fory.serializer.UnknownClass.UnknownStruct;
+import org.apache.fory.serializer.UnknownClassSerializers;
 import org.apache.fory.serializer.UnsignedSerializers;
 import org.apache.fory.serializer.collection.ChildContainerSerializers;
 import org.apache.fory.serializer.collection.CollectionSerializer;
@@ -343,13 +342,13 @@ public class ClassResolver extends TypeResolver {
     if (fory.getConfig().registerGuavaTypes()) {
       GuavaCollectionSerializers.registerDefaultSerializers(fory);
     }
-    if (fory.getConfig().deserializeNonexistentClass()) {
+    if (fory.getConfig().deserializeUnknownClass()) {
       if (metaContextShareEnabled) {
-        registerInternal(NonexistentMetaShared.class, NONEXISTENT_META_SHARED_ID);
+        registerInternal(UnknownStruct.class, NONEXISTENT_META_SHARED_ID);
         registerInternalSerializer(
-            NonexistentMetaShared.class, new NonexistentClassSerializer(fory, null));
+            UnknownStruct.class, new UnknownClassSerializers.UnknownStructSerializer(fory, null));
       } else {
-        registerInternal(NonexistentSkip.class);
+        registerInternal(UnknownEmptyStruct.class);
       }
     }
   }
@@ -1218,8 +1217,8 @@ public class ClassResolver extends TypeResolver {
           return serializer.getClass();
         }
       }
-      if (NonexistentClass.isNonexistent(cls)) {
-        return NonexistentClassSerializers.getSerializer(fory, "Unknown", cls).getClass();
+      if (UnknownClass.isUnknowClass(cls)) {
+        return UnknownClassSerializers.getSerializer(fory, "Unknown", cls).getClass();
       }
       if (cls.isArray()) {
         return ArraySerializers.ObjectArraySerializer.class;
@@ -1686,7 +1685,8 @@ public class ClassResolver extends TypeResolver {
   protected TypeDef buildTypeDef(TypeInfo typeInfo) {
     TypeDef typeDef;
     Serializer<?> serializer = typeInfo.serializer;
-    Preconditions.checkArgument(serializer.getClass() != NonexistentClassSerializer.class);
+    Preconditions.checkArgument(
+        serializer.getClass() != UnknownClassSerializers.UnknownStructSerializer.class);
     if (needToWriteTypeDef(serializer)) {
       typeDef = typeDefMap.computeIfAbsent(typeInfo.cls, cls -> TypeDef.buildTypeDef(fory, cls));
     } else {
@@ -1850,9 +1850,9 @@ public class ClassResolver extends TypeResolver {
             null,
             typeId,
             INVALID_USER_TYPE_ID);
-    if (NonexistentClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(cls))) {
+    if (UnknownClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(cls))) {
       typeInfo.serializer =
-          NonexistentClassSerializers.getSerializer(fory, classSpec.entireClassName, cls);
+          UnknownClassSerializers.getSerializer(fory, classSpec.entireClassName, cls);
     } else {
       // don't create serializer here, if the class is an interface,
       // there won't be serializer since interface has no instance.
@@ -1875,7 +1875,7 @@ public class ClassResolver extends TypeResolver {
     if (cachedInfo != null) {
       return cachedInfo.cls;
     }
-    return loadClass(className, isEnum, arrayDims, fory.getConfig().deserializeNonexistentClass());
+    return loadClass(className, isEnum, arrayDims, fory.getConfig().deserializeUnknownClass());
   }
 
   public Class<?> getCurrentReadClass() {
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
index d55d6167b..7854601c7 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/TypeResolver.java
@@ -68,15 +68,14 @@ import org.apache.fory.reflect.TypeRef;
 import org.apache.fory.serializer.CodegenSerializer;
 import org.apache.fory.serializer.CodegenSerializer.LazyInitBeanSerializer;
 import org.apache.fory.serializer.MetaSharedSerializer;
-import org.apache.fory.serializer.NonexistentClass;
-import org.apache.fory.serializer.NonexistentClass.NonexistentMetaShared;
-import org.apache.fory.serializer.NonexistentClass.NonexistentSkip;
-import org.apache.fory.serializer.NonexistentClassSerializers;
-import org.apache.fory.serializer.NonexistentClassSerializers.NonexistentClassSerializer;
 import org.apache.fory.serializer.ObjectSerializer;
 import org.apache.fory.serializer.Serializer;
 import org.apache.fory.serializer.SerializerFactory;
 import org.apache.fory.serializer.Serializers;
+import org.apache.fory.serializer.UnknownClass;
+import org.apache.fory.serializer.UnknownClass.UnknownEmptyStruct;
+import org.apache.fory.serializer.UnknownClass.UnknownStruct;
+import org.apache.fory.serializer.UnknownClassSerializers;
 import org.apache.fory.type.Descriptor;
 import org.apache.fory.type.DescriptorBuilder;
 import org.apache.fory.type.DescriptorGrouper;
@@ -716,7 +715,7 @@ public abstract class TypeResolver {
     if (targetClass.isAssignableFrom(readClass)) {
       newTypeInfo = typeInfo;
     } else {
-      // similar to create serializer for `NonexistentMetaShared`
+      // similar to create serializer for `UnknownStruct`
       newTypeInfo =
           getMetaSharedTypeInfo(
               typeInfo.typeDef.replaceRootClassTo(this, targetClass), targetClass);
@@ -816,10 +815,10 @@ public abstract class TypeResolver {
     }
     Class<?> cls = loadClass(typeDef.getClassSpec());
     // For nonexistent classes, always create a new TypeInfo with the correct typeDef,
-    // even if the typeDef has no fields meta. This ensures the NonexistentClassSerializer
+    // even if the typeDef has no fields meta. This ensures the UnknownStructSerializer
     // has access to the typeDef for proper deserialization.
     if (!typeDef.hasFieldsMeta()
-        && !NonexistentClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(cls))) {
+        && !UnknownClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(cls))) {
       typeInfo = getTypeInfo(cls);
     } else if (ClassResolver.useReplaceResolveSerializer(cls)) {
       // For classes with writeReplace/readResolve, use their natural serializer
@@ -837,8 +836,8 @@ public abstract class TypeResolver {
   // TODO(chaokunyang) if TypeDef is consistent with class in this process,
   //  use existing serializer instead.
   private TypeInfo getMetaSharedTypeInfo(TypeDef typeDef, Class<?> clz) {
-    if (clz == NonexistentSkip.class) {
-      clz = NonexistentMetaShared.class;
+    if (clz == UnknownEmptyStruct.class) {
+      clz = UnknownStruct.class;
     }
     Class<?> cls = clz;
     Integer classId = extRegistry.registeredClassIdMap.get(cls);
@@ -859,17 +858,18 @@ public abstract class TypeResolver {
     }
     TypeInfo typeInfo = new TypeInfo(this, cls, null, typeId, typeDef.getClassSpec().userTypeId);
     typeInfo.typeDef = typeDef;
-    if (NonexistentClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(cls))) {
-      if (cls == NonexistentMetaShared.class) {
-        typeInfo.setSerializer(this, new NonexistentClassSerializer(fory, typeDef));
-        // Ensure NonexistentMetaShared is registered so writeTypeInfo emits a placeholder typeId
-        // that NonexistentClassSerializer can rewrite to the original typeId.
+    if (UnknownClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(cls))) {
+      if (cls == UnknownStruct.class) {
+        typeInfo.setSerializer(
+            this, new UnknownClassSerializers.UnknownStructSerializer(fory, typeDef));
+        // Ensure UnknownStruct is registered so writeTypeInfo emits a placeholder typeId
+        // that UnknownStructSerializer can rewrite to the original typeId.
         if (!fory.isCrossLanguage()) {
           Preconditions.checkNotNull(classId);
         }
       } else {
         typeInfo.serializer =
-            NonexistentClassSerializers.getSerializer(fory, typeDef.getClassName(), cls);
+            UnknownClassSerializers.getSerializer(fory, typeDef.getClassName(), cls);
       }
       return typeInfo;
     }
@@ -946,7 +946,7 @@ public abstract class TypeResolver {
   }
 
   final Class<?> loadClass(String className, boolean isEnum, int arrayDims) {
-    return loadClass(className, isEnum, arrayDims, fory.getConfig().deserializeNonexistentClass());
+    return loadClass(className, isEnum, arrayDims, fory.getConfig().deserializeUnknownClass());
   }
 
   final Class<?> loadClass(String className) {
@@ -954,7 +954,7 @@ public abstract class TypeResolver {
   }
 
   final Class<?> loadClass(
-      String className, boolean isEnum, int arrayDims, boolean deserializeNonexistentClass) {
+      String className, boolean isEnum, int arrayDims, boolean deserializeUnknownClass) {
     extRegistry.typeChecker.checkType(this, className);
     Class<?> cls = extRegistry.registeredClasses.get(className);
     if (cls != null) {
@@ -970,10 +970,9 @@ public abstract class TypeResolver {
             String.format(
                 "Class %s not found from classloaders [%s, %s]",
                 className, fory.getClassLoader(), Thread.currentThread().getContextClassLoader());
-        if (deserializeNonexistentClass) {
+        if (deserializeUnknownClass) {
           LOG.warn(msg);
-          return NonexistentClass.getNonexistentClass(
-              className, isEnum, arrayDims, metaContextShareEnabled);
+          return UnknownClass.getUnknowClass(className, isEnum, arrayDims, metaContextShareEnabled);
         }
         throw new IllegalStateException(msg, ex);
       }
@@ -1182,7 +1181,7 @@ public abstract class TypeResolver {
   }
 
   public final boolean isMap(Class<?> cls) {
-    if (cls == NonexistentMetaShared.class) {
+    if (cls == UnknownStruct.class) {
       return false;
     }
     return Map.class.isAssignableFrom(cls)
diff --git a/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java b/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java
index c6103866c..6fb681b08 100644
--- a/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java
+++ b/java/fory-core/src/main/java/org/apache/fory/resolver/XtypeResolver.java
@@ -83,11 +83,6 @@ import org.apache.fory.serializer.ArraySerializers;
 import org.apache.fory.serializer.DeferedLazySerializer;
 import org.apache.fory.serializer.DeferedLazySerializer.DeferredLazyObjectSerializer;
 import org.apache.fory.serializer.EnumSerializer;
-import org.apache.fory.serializer.NonexistentClass;
-import org.apache.fory.serializer.NonexistentClass.NonexistentEnum;
-import org.apache.fory.serializer.NonexistentClass.NonexistentMetaShared;
-import org.apache.fory.serializer.NonexistentClassSerializers;
-import org.apache.fory.serializer.NonexistentClassSerializers.NonexistentClassSerializer;
 import org.apache.fory.serializer.ObjectSerializer;
 import org.apache.fory.serializer.PrimitiveSerializers;
 import org.apache.fory.serializer.SerializationUtils;
@@ -96,6 +91,11 @@ import org.apache.fory.serializer.Serializers;
 import org.apache.fory.serializer.StringSerializer;
 import org.apache.fory.serializer.TimeSerializers;
 import org.apache.fory.serializer.UnionSerializer;
+import org.apache.fory.serializer.UnknownClass;
+import org.apache.fory.serializer.UnknownClass.UnknownEnum;
+import org.apache.fory.serializer.UnknownClass.UnknownStruct;
+import org.apache.fory.serializer.UnknownClassSerializers;
+import org.apache.fory.serializer.UnknownClassSerializers.UnknownStructSerializer;
 import org.apache.fory.serializer.UnsignedSerializers;
 import org.apache.fory.serializer.collection.CollectionLikeSerializer;
 import org.apache.fory.serializer.collection.CollectionSerializer;
@@ -158,14 +158,8 @@ public class XtypeResolver extends TypeResolver {
   public void initialize() {
     registerDefaultTypes();
     if (shareMeta) {
-      Serializer serializer = new NonexistentClassSerializer(fory, null);
-      register(
-          NonexistentMetaShared.class,
-          serializer,
-          "",
-          "unknown_struct",
-          Types.COMPATIBLE_STRUCT,
-          -1);
+      Serializer serializer = new UnknownStructSerializer(fory, null);
+      register(UnknownStruct.class, serializer, "", "unknown_struct", Types.COMPATIBLE_STRUCT, -1);
     }
   }
 
@@ -589,7 +583,7 @@ public class XtypeResolver extends TypeResolver {
         if (Union.class.isAssignableFrom(rawType)) {
           return true;
         }
-        if (rawType == NonexistentMetaShared.class) {
+        if (rawType == UnknownStruct.class) {
           return false;
         }
         byte typeIdByte = getInternalTypeId(rawType);
@@ -614,10 +608,10 @@ public class XtypeResolver extends TypeResolver {
     if (clz.isArray()) {
       return true;
     }
-    if (clz == NonexistentEnum.class) {
+    if (clz == UnknownEnum.class) {
       return true;
     }
-    if (clz == NonexistentMetaShared.class) {
+    if (clz == UnknownStruct.class) {
       return false;
     }
     TypeInfo typeInfo = getTypeInfo(clz, false);
@@ -644,7 +638,7 @@ public class XtypeResolver extends TypeResolver {
       return true;
     }
     byte typeIdByte = getInternalTypeId(descriptor);
-    if (NonexistentClass.class.isAssignableFrom(rawType)) {
+    if (UnknownClass.class.isAssignableFrom(rawType)) {
       return false;
     }
     return !Types.isUserDefinedType(typeIdByte) && typeIdByte != Types.UNKNOWN;
@@ -733,8 +727,8 @@ public class XtypeResolver extends TypeResolver {
         }
       }
       typeId = Types.MAP;
-    } else if (NonexistentClass.class.isAssignableFrom(cls)) {
-      serializer = NonexistentClassSerializers.getSerializer(fory, "Unknown", cls);
+    } else if (UnknownClass.class.isAssignableFrom(cls)) {
+      serializer = UnknownClassSerializers.getSerializer(fory, "Unknown", cls);
       if (cls.isEnum()) {
         typeId = Types.ENUM;
       } else {
@@ -1128,14 +1122,14 @@ public class XtypeResolver extends TypeResolver {
     if (typeInfo == null) {
       String msg = String.format("Class %s not registered", qualifiedName);
       Class<?> type = null;
-      if (config.deserializeNonexistentClass()) {
+      if (config.deserializeUnknownClass()) {
         LOG.warn(msg);
         switch (typeId) {
           case Types.NAMED_ENUM:
           case Types.NAMED_STRUCT:
           case Types.NAMED_COMPATIBLE_STRUCT:
             type =
-                NonexistentClass.getNonexistentClass(
+                UnknownClass.getUnknowClass(
                     qualifiedName, isEnum(typeId), 0, config.isMetaShareEnabled());
             break;
           case Types.NAMED_EXT:
@@ -1159,8 +1153,8 @@ public class XtypeResolver extends TypeResolver {
               null,
               NOT_SUPPORT_XLANG,
               INVALID_USER_TYPE_ID);
-      if (NonexistentClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(type))) {
-        typeInfo.serializer = NonexistentClassSerializers.getSerializer(fory, qualifiedName, type);
+      if (UnknownClass.class.isAssignableFrom(TypeUtils.getComponentIfArray(type))) {
+        typeInfo.serializer = UnknownClassSerializers.getSerializer(fory, qualifiedName, type);
       }
     }
     compositeClassNameBytes2TypeInfo.put(typeNameBytes, typeInfo);
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java
index 2cf1e7469..db9ba2b50 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/ArraySerializers.java
@@ -1031,12 +1031,11 @@ public class ArraySerializers {
     return new PrimitiveArrayBufferObject(array, Platform.BYTE_ARRAY_OFFSET, 1, array.length);
   }
 
-  public abstract static class AbstractedNonexistentArrayClassSerializer extends Serializer {
+  public abstract static class AbstractUnknownArraySerializer extends Serializer {
     protected final String className;
     private final int dims;
 
-    public AbstractedNonexistentArrayClassSerializer(
-        Fory fory, String className, Class<?> stubClass) {
+    public AbstractUnknownArraySerializer(Fory fory, String className, Class<?> stubClass) {
       super(fory, stubClass);
       this.className = className;
       this.dims = TypeUtils.getArrayDimensions(stubClass);
@@ -1148,22 +1147,20 @@ public class ArraySerializers {
   }
 
   @SuppressWarnings("rawtypes")
-  public static final class NonexistentArrayClassSerializer
-      extends AbstractedNonexistentArrayClassSerializer {
+  public static final class UnknownArraySerializer extends AbstractUnknownArraySerializer {
     private final Serializer componentSerializer;
 
-    public NonexistentArrayClassSerializer(Fory fory, Class<?> cls) {
+    public UnknownArraySerializer(Fory fory, Class<?> cls) {
       this(fory, "Unknown", cls);
     }
 
-    public NonexistentArrayClassSerializer(Fory fory, String className, Class<?> cls) {
+    public UnknownArraySerializer(Fory fory, String className, Class<?> cls) {
       super(fory, className, cls);
       if (TypeUtils.getArrayComponent(cls).isEnum()) {
-        componentSerializer = new NonexistentClassSerializers.NonexistentEnumClassSerializer(fory);
+        componentSerializer = new UnknownClassSerializers.UnknownEnumSerializer(fory);
       } else {
         if (fory.getConfig().getCompatibleMode() == CompatibleMode.COMPATIBLE) {
-          componentSerializer =
-              new ObjectSerializer<>(fory, NonexistentClass.NonexistentSkip.class);
+          componentSerializer = new ObjectSerializer<>(fory, UnknownClass.UnknownEmptyStruct.class);
         } else {
           componentSerializer = null;
         }
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/EnumSerializer.java b/java/fory-core/src/main/java/org/apache/fory/serializer/EnumSerializer.java
index cc0a69136..e0c4d180b 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/EnumSerializer.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/EnumSerializer.java
@@ -90,11 +90,11 @@ public class EnumSerializer extends ImmutableSerializer<Enum> {
       if (e != null) {
         return e;
       }
-      return handleNonexistentEnumValue(metaStringBytes.decode(Encoders.GENERIC_DECODER));
+      return handleUnknownEnumValue(metaStringBytes.decode(Encoders.GENERIC_DECODER));
     } else {
       int value = buffer.readVarUint32Small7();
       if (value >= enumConstants.length) {
-        return handleNonexistentEnumValue(value);
+        return handleUnknownEnumValue(value);
       }
       return enumConstants[value];
     }
@@ -109,12 +109,12 @@ public class EnumSerializer extends ImmutableSerializer<Enum> {
   public Enum xread(MemoryBuffer buffer) {
     int value = buffer.readVarUint32Small7();
     if (value >= enumConstants.length) {
-      return handleNonexistentEnumValue(value);
+      return handleUnknownEnumValue(value);
     }
     return enumConstants[value];
   }
 
-  private Enum handleNonexistentEnumValue(int value) {
+  private Enum handleUnknownEnumValue(int value) {
     switch (fory.getConfig().getUnknownEnumValueStrategy()) {
       case RETURN_NULL:
         return null;
@@ -128,7 +128,7 @@ public class EnumSerializer extends ImmutableSerializer<Enum> {
     }
   }
 
-  private Enum handleNonexistentEnumValue(String value) {
+  private Enum handleUnknownEnumValue(String value) {
     switch (fory.getConfig().getUnknownEnumValueStrategy()) {
       case RETURN_NULL:
         return null;
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/NonexistentClass.java b/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClass.java
similarity index 63%
rename from java/fory-core/src/main/java/org/apache/fory/serializer/NonexistentClass.java
rename to java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClass.java
index 6cf332b7f..7c84ca187 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/NonexistentClass.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClass.java
@@ -31,10 +31,10 @@ import org.apache.fory.type.TypeUtils;
  *
  * @see Config#isMetaShareEnabled()
  */
-public interface NonexistentClass {
+public interface UnknownClass {
   // @formatter:off
 
-  enum NonexistentEnum implements NonexistentClass {
+  enum UnknownEnum implements UnknownClass {
     V0,
     V1,
     V2,
@@ -103,49 +103,49 @@ public interface NonexistentClass {
   }
 
   /** Ensure no fields here to avoid conflicts with peer class fields. */
-  class NonexistentSkip implements NonexistentClass {}
+  class UnknownEmptyStruct implements UnknownClass {}
 
-  class NonexistentMetaShared extends LazyMap implements NonexistentClass {
+  class UnknownStruct extends LazyMap implements UnknownClass {
     final TypeDef typeDef;
 
-    public NonexistentMetaShared(TypeDef typeDef) {
+    public UnknownStruct(TypeDef typeDef) {
       this.typeDef = typeDef;
     }
   }
 
-  Class<?> NonexistentEnum1DArray = NonexistentEnum[].class;
-  Class<?> NonexistentEnum2DArray = NonexistentEnum[][].class;
-  Class<?> NonexistentEnum3DArray = NonexistentEnum[][][].class;
-  Class<?> NonexistentSkip1DArray = NonexistentSkip[].class;
-  Class<?> NonexistentSkip2DArray = NonexistentSkip[][].class;
-  Class<?> NonexistentSkip3DArray = NonexistentSkip[][][].class;
-  Class<?> Nonexistent1DArray = NonexistentMetaShared[].class;
-  Class<?> Nonexistent2DArray = NonexistentMetaShared[][].class;
-  Class<?> Nonexistent3DArray = NonexistentMetaShared[][][].class;
+  Class<?> UnknownEnum1DArray = UnknownEnum[].class;
+  Class<?> UnknownEnum2DArray = UnknownEnum[][].class;
+  Class<?> UnknownEnum3DArray = UnknownEnum[][][].class;
+  Class<?> UnknownEmptyStruct1DArray = UnknownEmptyStruct[].class;
+  Class<?> UnknownEmptyStruct2DArray = UnknownEmptyStruct[][].class;
+  Class<?> UnknownEmptyStruct3DArray = UnknownEmptyStruct[][][].class;
+  Class<?> UnknownStruct1DArray = UnknownStruct[].class;
+  Class<?> UnknownStruct2DArray = UnknownStruct[][].class;
+  Class<?> UnknownStruct3DArray = UnknownStruct[][][].class;
 
-  static boolean isNonexistent(Class<?> cls) {
+  static boolean isUnknowClass(Class<?> cls) {
     if (cls.isArray()) {
       Class<?> component = TypeUtils.getArrayComponent(cls);
-      return NonexistentClass.class.isAssignableFrom(component);
+      return UnknownClass.class.isAssignableFrom(component);
     }
-    return NonexistentClass.class.isAssignableFrom(cls);
+    return UnknownClass.class.isAssignableFrom(cls);
   }
 
-  static Class<?> getNonexistentClass(boolean isEnum, int arrayDims, boolean shareMeta) {
-    return getNonexistentClass("Unknown", isEnum, arrayDims, shareMeta);
+  static Class<?> getUnknowClass(boolean isEnum, int arrayDims, boolean shareMeta) {
+    return getUnknowClass("Unknown", isEnum, arrayDims, shareMeta);
   }
 
-  static Class<?> getNonexistentClass(
+  static Class<?> getUnknowClass(
       String className, boolean isEnum, int arrayDims, boolean shareMeta) {
     if (arrayDims != 0) {
       if (isEnum) {
         switch (arrayDims) {
           case 1:
-            return NonexistentEnum1DArray;
+            return UnknownEnum1DArray;
           case 2:
-            return NonexistentEnum2DArray;
+            return UnknownEnum2DArray;
           case 3:
-            return NonexistentEnum3DArray;
+            return UnknownEnum3DArray;
           default:
             throw new UnsupportedOperationException(
                 String.format(
@@ -155,11 +155,11 @@ public interface NonexistentClass {
       } else {
         switch (arrayDims) {
           case 1:
-            return shareMeta ? Nonexistent1DArray : NonexistentSkip1DArray;
+            return shareMeta ? UnknownStruct1DArray : UnknownEmptyStruct1DArray;
           case 2:
-            return shareMeta ? Nonexistent2DArray : NonexistentSkip2DArray;
+            return shareMeta ? UnknownStruct2DArray : UnknownEmptyStruct2DArray;
           case 3:
-            return shareMeta ? Nonexistent3DArray : NonexistentSkip3DArray;
+            return shareMeta ? UnknownStruct3DArray : UnknownEmptyStruct3DArray;
           default:
             throw new UnsupportedOperationException(
                 String.format(
@@ -168,9 +168,9 @@ public interface NonexistentClass {
         }
       }
     } else if (isEnum) {
-      return NonexistentEnum.class;
+      return UnknownEnum.class;
     } else {
-      return shareMeta ? NonexistentMetaShared.class : NonexistentSkip.class;
+      return shareMeta ? UnknownStruct.class : UnknownEmptyStruct.class;
     }
   }
 }
diff --git a/java/fory-core/src/main/java/org/apache/fory/serializer/NonexistentClassSerializers.java b/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java
similarity index 83%
rename from java/fory-core/src/main/java/org/apache/fory/serializer/NonexistentClassSerializers.java
rename to java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java
index 6ec9d2f9f..5cd60243b 100644
--- a/java/fory-core/src/main/java/org/apache/fory/serializer/NonexistentClassSerializers.java
+++ b/java/fory-core/src/main/java/org/apache/fory/serializer/UnknownClassSerializers.java
@@ -38,8 +38,8 @@ import org.apache.fory.resolver.MetaStringResolver;
 import org.apache.fory.resolver.RefResolver;
 import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.FieldGroups.SerializationFieldInfo;
-import org.apache.fory.serializer.NonexistentClass.NonexistentEnum;
 import org.apache.fory.serializer.Serializers.CrossLanguageCompatibleSerializer;
+import org.apache.fory.serializer.UnknownClass.UnknownEnum;
 import org.apache.fory.type.Descriptor;
 import org.apache.fory.type.DescriptorGrouper;
 import org.apache.fory.type.Generics;
@@ -48,8 +48,8 @@ import org.apache.fory.util.Preconditions;
 import org.apache.fory.util.Utils;
 
 @SuppressWarnings({"rawtypes", "unchecked"})
-public final class NonexistentClassSerializers {
-  private static final Logger LOG = LoggerFactory.getLogger(NonexistentClassSerializers.class);
+public final class UnknownClassSerializers {
+  private static final Logger LOG = LoggerFactory.getLogger(UnknownClassSerializers.class);
 
   private static final class ClassFieldsInfo {
     private final SerializationFieldInfo[] buildInFields;
@@ -65,21 +65,21 @@ public final class NonexistentClassSerializers {
     }
   }
 
-  public static final class NonexistentClassSerializer extends Serializer {
+  public static final class UnknownStructSerializer extends Serializer {
     private static final int NONEXISTENT_META_SHARED_ID_SIZE =
         computeVarUint32Size(ClassResolver.NONEXISTENT_META_SHARED_ID);
     private final TypeDef typeDef;
     private final LongMap<ClassFieldsInfo> fieldsInfoMap;
     private final SerializationBinding binding;
 
-    public NonexistentClassSerializer(Fory fory, TypeDef typeDef) {
-      super(fory, NonexistentClass.NonexistentMetaShared.class);
+    public UnknownStructSerializer(Fory fory, TypeDef typeDef) {
+      super(fory, UnknownClass.UnknownStruct.class);
       this.typeDef = typeDef;
       fieldsInfoMap = new LongMap<>();
       binding = SerializationBinding.createBinding(fory);
       Preconditions.checkArgument(fory.getConfig().isMetaShareEnabled());
       if (Utils.DEBUG_OUTPUT_ENABLED && typeDef != null) {
-        LOG.info("========== NonexistentClassSerializer TypeDef for {} ==========", type.getName());
+        LOG.info("========== UnknownClassSerializer TypeDef for {} ==========", type.getName());
         LOG.info("TypeDef fieldsInfo count: {}", typeDef.getFieldCount());
         for (int i = 0; i < typeDef.getFieldsInfo().size(); i++) {
           LOG.info("  [{}] {}", i, typeDef.getFieldsInfo().get(i));
@@ -88,15 +88,15 @@ public final class NonexistentClassSerializers {
     }
 
     /**
-     * Multiple un existed class will correspond to this `NonexistentMetaSharedClass`. When querying
-     * classinfo by `class`, it may dispatch to same `NonexistentClassSerializer`, so we can't use
-     * `typeDef` in this serializer, but use `typeDef` in `NonexistentMetaSharedClass` instead.
+     * Multiple un existed class will correspond to this `UnknownStruct`. When querying classinfo by
+     * `class`, it may dispatch to same `UnknownClassSerializer`, so we can't use `typeDef` in this
+     * serializer, but use `typeDef` in `UnknownStruct` instead.
      *
-     * <p>NonexistentMetaShared is registered with a fixed internal typeId for dispatch. This
-     * serializer rewinds that placeholder typeId and writes the original class's typeId, then
-     * writes the shared TypeDef inline using the stream meta protocol.
+     * <p>UnknownStruct is registered with a fixed internal typeId for dispatch. This serializer
+     * rewinds that placeholder typeId and writes the original class's typeId, then writes the
+     * shared TypeDef inline using the stream meta protocol.
      */
-    private void writeTypeDef(MemoryBuffer buffer, NonexistentClass.NonexistentMetaShared value) {
+    private void writeTypeDef(MemoryBuffer buffer, UnknownClass.UnknownStruct value) {
       MetaContext metaContext = fory.getSerializationContext().getMetaContext();
       IdentityObjectIntMap classMap = metaContext.classMap;
       int newId = classMap.size;
@@ -143,7 +143,7 @@ public final class NonexistentClassSerializers {
 
     @Override
     public void write(MemoryBuffer buffer, Object v) {
-      NonexistentClass.NonexistentMetaShared value = (NonexistentClass.NonexistentMetaShared) v;
+      UnknownClass.UnknownStruct value = (UnknownClass.UnknownStruct) v;
       int typeId = resolveTypeId(value.typeDef);
       int userTypeId = value.typeDef.isNamed() ? -1 : value.typeDef.getUserTypeId();
       int typeIdSize = 1;
@@ -204,10 +204,10 @@ public final class NonexistentClassSerializers {
       ClassFieldsInfo fieldsInfo = fieldsInfoMap.get(typeDef.getId());
       TypeResolver resolver = getTypeResolver(fory);
       if (fieldsInfo == null) {
-        // Use `NonexistentSkipClass` since it doesn't have any field.
+        // Use `UnknownEmptyStruct` since it doesn't have any field.
         Collection<Descriptor> descriptors =
             MetaSharedSerializer.consolidateFields(
-                resolver, NonexistentClass.NonexistentSkip.class, typeDef);
+                resolver, UnknownClass.UnknownEmptyStruct.class, typeDef);
         DescriptorGrouper grouper =
             fory.getClassResolver().createDescriptorGrouper(descriptors, false);
         FieldGroups fieldGroups = FieldGroups.buildFieldInfos(fory, grouper);
@@ -223,8 +223,7 @@ public final class NonexistentClassSerializers {
 
     @Override
     public Object read(MemoryBuffer buffer) {
-      NonexistentClass.NonexistentMetaShared obj =
-          new NonexistentClass.NonexistentMetaShared(typeDef);
+      UnknownClass.UnknownStruct obj = new UnknownClass.UnknownStruct(typeDef);
       Fory fory = this.fory;
       RefResolver refResolver = fory.getRefResolver();
       refResolver.reference(obj);
@@ -261,20 +260,19 @@ public final class NonexistentClassSerializers {
     }
   }
 
-  public static final class NonexistentEnumClassSerializer
-      extends CrossLanguageCompatibleSerializer {
-    private final NonexistentEnum[] enumConstants;
+  public static final class UnknownEnumSerializer extends CrossLanguageCompatibleSerializer {
+    private final UnknownEnum[] enumConstants;
     private final MetaStringResolver metaStringResolver;
 
-    public NonexistentEnumClassSerializer(Fory fory) {
-      super(fory, NonexistentEnum.class);
+    public UnknownEnumSerializer(Fory fory) {
+      super(fory, UnknownEnum.class);
       metaStringResolver = fory.getMetaStringResolver();
-      enumConstants = NonexistentEnum.class.getEnumConstants();
+      enumConstants = UnknownEnum.class.getEnumConstants();
     }
 
     @Override
     public void write(MemoryBuffer buffer, Object value) {
-      NonexistentEnum enumValue = (NonexistentEnum) value;
+      UnknownEnum enumValue = (UnknownEnum) value;
       buffer.writeVarUint32Small7(enumValue.ordinal());
     }
 
@@ -282,12 +280,12 @@ public final class NonexistentClassSerializers {
     public Object read(MemoryBuffer buffer) {
       if (fory.getConfig().serializeEnumByName()) {
         metaStringResolver.readMetaStringBytes(buffer);
-        return NonexistentEnum.UNKNOWN;
+        return UnknownEnum.UNKNOWN;
       }
 
       int ordinal = buffer.readVarUint32Small7();
       if (ordinal >= enumConstants.length) {
-        return NonexistentEnum.UNKNOWN;
+        return UnknownEnum.UNKNOWN;
       }
       return enumConstants[ordinal];
     }
@@ -295,10 +293,10 @@ public final class NonexistentClassSerializers {
 
   public static Serializer getSerializer(Fory fory, String className, Class<?> cls) {
     if (cls.isArray()) {
-      return new ArraySerializers.NonexistentArrayClassSerializer(fory, className, cls);
+      return new ArraySerializers.UnknownArraySerializer(fory, className, cls);
     } else {
       if (cls.isEnum()) {
-        return new NonexistentEnumClassSerializer(fory);
+        return new UnknownEnumSerializer(fory);
       } else {
         if (fory.getConfig().isMetaShareEnabled()) {
           throw new IllegalStateException(
diff --git a/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java b/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java
index a8820435f..5896cbbca 100644
--- a/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java
+++ b/java/fory-core/src/main/java/org/apache/fory/type/TypeUtils.java
@@ -87,7 +87,7 @@ import org.apache.fory.meta.TypeExtMeta;
 import org.apache.fory.reflect.ReflectionUtils;
 import org.apache.fory.reflect.TypeParameter;
 import org.apache.fory.reflect.TypeRef;
-import org.apache.fory.serializer.NonexistentClass;
+import org.apache.fory.serializer.UnknownClass;
 import org.apache.fory.util.Preconditions;
 import org.apache.fory.util.StringUtils;
 import org.apache.fory.util.record.RecordUtils;
@@ -687,7 +687,7 @@ public class TypeUtils {
   }
 
   public static boolean isMap(Class<?> cls) {
-    if (cls == NonexistentClass.NonexistentMetaShared.class) {
+    if (cls == UnknownClass.UnknownStruct.class) {
       return false;
     }
     return cls == HashMap.class || Map.class.isAssignableFrom(cls);
diff --git a/java/fory-core/src/main/java/org/apache/fory/type/Types.java b/java/fory-core/src/main/java/org/apache/fory/type/Types.java
index 21620cd59..2e7968a3e 100644
--- a/java/fory-core/src/main/java/org/apache/fory/type/Types.java
+++ b/java/fory-core/src/main/java/org/apache/fory/type/Types.java
@@ -78,135 +78,147 @@ public class Types {
   /** tagged_uint64: a 64-bit unsigned integer which uses fory tagged int64 encoding. */
   public static final int TAGGED_UINT64 = 15;
 
+  /** float8: an 8-bit floating point number. */
+  public static final int FLOAT8 = 16;
+
   /** float16: a 16-bit floating point number. */
-  public static final int FLOAT16 = 16;
+  public static final int FLOAT16 = 17;
+
+  /** bfloat16: a 16-bit brain floating point number. */
+  public static final int BFLOAT16 = 18;
 
   /** float32: a 32-bit floating point number. */
-  public static final int FLOAT32 = 17;
+  public static final int FLOAT32 = 19;
 
   /** float64: a 64-bit floating point number including NaN and Infinity. */
-  public static final int FLOAT64 = 18;
+  public static final int FLOAT64 = 20;
 
   /** string: a text string encoded using Latin1/UTF16/UTF-8 encoding. */
-  public static final int STRING = 19;
+  public static final int STRING = 21;
 
   /** A sequence of objects. */
-  public static final int LIST = 20;
+  public static final int LIST = 22;
 
   /** An unordered set of unique elements. */
-  public static final int SET = 21;
+  public static final int SET = 23;
 
   /**
    * A map of key-value pairs. Mutable types such as `list/map/set/array/tensor/arrow` are not
    * allowed as key of map.
    */
-  public static final int MAP = 22;
+  public static final int MAP = 24;
 
   /** enum: a data type consisting of a set of named values. */
-  public static final int ENUM = 23;
+  public static final int ENUM = 25;
 
   /** named_enum: an enum whose value will be serialized as the registered name. */
-  public static final int NAMED_ENUM = 24;
+  public static final int NAMED_ENUM = 26;
 
   /**
    * A morphic(final) type serialized by Fory Struct serializer. i.e. it doesn't have subclasses.
    * Suppose we're deserializing {@code List<SomeClass>}, we can save dynamic serializer dispatch
    * since `SomeClass` is morphic(final).
    */
-  public static final int STRUCT = 25;
+  public static final int STRUCT = 27;
 
   /** A morphic(final) type serialized by Fory compatible Struct serializer. */
-  public static final int COMPATIBLE_STRUCT = 26;
+  public static final int COMPATIBLE_STRUCT = 28;
 
   /** A `struct` whose type mapping will be encoded as a name. */
-  public static final int NAMED_STRUCT = 27;
+  public static final int NAMED_STRUCT = 29;
 
   /** A `compatible_struct` whose type mapping will be encoded as a name. */
-  public static final int NAMED_COMPATIBLE_STRUCT = 28;
+  public static final int NAMED_COMPATIBLE_STRUCT = 30;
 
   /** A type which will be serialized by a customized serializer. */
-  public static final int EXT = 29;
+  public static final int EXT = 31;
 
   /** An `ext` type whose type mapping will be encoded as a name. */
-  public static final int NAMED_EXT = 30;
+  public static final int NAMED_EXT = 32;
 
   /** A tagged union value whose schema identity is not embedded. */
-  public static final int UNION = 31;
+  public static final int UNION = 33;
 
   /** A union value with embedded numeric union type ID. */
-  public static final int TYPED_UNION = 32;
+  public static final int TYPED_UNION = 34;
 
   /** A union value with embedded union type name/TypeDef. */
-  public static final int NAMED_UNION = 33;
+  public static final int NAMED_UNION = 35;
 
   /** Represents an empty/unit value with no data (e.g., for empty union alternatives). */
-  public static final int NONE = 34;
+  public static final int NONE = 36;
 
   /**
    * An absolute length of time, independent of any calendar/timezone, as a count of nanoseconds.
    */
-  public static final int DURATION = 35;
+  public static final int DURATION = 37;
 
   /**
    * A point in time, independent of any calendar/timezone, as a count of nanoseconds. The count is
    * relative to an epoch at UTC midnight on January 1, 1970.
    */
-  public static final int TIMESTAMP = 36;
+  public static final int TIMESTAMP = 38;
 
   /**
    * A naive date without timezone. The count is days relative to an epoch at UTC midnight on Jan 1,
    * 1970.
    */
-  public static final int DATE = 37;
+  public static final int DATE = 39;
 
   /** Exact decimal value represented as an integer value in two's complement. */
-  public static final int DECIMAL = 38;
+  public static final int DECIMAL = 40;
 
   /** A variable-length array of bytes. */
-  public static final int BINARY = 39;
+  public static final int BINARY = 41;
 
   /**
    * A multidimensional array where every sub-array can have different sizes but all have the same
    * type. Only numeric components allowed. Other arrays will be taken as List. The implementation
    * should support interoperability between array and list.
    */
-  public static final int ARRAY = 40;
+  public static final int ARRAY = 42;
 
   /** One dimensional bool array. */
-  public static final int BOOL_ARRAY = 41;
+  public static final int BOOL_ARRAY = 43;
 
   /** One dimensional int8 array. */
-  public static final int INT8_ARRAY = 42;
+  public static final int INT8_ARRAY = 44;
 
   /** One dimensional int16 array. */
-  public static final int INT16_ARRAY = 43;
+  public static final int INT16_ARRAY = 45;
 
   /** One dimensional int32 array. */
-  public static final int INT32_ARRAY = 44;
+  public static final int INT32_ARRAY = 46;
 
   /** One dimensional int64 array. */
-  public static final int INT64_ARRAY = 45;
+  public static final int INT64_ARRAY = 47;
 
   /** One dimensional uint8 array. */
-  public static final int UINT8_ARRAY = 46;
+  public static final int UINT8_ARRAY = 48;
 
   /** One dimensional uint16 array. */
-  public static final int UINT16_ARRAY = 47;
+  public static final int UINT16_ARRAY = 49;
 
   /** One dimensional uint32 array. */
-  public static final int UINT32_ARRAY = 48;
+  public static final int UINT32_ARRAY = 50;
 
   /** One dimensional uint64 array. */
-  public static final int UINT64_ARRAY = 49;
+  public static final int UINT64_ARRAY = 51;
+
+  /** One dimensional float8 array. */
+  public static final int FLOAT8_ARRAY = 52;
 
   /** One dimensional float16 array. */
-  public static final int FLOAT16_ARRAY = 50;
+  public static final int FLOAT16_ARRAY = 53;
+
+  /** One dimensional bfloat16 array. */
+  public static final int BFLOAT16_ARRAY = 54;
 
   /** One dimensional float32 array. */
-  public static final int FLOAT32_ARRAY = 51;
+  public static final int FLOAT32_ARRAY = 55;
 
   /** One dimensional float64 array. */
-  public static final int FLOAT64_ARRAY = 52;
+  public static final int FLOAT64_ARRAY = 56;
 
   /** Bound value for range checks (types with id >= BOUND are not internal types). */
   public static final int BOUND = 64;
@@ -288,7 +300,9 @@ public class Types {
       case UINT16_ARRAY:
       case UINT32_ARRAY:
       case UINT64_ARRAY:
+      case FLOAT8_ARRAY:
       case FLOAT16_ARRAY:
+      case BFLOAT16_ARRAY:
       case FLOAT32_ARRAY:
       case FLOAT64_ARRAY:
         return true;
@@ -319,8 +333,12 @@ public class Types {
         return UINT32_ARRAY;
       case UINT64:
         return UINT64_ARRAY;
+      case FLOAT8:
+        return FLOAT8_ARRAY;
       case FLOAT16:
         return FLOAT16_ARRAY;
+      case BFLOAT16:
+        return BFLOAT16_ARRAY;
       case FLOAT32:
         return FLOAT32_ARRAY;
       case FLOAT64:
@@ -429,7 +447,9 @@ public class Types {
       case VAR_UINT64:
       case TAGGED_UINT64:
         return Long.class;
+      case FLOAT8:
       case FLOAT16:
+      case BFLOAT16:
       case FLOAT32:
         return Float.class;
       case FLOAT64:
diff --git a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
index e024cb221..8c7dd27af 100644
--- a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
+++ b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
@@ -353,10 +353,10 @@ Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
     org.apache.fory.serializer.LazySerializer$LazyObjectSerializer,\
     org.apache.fory.serializer.CodegenSerializer$LazyInitBeanSerializer,\
     org.apache.fory.serializer.NoneSerializer,\
-    org.apache.fory.serializer.NonexistentClassSerializers,\
-    org.apache.fory.serializer.NonexistentClassSerializers$ClassFieldsInfo,\
-    org.apache.fory.serializer.NonexistentClassSerializers$NonexistentClassSerializer,\
-    org.apache.fory.serializer.NonexistentClassSerializers$NonexistentEnumClassSerializer,\
+    org.apache.fory.serializer.UnknownClassSerializers,\
+    org.apache.fory.serializer.UnknownClassSerializers$ClassFieldsInfo,\
+    org.apache.fory.serializer.UnknownClassSerializers$UnknownStructSerializer,\
+    org.apache.fory.serializer.UnknownClassSerializers$UnknownEnumSerializer,\
     org.apache.fory.serializer.OptionalSerializers$OptionalDoubleSerializer,\
     org.apache.fory.serializer.OptionalSerializers$OptionalIntSerializer,\
     org.apache.fory.serializer.OptionalSerializers$OptionalLongSerializer,\
diff --git a/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java b/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java
index 5c6eb71d0..37239374d 100644
--- a/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java
+++ b/java/fory-core/src/test/java/org/apache/fory/ForyTestBase.java
@@ -193,6 +193,33 @@ public abstract class ForyTestBase {
         Fory.builder()
             .withLanguage(Language.JAVA)
             .withRefTracking(true)
+            .withCodegen(false)
+            .requireClassRegistration(false)
+            .suppressClassRegistrationWarnings(true)
+            .build()
+      },
+      {
+        Fory.builder()
+            .withLanguage(Language.JAVA)
+            .withRefTracking(false)
+            .withCodegen(false)
+            .requireClassRegistration(false)
+            .suppressClassRegistrationWarnings(true)
+            .build()
+      },
+      {
+        Fory.builder()
+            .withLanguage(Language.JAVA)
+            .withRefTracking(true)
+            .withCodegen(true)
+            .requireClassRegistration(false)
+            .suppressClassRegistrationWarnings(true)
+            .build()
+      },
+      {
+        Fory.builder()
+            .withLanguage(Language.JAVA)
+            .withRefTracking(false)
             .withCodegen(true)
             .requireClassRegistration(false)
             .suppressClassRegistrationWarnings(true)
diff --git a/java/fory-core/src/test/java/org/apache/fory/TestUtils.java b/java/fory-core/src/test/java/org/apache/fory/TestUtils.java
index f6bf4eefa..8f834c60d 100644
--- a/java/fory-core/src/test/java/org/apache/fory/TestUtils.java
+++ b/java/fory-core/src/test/java/org/apache/fory/TestUtils.java
@@ -336,7 +336,7 @@ public class TestUtils {
 
   /**
    * Convert an object to a Map using Fory's field descriptors. The map uses qualified field names
-   * (className.fieldName) as keys to match NonexistentClass format.
+   * (className.fieldName) as keys to match UnknownClass format.
    *
    * @param fory the Fory instance
    * @param obj the object to convert
diff --git a/java/fory-core/src/test/java/org/apache/fory/resolver/SerializationContextTest.java b/java/fory-core/src/test/java/org/apache/fory/resolver/SerializationContextTest.java
index e08d10b5f..953b6aed7 100644
--- a/java/fory-core/src/test/java/org/apache/fory/resolver/SerializationContextTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/resolver/SerializationContextTest.java
@@ -29,7 +29,7 @@ public class SerializationContextTest {
 
   @Test
   public void testSerializationContext() {
-    ForyBuilder builder = new ForyBuilder().withDeserializeNonexistentClass(false);
+    ForyBuilder builder = new ForyBuilder().withDeserializeUnknownClass(false);
     builder.build(); // trigger finish
     SerializationContext context = new SerializationContext(new Config(builder));
     assertFalse(context.containsKey("A"));
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java
index 88e40dc8e..5de178451 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/EnumSerializerTest.java
@@ -102,7 +102,7 @@ public class EnumSerializerTest extends ForyTestBase {
             .withLanguage(Language.JAVA)
             .withRefTracking(true)
             .requireClassRegistration(false)
-            .deserializeNonexistentEnumValueAsNull(true)
+            .deserializeUnknownEnumValueAsNull(true)
             .withClassLoader(cls2.getClassLoader());
     Fory foryDeserialize = builderDeserialize.build();
     Fory forySerialization = builderSerialization.build();
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/MetaSharedObjectSerializerTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/MetaSharedObjectSerializerTest.java
index a64869fb7..f76ef3e4e 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/MetaSharedObjectSerializerTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/MetaSharedObjectSerializerTest.java
@@ -52,9 +52,9 @@ public class MetaSharedObjectSerializerTest extends ForyTestBase {
         builder()
             .withRefTracking(true)
             .requireClassRegistration(false)
-            .withDeserializeNonexistentClass(true)
+            .withDeserializeUnknownClass(true)
             .withCompatibleMode(CompatibleMode.COMPATIBLE)
-            .deserializeNonexistentEnumValueAsNull(true)
+            .deserializeUnknownEnumValueAsNull(true)
             .withScopedMetaShare(true)
             .withCodegen(false)
             .withClassLoader(cls1.getClassLoader())
@@ -63,9 +63,9 @@ public class MetaSharedObjectSerializerTest extends ForyTestBase {
         builder()
             .withRefTracking(true)
             .requireClassRegistration(false)
-            .withDeserializeNonexistentClass(true)
+            .withDeserializeUnknownClass(true)
             .withCompatibleMode(CompatibleMode.COMPATIBLE)
-            .deserializeNonexistentEnumValueAsNull(true)
+            .deserializeUnknownEnumValueAsNull(true)
             .withScopedMetaShare(true)
             .withCodegen(false)
             .withClassLoader(cls2.getClassLoader())
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/NonexistentClassSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/UnknownClassSerializersTest.java
similarity index 81%
rename from java/fory-core/src/test/java/org/apache/fory/serializer/NonexistentClassSerializersTest.java
rename to java/fory-core/src/test/java/org/apache/fory/serializer/UnknownClassSerializersTest.java
index bed5d922e..fede37762 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/NonexistentClassSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/UnknownClassSerializersTest.java
@@ -47,7 +47,7 @@ import org.testng.Assert;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-public class NonexistentClassSerializersTest extends ForyTestBase {
+public class UnknownClassSerializersTest extends ForyTestBase {
   @DataProvider
   public static Object[][] config() {
     return Sets.cartesianProduct(
@@ -78,11 +78,11 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
         .withCompatibleMode(CompatibleMode.COMPATIBLE)
         .requireClassRegistration(false)
         .withCodegen(false)
-        .withDeserializeNonexistentClass(true);
+        .withDeserializeUnknownClass(true);
   }
 
   @Test(dataProvider = "config")
-  public void testSkipNonexistent(
+  public void testSkipUnknown(
       boolean referenceTracking, boolean enableCodegen1, boolean enableCodegen2) {
     Fory fory =
         foryBuilder()
@@ -93,8 +93,8 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     ClassLoader classLoader = getClass().getClassLoader();
     for (Class<?> structClass :
         new Class<?>[] {
-          Struct.createNumberStructClass("TestSkipNonexistentClass1", 2),
-          Struct.createStructClass("TestSkipNonexistentClass1", 2)
+          Struct.createNumberStructClass("TestUnknownEmptyStructClass1", 2),
+          Struct.createStructClass("TestUnknownEmptyStructClass1", 2)
         }) {
       Object pojo = Struct.createPOJO(structClass);
       byte[] bytes = fory.serialize(pojo);
@@ -105,44 +105,42 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
               .withClassLoader(classLoader)
               .build();
       Object o = fory2.deserialize(bytes);
-      assertTrue(o instanceof NonexistentClass, "Unexpected type " + o.getClass());
+      assertTrue(o instanceof UnknownClass, "Unexpected type " + o.getClass());
     }
   }
 
   @Test
-  public void testNonexistentEnum() {
+  public void testUnknownEnum() {
     // Use scoped meta share for automatic MetaContext management
-    Fory fory = foryBuilder().withDeserializeNonexistentClass(true).build();
+    Fory fory = foryBuilder().withDeserializeUnknownClass(true).build();
     String enumCode = ("enum TestEnum {" + " A, B" + "}");
     Class<?> cls = JaninoUtils.compileClass(getClass().getClassLoader(), "", "TestEnum", enumCode);
     Object c = cls.getEnumConstants()[1];
     assertEquals(c.toString(), "B");
     byte[] bytes = fory.serialize(c);
     Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-    Fory fory2 = foryBuilder().withDeserializeNonexistentClass(true).build();
+    Fory fory2 = foryBuilder().withDeserializeUnknownClass(true).build();
     Object o = fory2.deserialize(bytes);
-    assertEquals(o, NonexistentClass.NonexistentEnum.V1);
+    assertEquals(o, UnknownClass.UnknownEnum.V1);
   }
 
   @Test
-  public void testNonexistentEnum_AsString() {
+  public void testUnknownEnum_AsString() {
     // Use scoped meta share for automatic MetaContext management
-    Fory fory =
-        foryBuilder().withDeserializeNonexistentClass(true).serializeEnumByName(true).build();
+    Fory fory = foryBuilder().withDeserializeUnknownClass(true).serializeEnumByName(true).build();
     String enumCode = ("enum TestEnum {" + " A, B" + "}");
     Class<?> cls = JaninoUtils.compileClass(getClass().getClassLoader(), "", "TestEnum", enumCode);
     Object c = cls.getEnumConstants()[1];
     assertEquals(c.toString(), "B");
     byte[] bytes = fory.serialize(c);
     Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-    Fory fory2 =
-        foryBuilder().withDeserializeNonexistentClass(true).serializeEnumByName(true).build();
+    Fory fory2 = foryBuilder().withDeserializeUnknownClass(true).serializeEnumByName(true).build();
     Object o = fory2.deserialize(bytes);
-    assertEquals(o, NonexistentClass.NonexistentEnum.UNKNOWN);
+    assertEquals(o, UnknownClass.UnknownEnum.UNKNOWN);
   }
 
   @Test
-  public void testNonexistentEnumAndArrayField() throws Exception {
+  public void testUnknownEnumAndArrayField() throws Exception {
     String enumStructCode1 =
         ("public class TestEnumStruct {\n"
             + "  public enum TestEnum {\n"
@@ -170,7 +168,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     ReflectionUtils.setObjectFieldValue(o, "f4", enumArray2);
     Fory fory1 =
         foryBuilder()
-            .withDeserializeNonexistentClass(true)
+            .withDeserializeUnknownClass(true)
             .withClassLoader(cls1.getClassLoader())
             .build();
     byte[] bytes = fory1.serialize(o);
@@ -187,7 +185,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
                 "TestEnumStruct",
                 ("public class TestEnumStruct {" + " public String f1;" + "}")));
     Fory fory2 =
-        foryBuilder().withDeserializeNonexistentClass(true).withClassLoader(classLoader).build();
+        foryBuilder().withDeserializeUnknownClass(true).withClassLoader(classLoader).build();
     Object o1 = fory2.deserialize(bytes);
     Assert.assertEquals(ReflectionUtils.getObjectFieldValue(o1, "f1"), "str");
   }
@@ -198,7 +196,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
   }
 
   @Test(dataProvider = "componentFinal")
-  public void testSkipNonexistentObjectArrayField(boolean componentFinal) throws Exception {
+  public void testUnknownEmptyStructObjectArrayField(boolean componentFinal) throws Exception {
     String enumStructCode1 =
         ("public class TestArrayStruct {\n"
             + "  public static "
@@ -230,7 +228,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     // Use scoped meta share for automatic MetaContext management
     Fory fory1 =
         foryBuilder()
-            .withDeserializeNonexistentClass(true)
+            .withDeserializeUnknownClass(true)
             .withClassLoader(cls1.getClassLoader())
             .build();
     byte[] bytes = fory1.serialize(o);
@@ -247,13 +245,13 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
                 "TestArrayStruct",
                 ("public class TestArrayStruct {" + " public String f1;" + "}")));
     Fory fory2 =
-        foryBuilder().withDeserializeNonexistentClass(true).withClassLoader(classLoader).build();
+        foryBuilder().withDeserializeUnknownClass(true).withClassLoader(classLoader).build();
     Object o1 = fory2.deserialize(bytes);
     Assert.assertEquals(ReflectionUtils.getObjectFieldValue(o1, "f1"), "str");
   }
 
   @Test(dataProvider = "metaShareConfig")
-  public void testDeserializeNonexistentNewFory(
+  public void testDeserializeUnknownNewFory(
       boolean referenceTracking,
       boolean enableCodegen1,
       boolean enableCodegen2,
@@ -267,8 +265,8 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     ClassLoader classLoader = getClass().getClassLoader();
     for (Class<?> structClass :
         new Class<?>[] {
-          Struct.createNumberStructClass("TestSkipNonexistentClass2", 2),
-          Struct.createStructClass("TestSkipNonexistentClass2", 2)
+          Struct.createNumberStructClass("TestUnknownEmptyStructClass2", 2),
+          Struct.createStructClass("TestUnknownEmptyStructClass2", 2)
         }) {
       Object pojo = Struct.createPOJO(structClass);
       MetaContext context1 = new MetaContext();
@@ -284,7 +282,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
       MetaContext context2 = new MetaContext();
       fory2.getSerializationContext().setMetaContext(context2);
       Object o2 = fory2.deserialize(bytes);
-      assertEquals(o2.getClass(), NonexistentClass.NonexistentMetaShared.class);
+      assertEquals(o2.getClass(), UnknownClass.UnknownStruct.class);
       fory2.getSerializationContext().setMetaContext(context2);
       byte[] bytes2 = fory2.serialize(o2);
       Fory fory3 =
@@ -303,7 +301,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
   }
 
   @Test(dataProvider = "metaShareConfig")
-  public void testDeserializeNonexistent(
+  public void testDeserializeUnknown(
       boolean referenceTracking,
       boolean enableCodegen1,
       boolean enableCodegen2,
@@ -320,8 +318,8 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     ClassLoader classLoader = getClass().getClassLoader();
     for (Class<?> structClass :
         new Class<?>[] {
-          Struct.createNumberStructClass("TestSkipNonexistentClass3", 2),
-          Struct.createStructClass("TestSkipNonexistentClass3", 2)
+          Struct.createNumberStructClass("TestUnknownEmptyStructClass3", 2),
+          Struct.createStructClass("TestUnknownEmptyStructClass3", 2)
         }) {
       Fory fory2 =
           foryBuilder()
@@ -344,7 +342,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
 
         fory2.getSerializationContext().setMetaContext(context2);
         Object o2 = fory2.deserialize(bytes);
-        assertEquals(o2.getClass(), NonexistentClass.NonexistentMetaShared.class);
+        assertEquals(o2.getClass(), UnknownClass.UnknownStruct.class);
         fory2.getSerializationContext().setMetaContext(context2);
         byte[] bytes2 = fory2.serialize(o2);
 
@@ -359,18 +357,18 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
   @Test
   public void testThrowExceptionIfClassNotExist() {
     // Use scoped meta share for automatic MetaContext management
-    Fory fory = foryBuilder().withDeserializeNonexistentClass(false).build();
+    Fory fory = foryBuilder().withDeserializeUnknownClass(false).build();
     ClassLoader classLoader = getClass().getClassLoader();
-    Class<?> structClass = Struct.createNumberStructClass("TestSkipNonexistentClass1", 2);
+    Class<?> structClass = Struct.createNumberStructClass("TestUnknownEmptyStructClass1", 2);
     Object pojo = Struct.createPOJO(structClass);
     Fory fory2 =
-        foryBuilder().withDeserializeNonexistentClass(false).withClassLoader(classLoader).build();
+        foryBuilder().withDeserializeUnknownClass(false).withClassLoader(classLoader).build();
     byte[] bytes = fory.serialize(pojo);
     assertThrowsCause(RuntimeException.class, () -> fory2.deserialize(bytes));
   }
 
   /**
-   * Simple test class with primitive types for NonexistentClass serialization testing. Avoids
+   * Simple test class with primitive types for UnknownClass serialization testing. Avoids
    * collection types which require complex type registration in xlang mode.
    */
   @Data
@@ -432,12 +430,12 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
   }
 
   /**
-   * Test that NonexistentClass correctly preserves field values when deserializing an unknown
-   * class. This simulates the scenario where fory2 doesn't have the class registered, so it
-   * deserializes to NonexistentMetaShared.
+   * Test that UnknownClass correctly preserves field values when deserializing an unknown class.
+   * This simulates the scenario where fory2 doesn't have the class registered, so it deserializes
+   * to UnknownStruct.
    */
   @Test(dataProvider = "language")
-  public void testNonexistentClassDeserializationPreservesValues(Language language) {
+  public void testUnknownClassDeserializationPreservesValues(Language language) {
     // Fory1: serializer with class registered
     Fory fory1 =
         Fory.builder()
@@ -447,7 +445,7 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
             .build();
     fory1.register(SimpleTestClass.class, "test.SimpleTestClass");
 
-    // Fory2: deserializer without class registered - will use NonexistentClassSerializer
+    // Fory2: deserializer without class registered - will use UnknownClassSerializer
     Fory fory2 =
         Fory.builder()
             .withLanguage(language)
@@ -464,17 +462,16 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     // Convert original object to map for comparison
     Map<String, Object> expectedMap = TestUtils.objectToMap(fory1, obj);
 
-    // Deserialize with fory2 - should return NonexistentMetaShared
+    // Deserialize with fory2 - should return UnknownStruct
     buffer.readerIndex(0);
     Object result = fory2.deserialize(buffer);
 
-    // Verify result is NonexistentMetaShared
-    assertEquals(result.getClass(), NonexistentClass.NonexistentMetaShared.class);
+    // Verify result is UnknownStruct
+    assertEquals(result.getClass(), UnknownClass.UnknownStruct.class);
 
-    NonexistentClass.NonexistentMetaShared nonexistent =
-        (NonexistentClass.NonexistentMetaShared) result;
+    UnknownClass.UnknownStruct nonexistent = (UnknownClass.UnknownStruct) result;
 
-    // Convert NonexistentMetaShared to a map keyed by simple field name
+    // Convert UnknownStruct to a map keyed by simple field name
     Map<String, Object> actualMap = new HashMap<>();
     for (Object key : nonexistent.keySet()) {
       String qualifiedKey = (String) key;
@@ -496,9 +493,9 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     }
   }
 
-  /** Test NonexistentClass with null values in nullable fields. */
+  /** Test UnknownClass with null values in nullable fields. */
   @Test(dataProvider = "language")
-  public void testNonexistentClassDeserializationWithNulls(Language language) {
+  public void testUnknownClassDeserializationWithNulls(Language language) {
     // Fory1: serializer with class registered
     Fory fory1 =
         Fory.builder()
@@ -529,11 +526,10 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     buffer.readerIndex(0);
     Object result = fory2.deserialize(buffer);
 
-    assertEquals(result.getClass(), NonexistentClass.NonexistentMetaShared.class);
-    NonexistentClass.NonexistentMetaShared nonexistent =
-        (NonexistentClass.NonexistentMetaShared) result;
+    assertEquals(result.getClass(), UnknownClass.UnknownStruct.class);
+    UnknownClass.UnknownStruct nonexistent = (UnknownClass.UnknownStruct) result;
 
-    // Convert NonexistentMetaShared to a map keyed by simple field name
+    // Convert UnknownStruct to a map keyed by simple field name
     Map<String, Object> actualMap = new HashMap<>();
     for (Object key : nonexistent.keySet()) {
       String qualifiedKey = (String) key;
@@ -555,12 +551,12 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
   }
 
   /**
-   * Test that NonexistentMetaShared can be serialized and deserialized again by the same Fory
-   * instance that doesn't know the class. This verifies that unknown class data is preserved across
-   * serialization cycles.
+   * Test that UnknownStruct can be serialized and deserialized again by the same Fory instance that
+   * doesn't know the class. This verifies that unknown class data is preserved across serialization
+   * cycles.
    */
   @Test(dataProvider = "language")
-  public void testNonexistentClassRoundTripWithinSameFory(Language language) {
+  public void testUnknownClassRoundTripWithinSameFory(Language language) {
     // Fory1: knows the class
     Fory fory1 =
         Fory.builder()
@@ -584,21 +580,20 @@ public class NonexistentClassSerializersTest extends ForyTestBase {
     MemoryBuffer buffer1 = MemoryBuffer.newHeapBuffer(1024);
     fory1.serialize(buffer1, original);
 
-    // Step 2: Deserialize with fory2 (gets NonexistentMetaShared)
+    // Step 2: Deserialize with fory2 (gets UnknownStruct)
     buffer1.readerIndex(0);
     Object nonexistent1 = fory2.deserialize(buffer1);
-    assertEquals(nonexistent1.getClass(), NonexistentClass.NonexistentMetaShared.class);
+    assertEquals(nonexistent1.getClass(), UnknownClass.UnknownStruct.class);
 
-    // Step 3: Serialize NonexistentMetaShared with fory2
+    // Step 3: Serialize UnknownStruct with fory2
     byte[] bytes = fory2.serialize(nonexistent1);
 
-    // Step 4: Deserialize again with fory2 (should get NonexistentMetaShared with same values)
+    // Step 4: Deserialize again with fory2 (should get UnknownStruct with same values)
     Object nonexistent2 = fory2.deserialize(bytes);
-    assertEquals(nonexistent2.getClass(), NonexistentClass.NonexistentMetaShared.class);
+    assertEquals(nonexistent2.getClass(), UnknownClass.UnknownStruct.class);
 
     // Verify values are preserved across the round-trip
-    NonexistentClass.NonexistentMetaShared result =
-        (NonexistentClass.NonexistentMetaShared) nonexistent2;
+    UnknownClass.UnknownStruct result = (UnknownClass.UnknownStruct) nonexistent2;
     Map<String, Object> actualMap = new HashMap<>();
     for (Object key : result.keySet()) {
       String qualifiedKey = (String) key;
diff --git a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java
index 86e9891e6..065d68caf 100644
--- a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/ChildContainerSerializersTest.java
@@ -252,7 +252,7 @@ public class ChildContainerSerializersTest extends ForyTestBase {
     Fory fory =
         builder()
             .withCompatibleMode(CompatibleMode.COMPATIBLE)
-            .withDeserializeNonexistentClass(true)
+            .withDeserializeUnknownClass(true)
             .withMetaShare(true)
             .withScopedMetaShare(false)
             .withCodegen(enableCodegen)
diff --git a/java/fory-core/src/test/java/org/apache/fory/xlang/PyCrossLanguageTest.java b/java/fory-core/src/test/java/org/apache/fory/xlang/PyCrossLanguageTest.java
index 2d03985e6..274bf0c93 100644
--- a/java/fory-core/src/test/java/org/apache/fory/xlang/PyCrossLanguageTest.java
+++ b/java/fory-core/src/test/java/org/apache/fory/xlang/PyCrossLanguageTest.java
@@ -69,9 +69,9 @@ import org.apache.fory.resolver.TypeResolver;
 import org.apache.fory.serializer.ArraySerializersTest;
 import org.apache.fory.serializer.BufferObject;
 import org.apache.fory.serializer.EnumSerializerTest;
-import org.apache.fory.serializer.NonexistentClass.NonexistentMetaShared;
 import org.apache.fory.serializer.ObjectSerializer;
 import org.apache.fory.serializer.Serializer;
+import org.apache.fory.serializer.UnknownClass.UnknownStruct;
 import org.apache.fory.test.TestUtils;
 import org.apache.fory.type.Descriptor;
 import org.apache.fory.type.DescriptorGrouper;
@@ -963,8 +963,7 @@ public class PyCrossLanguageTest extends ForyTestBase {
     {
       Fory fory2 = builder.get();
       fory2.register(EnumTestClass.class, "test_enum");
-      Assert.assertEquals(
-          fory2.deserialize(fory.serialize(a)).getClass(), NonexistentMetaShared.class);
+      Assert.assertEquals(fory2.deserialize(fory.serialize(a)).getClass(), UnknownStruct.class);
     }
   }
 
diff --git a/java/fory-testsuite/src/test/java/org/test/Org.java b/java/fory-testsuite/src/test/java/org/test/Org.java
index a26526a33..b70008c8f 100644
--- a/java/fory-testsuite/src/test/java/org/test/Org.java
+++ b/java/fory-testsuite/src/test/java/org/test/Org.java
@@ -53,7 +53,7 @@ public class Org implements Serializable {
             .withRefTracking(true)
             // Allow to deserialize objects unknown types,more flexible but less secure.
             .requireClassRegistration(false)
-            .withDeserializeNonexistentClass(true)
+            .withDeserializeUnknownClass(true)
             .withCompatibleMode(CompatibleMode.COMPATIBLE)
             .withRefTracking(true)
             .build();
diff --git a/javascript/packages/fory/lib/meta/TypeMeta.ts b/javascript/packages/fory/lib/meta/TypeMeta.ts
index 06d36dc91..649afc57e 100644
--- a/javascript/packages/fory/lib/meta/TypeMeta.ts
+++ b/javascript/packages/fory/lib/meta/TypeMeta.ts
@@ -42,8 +42,8 @@ const PRIMITIVE_TYPE_IDS = [
   TypeId.BOOL, TypeId.INT8, TypeId.INT16, TypeId.INT32, TypeId.VARINT32,
   TypeId.INT64, TypeId.VARINT64, TypeId.TAGGED_INT64, TypeId.UINT8,
   TypeId.UINT16, TypeId.UINT32, TypeId.VAR_UINT32, TypeId.UINT64,
-  TypeId.VAR_UINT64, TypeId.TAGGED_UINT64, TypeId.FLOAT16,
-  TypeId.FLOAT32, TypeId.FLOAT64,
+  TypeId.VAR_UINT64, TypeId.TAGGED_UINT64, TypeId.FLOAT8, TypeId.FLOAT16,
+  TypeId.BFLOAT16, TypeId.FLOAT32, TypeId.FLOAT64,
 ];
 
 export const isPrimitiveTypeId = (typeId: number): boolean => {
@@ -66,7 +66,9 @@ export const isInternalTypeId = (typeId: number): boolean => {
     TypeId.INT16_ARRAY,
     TypeId.INT32_ARRAY,
     TypeId.INT64_ARRAY,
+    TypeId.FLOAT8_ARRAY,
     TypeId.FLOAT16_ARRAY,
+    TypeId.BFLOAT16_ARRAY,
     TypeId.FLOAT32_ARRAY,
     TypeId.FLOAT64_ARRAY,
     TypeId.UINT16_ARRAY,
@@ -93,8 +95,12 @@ function getPrimitiveTypeSize(typeId: number) {
       return 8;
     case TypeId.TAGGED_INT64:
       return 8;
+    case TypeId.FLOAT8:
+      return 1;
     case TypeId.FLOAT16:
       return 2;
+    case TypeId.BFLOAT16:
+      return 2;
     case TypeId.FLOAT32:
       return 4;
     case TypeId.FLOAT64:
diff --git a/javascript/packages/fory/lib/type.ts b/javascript/packages/fory/lib/type.ts
index 18ec15e3e..9cbdf5759 100644
--- a/javascript/packages/fory/lib/type.ts
+++ b/javascript/packages/fory/lib/type.ts
@@ -52,80 +52,88 @@ export const TypeId = {
   VAR_UINT64: 14,
   // a 64-bit unsigned integer which uses fory hybrid encoding.
   TAGGED_UINT64: 15,
+  // an 8-bit floating point number.
+  FLOAT8: 16,
   // a 16-bit floating point number.
-  FLOAT16: 16,
+  FLOAT16: 17,
+  // a 16-bit brain floating point number.
+  BFLOAT16: 18,
   // a 32-bit floating point number.
-  FLOAT32: 17,
+  FLOAT32: 19,
   // a 64-bit floating point number including NaN and Infinity.
-  FLOAT64: 18,
+  FLOAT64: 20,
   // a text string encoded using Latin1/UTF16/UTF-8 encoding.
-  STRING: 19,
+  STRING: 21,
   // a sequence of objects.
-  LIST: 20,
+  LIST: 22,
   // an unordered set of unique elements.
-  SET: 21,
+  SET: 23,
   // a map of key-value pairs.
-  MAP: 22,
+  MAP: 24,
   // a data type consisting of a set of named values.
-  ENUM: 23,
+  ENUM: 25,
   // an enum whose value will be serialized as the registered name.
-  NAMED_ENUM: 24,
+  NAMED_ENUM: 26,
   // a morphic(final) type serialized by Fory Struct serializer.
-  STRUCT: 25,
+  STRUCT: 27,
   // a morphic(final) type serialized by Fory compatible Struct serializer.
-  COMPATIBLE_STRUCT: 26,
+  COMPATIBLE_STRUCT: 28,
   // a `struct` whose type mapping will be encoded as a name.
-  NAMED_STRUCT: 27,
+  NAMED_STRUCT: 29,
   // a `compatible_struct` whose type mapping will be encoded as a name.
-  NAMED_COMPATIBLE_STRUCT: 28,
+  NAMED_COMPATIBLE_STRUCT: 30,
   // a type which will be serialized by a customized serializer.
-  EXT: 29,
+  EXT: 31,
   // an `ext` type whose type mapping will be encoded as a name.
-  NAMED_EXT: 30,
+  NAMED_EXT: 32,
   // a tagged union type that can hold one of several alternative types.
-  UNION: 31,
+  UNION: 33,
   // a union value with embedded numeric union type ID.
-  TYPED_UNION: 32,
+  TYPED_UNION: 34,
   // a union value with embedded union type name/TypeDef.
-  NAMED_UNION: 33,
+  NAMED_UNION: 35,
   // represents an empty/unit value with no data.
-  NONE: 34,
+  NONE: 36,
   // an absolute length of time, independent of any calendar/timezone, as a count of nanoseconds.
-  DURATION: 35,
+  DURATION: 37,
   // a point in time, independent of any calendar/timezone, as a count of nanoseconds.
-  TIMESTAMP: 36,
+  TIMESTAMP: 38,
   // a naive date without timezone.
-  DATE: 37,
+  DATE: 39,
   // exact decimal value represented as an integer value in two's complement.
-  DECIMAL: 38,
+  DECIMAL: 40,
   // a variable-length array of bytes.
-  BINARY: 39,
+  BINARY: 41,
   // a multidimensional array which every sub-array can have different sizes but all have the same type.
-  ARRAY: 40,
+  ARRAY: 42,
   // one dimensional bool array.
-  BOOL_ARRAY: 41,
+  BOOL_ARRAY: 43,
   // one dimensional int8 array.
-  INT8_ARRAY: 42,
+  INT8_ARRAY: 44,
   // one dimensional int16 array.
-  INT16_ARRAY: 43,
+  INT16_ARRAY: 45,
   // one dimensional int32 array.
-  INT32_ARRAY: 44,
+  INT32_ARRAY: 46,
   // one dimensional int64 array.
-  INT64_ARRAY: 45,
+  INT64_ARRAY: 47,
   // one dimensional uint8 array.
-  UINT8_ARRAY: 46,
+  UINT8_ARRAY: 48,
   // one dimensional uint16 array.
-  UINT16_ARRAY: 47,
+  UINT16_ARRAY: 49,
   // one dimensional uint32 array.
-  UINT32_ARRAY: 48,
+  UINT32_ARRAY: 50,
   // one dimensional uint64 array.
-  UINT64_ARRAY: 49,
+  UINT64_ARRAY: 51,
+  // one dimensional float8 array.
+  FLOAT8_ARRAY: 52,
   // one dimensional float16 array.
-  FLOAT16_ARRAY: 50,
+  FLOAT16_ARRAY: 53,
+  // one dimensional bfloat16 array.
+  BFLOAT16_ARRAY: 54,
   // one dimensional float32 array.
-  FLOAT32_ARRAY: 51,
+  FLOAT32_ARRAY: 55,
   // one dimensional float64 array.
-  FLOAT64_ARRAY: 52,
+  FLOAT64_ARRAY: 56,
 
   // BOUND id remains at 64
   BOUND: 64,
diff --git a/javascript/packages/fory/lib/typeInfo.ts b/javascript/packages/fory/lib/typeInfo.ts
index 41a2c3c09..a4dd7e151 100644
--- a/javascript/packages/fory/lib/typeInfo.ts
+++ b/javascript/packages/fory/lib/typeInfo.ts
@@ -385,7 +385,9 @@ export type HintInput<T> = T extends {
     | typeof TypeId.UINT16
     | typeof TypeId.UINT32
     | typeof TypeId.VAR_UINT32
+    | typeof TypeId.FLOAT8
     | typeof TypeId.FLOAT16
+    | typeof TypeId.BFLOAT16
     | typeof TypeId.FLOAT32
     | typeof TypeId.FLOAT64;
   }
@@ -453,7 +455,9 @@ export type HintResult<T> = T extends never ? any : T extends {
     | typeof TypeId.UINT16
     | typeof TypeId.UINT32
     | typeof TypeId.VAR_UINT32
+    | typeof TypeId.FLOAT8
     | typeof TypeId.FLOAT16
+    | typeof TypeId.BFLOAT16
     | typeof TypeId.FLOAT32
     | typeof TypeId.FLOAT64;
   }
diff --git a/python/pyfory/format/schema.pxi b/python/pyfory/format/schema.pxi
index 4cb04a188..84c859cf1 100644
--- a/python/pyfory/format/schema.pxi
+++ b/python/pyfory/format/schema.pxi
@@ -55,23 +55,25 @@ class TypeId:
     UINT16 = 10
     UINT32 = 11
     UINT64 = 13
-    FLOAT16 = 16
-    FLOAT32 = 17
-    FLOAT64 = 18
-    STRING = 19
-    LIST = 20
-    SET = 21
-    MAP = 22
-    STRUCT = 25
-    UNION = 31
-    TYPED_UNION = 32
-    NAMED_UNION = 33
-    NONE = 34
-    DURATION = 35
-    TIMESTAMP = 36
-    DATE = 37
-    DECIMAL = 38
-    BINARY = 39
+    FLOAT8 = 16
+    FLOAT16 = 17
+    BFLOAT16 = 18
+    FLOAT32 = 19
+    FLOAT64 = 20
+    STRING = 21
+    LIST = 22
+    SET = 23
+    MAP = 24
+    STRUCT = 27
+    UNION = 33
+    TYPED_UNION = 34
+    NAMED_UNION = 35
+    NONE = 36
+    DURATION = 37
+    TIMESTAMP = 38
+    DATE = 39
+    DECIMAL = 40
+    BINARY = 41
 
 
 cdef class DataType:
diff --git a/python/pyfory/format/schema.py b/python/pyfory/format/schema.py
index 83ed44a30..18baa2037 100644
--- a/python/pyfory/format/schema.py
+++ b/python/pyfory/format/schema.py
@@ -55,37 +55,37 @@ def arrow_type_to_fory_type_id(arrow_type):
 
     # Floating point types
     if pa_types.is_float16(arrow_type):
-        return 9  # FLOAT16
+        return 17  # FLOAT16
     if pa_types.is_float32(arrow_type):
-        return 10  # FLOAT32
+        return 19  # FLOAT32
     if pa_types.is_float64(arrow_type):
-        return 11  # FLOAT64
+        return 20  # FLOAT64
 
     # String and binary
     if pa_types.is_string(arrow_type) or pa_types.is_large_string(arrow_type):
-        return 12  # STRING
+        return 21  # STRING
     if pa_types.is_binary(arrow_type) or pa_types.is_large_binary(arrow_type):
-        return 28  # BINARY
+        return 41  # BINARY
 
     # Date/time types
     if pa_types.is_date32(arrow_type):
-        return 26  # DATE
+        return 39  # DATE
     if pa_types.is_timestamp(arrow_type):
-        return 25  # TIMESTAMP
+        return 38  # TIMESTAMP
     if pa_types.is_duration(arrow_type):
-        return 24  # DURATION
+        return 37  # DURATION
 
     # Decimal
     if pa_types.is_decimal(arrow_type):
-        return 27  # DECIMAL
+        return 40  # DECIMAL
 
     # Complex types
     if pa_types.is_list(arrow_type) or pa_types.is_large_list(arrow_type):
-        return 21  # LIST
+        return 22  # LIST
     if pa_types.is_map(arrow_type):
-        return 23  # MAP
+        return 24  # MAP
     if pa_types.is_struct(arrow_type):
-        return 15  # STRUCT
+        return 27  # STRUCT
 
     raise NotImplementedError(f"Unsupported Arrow type: {arrow_type}")
 
@@ -115,37 +115,37 @@ def fory_type_id_to_arrow_type(type_id, precision=None, scale=None, list_type=No
         3: pa.int16(),  # INT16
         4: pa.int32(),  # INT32
         6: pa.int64(),  # INT64
-        9: pa.float16(),  # FLOAT16
-        10: pa.float32(),  # FLOAT32
-        11: pa.float64(),  # FLOAT64
-        12: pa.utf8(),  # STRING
-        24: pa.duration("ns"),  # DURATION
-        25: pa.timestamp("us"),  # TIMESTAMP
-        26: pa.date32(),  # DATE
-        28: pa.binary(),  # BINARY
+        17: pa.float16(),  # FLOAT16
+        19: pa.float32(),  # FLOAT32
+        20: pa.float64(),  # FLOAT64
+        21: pa.utf8(),  # STRING
+        37: pa.duration("ns"),  # DURATION
+        38: pa.timestamp("us"),  # TIMESTAMP
+        39: pa.date32(),  # DATE
+        41: pa.binary(),  # BINARY
     }
 
     if type_id in type_map:
         return type_map[type_id]
 
     # Decimal
-    if type_id == 27:  # DECIMAL
+    if type_id == 40:  # DECIMAL
         return pa.decimal128(precision or 38, scale or 18)
 
     # List
-    if type_id == 21:  # LIST
+    if type_id == 22:  # LIST
         if list_type is None:
             raise ValueError("list_type must be provided for LIST type")
         return pa.list_(list_type)
 
     # Map
-    if type_id == 23:  # MAP
+    if type_id == 24:  # MAP
         if map_key_type is None or map_value_type is None:
             raise ValueError("map_key_type and map_value_type must be provided for MAP type")
         return pa.map_(map_key_type, map_value_type)
 
     # Struct
-    if type_id == 15:  # STRUCT
+    if type_id == 27:  # STRUCT
         if struct_fields is None:
             raise ValueError("struct_fields must be provided for STRUCT type")
         return pa.struct(struct_fields)
diff --git a/python/pyfory/includes/libformat.pxd b/python/pyfory/includes/libformat.pxd
index a70e8e414..240cb0f44 100755
--- a/python/pyfory/includes/libformat.pxd
+++ b/python/pyfory/includes/libformat.pxd
@@ -56,43 +56,47 @@ cdef extern from "fory/type/type.h" namespace "fory" nogil:
         UINT64 = 13
         VAR_UINT64 = 14
         TAGGED_UINT64 = 15
-        FLOAT16 = 16
-        FLOAT32 = 17
-        FLOAT64 = 18
-        STRING = 19
-        LIST = 20
-        SET = 21
-        MAP = 22
-        ENUM = 23
-        NAMED_ENUM = 24
-        STRUCT = 25
-        COMPATIBLE_STRUCT = 26
-        NAMED_STRUCT = 27
-        NAMED_COMPATIBLE_STRUCT = 28
-        EXT = 29
-        NAMED_EXT = 30
-        UNION = 31
-        TYPED_UNION = 32
-        NAMED_UNION = 33
-        NONE = 34
-        DURATION = 35
-        TIMESTAMP = 36
-        DATE = 37
-        DECIMAL = 38
-        BINARY = 39
-        ARRAY = 40
-        BOOL_ARRAY = 41
-        INT8_ARRAY = 42
-        INT16_ARRAY = 43
-        INT32_ARRAY = 44
-        INT64_ARRAY = 45
-        UINT8_ARRAY = 46
-        UINT16_ARRAY = 47
-        UINT32_ARRAY = 48
-        UINT64_ARRAY = 49
-        FLOAT16_ARRAY = 50
-        FLOAT32_ARRAY = 51
-        FLOAT64_ARRAY = 52
+        FLOAT8 = 16
+        FLOAT16 = 17
+        BFLOAT16 = 18
+        FLOAT32 = 19
+        FLOAT64 = 20
+        STRING = 21
+        LIST = 22
+        SET = 23
+        MAP = 24
+        ENUM = 25
+        NAMED_ENUM = 26
+        STRUCT = 27
+        COMPATIBLE_STRUCT = 28
+        NAMED_STRUCT = 29
+        NAMED_COMPATIBLE_STRUCT = 30
+        EXT = 31
+        NAMED_EXT = 32
+        UNION = 33
+        TYPED_UNION = 34
+        NAMED_UNION = 35
+        NONE = 36
+        DURATION = 37
+        TIMESTAMP = 38
+        DATE = 39
+        DECIMAL = 40
+        BINARY = 41
+        ARRAY = 42
+        BOOL_ARRAY = 43
+        INT8_ARRAY = 44
+        INT16_ARRAY = 45
+        INT32_ARRAY = 46
+        INT64_ARRAY = 47
+        UINT8_ARRAY = 48
+        UINT16_ARRAY = 49
+        UINT32_ARRAY = 50
+        UINT64_ARRAY = 51
+        FLOAT8_ARRAY = 52
+        FLOAT16_ARRAY = 53
+        BFLOAT16_ARRAY = 54
+        FLOAT32_ARRAY = 55
+        FLOAT64_ARRAY = 56
         BOUND = 64
 
 
diff --git a/python/pyfory/includes/libserialization.pxd b/python/pyfory/includes/libserialization.pxd
index 2c0a6ed5d..db25654ac 100644
--- a/python/pyfory/includes/libserialization.pxd
+++ b/python/pyfory/includes/libserialization.pxd
@@ -39,43 +39,47 @@ cdef extern from "fory/type/type.h" namespace "fory" nogil:
         UINT64 = 13
         VAR_UINT64 = 14
         TAGGED_UINT64 = 15
-        FLOAT16 = 16
-        FLOAT32 = 17
-        FLOAT64 = 18
-        STRING = 19
-        LIST = 20
-        SET = 21
-        MAP = 22
-        ENUM = 23
-        NAMED_ENUM = 24
-        STRUCT = 25
-        COMPATIBLE_STRUCT = 26
-        NAMED_STRUCT = 27
-        NAMED_COMPATIBLE_STRUCT = 28
-        EXT = 29
-        NAMED_EXT = 30
-        UNION = 31
-        TYPED_UNION = 32
-        NAMED_UNION = 33
-        NONE = 34
-        DURATION = 35
-        TIMESTAMP = 36
-        DATE = 37
-        DECIMAL = 38
-        BINARY = 39
-        ARRAY = 40
-        BOOL_ARRAY = 41
-        INT8_ARRAY = 42
-        INT16_ARRAY = 43
-        INT32_ARRAY = 44
-        INT64_ARRAY = 45
-        UINT8_ARRAY = 46
-        UINT16_ARRAY = 47
-        UINT32_ARRAY = 48
-        UINT64_ARRAY = 49
-        FLOAT16_ARRAY = 50
-        FLOAT32_ARRAY = 51
-        FLOAT64_ARRAY = 52
+        FLOAT8 = 16
+        FLOAT16 = 17
+        BFLOAT16 = 18
+        FLOAT32 = 19
+        FLOAT64 = 20
+        STRING = 21
+        LIST = 22
+        SET = 23
+        MAP = 24
+        ENUM = 25
+        NAMED_ENUM = 26
+        STRUCT = 27
+        COMPATIBLE_STRUCT = 28
+        NAMED_STRUCT = 29
+        NAMED_COMPATIBLE_STRUCT = 30
+        EXT = 31
+        NAMED_EXT = 32
+        UNION = 33
+        TYPED_UNION = 34
+        NAMED_UNION = 35
+        NONE = 36
+        DURATION = 37
+        TIMESTAMP = 38
+        DATE = 39
+        DECIMAL = 40
+        BINARY = 41
+        ARRAY = 42
+        BOOL_ARRAY = 43
+        INT8_ARRAY = 44
+        INT16_ARRAY = 45
+        INT32_ARRAY = 46
+        INT64_ARRAY = 47
+        UINT8_ARRAY = 48
+        UINT16_ARRAY = 49
+        UINT32_ARRAY = 50
+        UINT64_ARRAY = 51
+        FLOAT8_ARRAY = 52
+        FLOAT16_ARRAY = 53
+        BFLOAT16_ARRAY = 54
+        FLOAT32_ARRAY = 55
+        FLOAT64_ARRAY = 56
         BOUND = 64
 
     cdef enum class TypeRegistrationKind(int32_t):
diff --git a/python/pyfory/meta/typedef_decoder.py b/python/pyfory/meta/typedef_decoder.py
index 59880ed08..619d42fb1 100644
--- a/python/pyfory/meta/typedef_decoder.py
+++ b/python/pyfory/meta/typedef_decoder.py
@@ -145,7 +145,7 @@ def decode_typedef(buffer: Buffer, resolver, header=None) -> TypeDef:
             typename = type_info.decode_typename()
         else:
             namespace = "fory"
-            typename = f"Nonexistent{user_type_id if user_type_id != NO_USER_TYPE_ID else type_id}"
+            typename = f"UnknownStruct{user_type_id if user_type_id != NO_USER_TYPE_ID else type_id}"
     name = namespace + "." + typename if namespace else typename
     # Read fields info if present
     field_infos = []
diff --git a/python/pyfory/types.py b/python/pyfory/types.py
index 4ca50e274..7f8f871dd 100644
--- a/python/pyfory/types.py
+++ b/python/pyfory/types.py
@@ -66,85 +66,93 @@ class TypeId:
     VAR_UINT64 = 14
     # a 64-bit unsigned integer which uses fory hybrid encoding.
     TAGGED_UINT64 = 15
+    # an 8-bit floating point number.
+    FLOAT8 = 16
     # a 16-bit floating point number.
-    FLOAT16 = 16
+    FLOAT16 = 17
+    # a 16-bit brain floating point number.
+    BFLOAT16 = 18
     # a 32-bit floating point number.
-    FLOAT32 = 17
+    FLOAT32 = 19
     # a 64-bit floating point number including NaN and Infinity.
-    FLOAT64 = 18
+    FLOAT64 = 20
     # a text string encoded using Latin1/UTF16/UTF-8 encoding.
-    STRING = 19
+    STRING = 21
     # a sequence of objects.
-    LIST = 20
+    LIST = 22
     # an unordered set of unique elements.
-    SET = 21
+    SET = 23
     # a map of key-value pairs. Mutable types such as `list/map/set/array/tensor/arrow` are not allowed as key of map.
-    MAP = 22
+    MAP = 24
     # a data type consisting of a set of named values. Rust enum with non-predefined field values are not supported as
     # an enum.
-    ENUM = 23
+    ENUM = 25
     # an enum whose value will be serialized as the registered name.
-    NAMED_ENUM = 24
+    NAMED_ENUM = 26
     # a morphic(final) type serialized by Fory Struct serializer. i.e., it doesn't have subclasses. Suppose we're
     # deserializing `List[SomeClass]`, we can save dynamic serializer dispatch since `SomeClass` is morphic(final).
-    STRUCT = 25
+    STRUCT = 27
     # a morphic(final) type serialized by Fory compatible Struct serializer.
-    COMPATIBLE_STRUCT = 26
+    COMPATIBLE_STRUCT = 28
     # a `struct` whose type mapping will be encoded as a name.
-    NAMED_STRUCT = 27
+    NAMED_STRUCT = 29
     # a `compatible_struct` whose type mapping will be encoded as a name.
-    NAMED_COMPATIBLE_STRUCT = 28
+    NAMED_COMPATIBLE_STRUCT = 30
     # a type which will be serialized by a customized serializer.
-    EXT = 29
+    EXT = 31
     # an `ext` type whose type mapping will be encoded as a name.
-    NAMED_EXT = 30
+    NAMED_EXT = 32
     # a union value whose schema identity is not embedded.
-    UNION = 31
+    UNION = 33
     # a union value with embedded numeric union type ID.
-    TYPED_UNION = 32
+    TYPED_UNION = 34
     # a union value with embedded union type name/TypeDef.
-    NAMED_UNION = 33
+    NAMED_UNION = 35
     # represents an empty/unit value with no data (e.g., for empty union alternatives).
-    NONE = 34
+    NONE = 36
     # an absolute length of time, independent of any calendar/timezone, as a count of nanoseconds.
-    DURATION = 35
+    DURATION = 37
     # a point in time, independent of any calendar/timezone, as a count of nanoseconds. The count is relative
     # to an epoch at UTC midnight on January 1, 1970.
-    TIMESTAMP = 36
+    TIMESTAMP = 38
     # a naive date without timezone. The count is days relative to an epoch at UTC midnight on Jan 1, 1970.
-    DATE = 37
+    DATE = 39
     # exact decimal value represented as an integer value in two's complement.
-    DECIMAL = 38
+    DECIMAL = 40
     # a variable-length array of bytes.
-    BINARY = 39
+    BINARY = 41
     # a multidimensional array which every sub-array can have different sizes but all have the same type.
     # only allow numeric components. Other arrays will be taken as List. The implementation should support the
     # interoperability between array and list.
-    ARRAY = 40
+    ARRAY = 42
     # one dimensional bool array.
-    BOOL_ARRAY = 41
+    BOOL_ARRAY = 43
     # one dimensional int8 array.
-    INT8_ARRAY = 42
+    INT8_ARRAY = 44
     # one dimensional int16 array.
-    INT16_ARRAY = 43
+    INT16_ARRAY = 45
     # one dimensional int32 array.
-    INT32_ARRAY = 44
+    INT32_ARRAY = 46
     # one dimensional int64 array.
-    INT64_ARRAY = 45
+    INT64_ARRAY = 47
     # one dimensional uint8 array.
-    UINT8_ARRAY = 46
+    UINT8_ARRAY = 48
     # one dimensional uint16 array.
-    UINT16_ARRAY = 47
+    UINT16_ARRAY = 49
     # one dimensional uint32 array.
-    UINT32_ARRAY = 48
+    UINT32_ARRAY = 50
     # one dimensional uint64 array.
-    UINT64_ARRAY = 49
+    UINT64_ARRAY = 51
+    # one dimensional float8 array.
+    FLOAT8_ARRAY = 52
     # one dimensional float16 array.
-    FLOAT16_ARRAY = 50
+    FLOAT16_ARRAY = 53
+    # one dimensional bfloat16 array.
+    BFLOAT16_ARRAY = 54
     # one dimensional float32 array.
-    FLOAT32_ARRAY = 51
+    FLOAT32_ARRAY = 55
     # one dimensional float64 array.
-    FLOAT64_ARRAY = 52
+    FLOAT64_ARRAY = 56
 
     # Bound value for range checks (types with id >= BOUND are not internal types).
     BOUND = 64
@@ -247,7 +255,9 @@ _primitive_types_ids = {
     TypeId.VAR_UINT64,
     TypeId.TAGGED_UINT64,
     # Floats
+    TypeId.FLOAT8,
     TypeId.FLOAT16,
+    TypeId.BFLOAT16,
     TypeId.FLOAT32,
     TypeId.FLOAT64,
 }
@@ -281,7 +291,9 @@ _primitive_type_sizes = {
     TypeId.VAR_UINT64: 8,
     TypeId.TAGGED_UINT64: 8,
     # Floats
+    TypeId.FLOAT8: 1,
     TypeId.FLOAT16: 2,
+    TypeId.BFLOAT16: 2,
     TypeId.FLOAT32: 4,
     TypeId.FLOAT64: 8,
 }
diff --git a/rust/fory-core/src/meta/type_meta.rs b/rust/fory-core/src/meta/type_meta.rs
index 1cf9d49c4..e67d76cb2 100644
--- a/rust/fory-core/src/meta/type_meta.rs
+++ b/rust/fory-core/src/meta/type_meta.rs
@@ -682,7 +682,9 @@ impl TypeMeta {
                 TypeId::UINT64 => 8,
                 TypeId::VAR_UINT64 => 8,
                 TypeId::TAGGED_UINT64 => 8,
+                TypeId::FLOAT8 => 1,
                 TypeId::FLOAT16 => 2,
+                TypeId::BFLOAT16 => 2,
                 TypeId::FLOAT32 => 4,
                 TypeId::FLOAT64 => 8,
                 TypeId::U128 => 16,
diff --git a/rust/fory-core/src/types.rs b/rust/fory-core/src/types.rs
index eab89a7cf..1f99c53c6 100644
--- a/rust/fory-core/src/types.rs
+++ b/rust/fory-core/src/types.rs
@@ -114,47 +114,51 @@ pub enum TypeId {
     UINT64 = 13,
     VAR_UINT64 = 14,
     TAGGED_UINT64 = 15,
-    FLOAT16 = 16,
-    FLOAT32 = 17,
-    FLOAT64 = 18,
-    STRING = 19,
-    LIST = 20,
-    SET = 21,
-    MAP = 22,
-    ENUM = 23,
-    NAMED_ENUM = 24,
-    STRUCT = 25,
-    COMPATIBLE_STRUCT = 26,
-    NAMED_STRUCT = 27,
-    NAMED_COMPATIBLE_STRUCT = 28,
-    EXT = 29,
-    NAMED_EXT = 30,
+    FLOAT8 = 16,
+    FLOAT16 = 17,
+    BFLOAT16 = 18,
+    FLOAT32 = 19,
+    FLOAT64 = 20,
+    STRING = 21,
+    LIST = 22,
+    SET = 23,
+    MAP = 24,
+    ENUM = 25,
+    NAMED_ENUM = 26,
+    STRUCT = 27,
+    COMPATIBLE_STRUCT = 28,
+    NAMED_STRUCT = 29,
+    NAMED_COMPATIBLE_STRUCT = 30,
+    EXT = 31,
+    NAMED_EXT = 32,
     // A tagged union value whose schema identity is not embedded.
-    UNION = 31,
+    UNION = 33,
     // A union value with embedded numeric union type ID.
-    TYPED_UNION = 32,
+    TYPED_UNION = 34,
     // A union value with embedded union type name/TypeDef.
-    NAMED_UNION = 33,
+    NAMED_UNION = 35,
     // Represents an empty/unit value with no data.
-    NONE = 34,
-    DURATION = 35,
-    TIMESTAMP = 36,
-    DATE = 37,
-    DECIMAL = 38,
-    BINARY = 39,
-    ARRAY = 40,
-    BOOL_ARRAY = 41,
-    INT8_ARRAY = 42,
-    INT16_ARRAY = 43,
-    INT32_ARRAY = 44,
-    INT64_ARRAY = 45,
-    UINT8_ARRAY = 46,
-    UINT16_ARRAY = 47,
-    UINT32_ARRAY = 48,
-    UINT64_ARRAY = 49,
-    FLOAT16_ARRAY = 50,
-    FLOAT32_ARRAY = 51,
-    FLOAT64_ARRAY = 52,
+    NONE = 36,
+    DURATION = 37,
+    TIMESTAMP = 38,
+    DATE = 39,
+    DECIMAL = 40,
+    BINARY = 41,
+    ARRAY = 42,
+    BOOL_ARRAY = 43,
+    INT8_ARRAY = 44,
+    INT16_ARRAY = 45,
+    INT32_ARRAY = 46,
+    INT64_ARRAY = 47,
+    UINT8_ARRAY = 48,
+    UINT16_ARRAY = 49,
+    UINT32_ARRAY = 50,
+    UINT64_ARRAY = 51,
+    FLOAT8_ARRAY = 52,
+    FLOAT16_ARRAY = 53,
+    BFLOAT16_ARRAY = 54,
+    FLOAT32_ARRAY = 55,
+    FLOAT64_ARRAY = 56,
     // Rust-specific types (not part of xlang spec, for internal use)
     U128 = 64,
     INT128 = 65,
@@ -189,7 +193,9 @@ pub const VAR_UINT32: u32 = TypeId::VAR_UINT32 as u32;
 pub const UINT64: u32 = TypeId::UINT64 as u32;
 pub const VAR_UINT64: u32 = TypeId::VAR_UINT64 as u32;
 pub const TAGGED_UINT64: u32 = TypeId::TAGGED_UINT64 as u32;
+pub const FLOAT8: u32 = TypeId::FLOAT8 as u32;
 pub const FLOAT16: u32 = TypeId::FLOAT16 as u32;
+pub const BFLOAT16: u32 = TypeId::BFLOAT16 as u32;
 pub const FLOAT32: u32 = TypeId::FLOAT32 as u32;
 pub const FLOAT64: u32 = TypeId::FLOAT64 as u32;
 pub const STRING: u32 = TypeId::STRING as u32;
@@ -219,7 +225,9 @@ pub const UINT8_ARRAY: u32 = TypeId::UINT8_ARRAY as u32;
 pub const UINT16_ARRAY: u32 = TypeId::UINT16_ARRAY as u32;
 pub const UINT32_ARRAY: u32 = TypeId::UINT32_ARRAY as u32;
 pub const UINT64_ARRAY: u32 = TypeId::UINT64_ARRAY as u32;
+pub const FLOAT8_ARRAY: u32 = TypeId::FLOAT8_ARRAY as u32;
 pub const FLOAT16_ARRAY: u32 = TypeId::FLOAT16_ARRAY as u32;
+pub const BFLOAT16_ARRAY: u32 = TypeId::BFLOAT16_ARRAY as u32;
 pub const FLOAT32_ARRAY: u32 = TypeId::FLOAT32_ARRAY as u32;
 pub const FLOAT64_ARRAY: u32 = TypeId::FLOAT64_ARRAY as u32;
 pub const UNION: u32 = TypeId::UNION as u32;
@@ -303,7 +311,7 @@ pub static BASIC_TYPES: [TypeId; 33] = [
     TypeId::USIZE_ARRAY,
 ];
 
-pub static PRIMITIVE_TYPES: [u32; 22] = [
+pub static PRIMITIVE_TYPES: [u32; 24] = [
     TypeId::BOOL as u32,
     TypeId::INT8 as u32,
     TypeId::INT16 as u32,
@@ -319,7 +327,9 @@ pub static PRIMITIVE_TYPES: [u32; 22] = [
     TypeId::UINT64 as u32,
     TypeId::VAR_UINT64 as u32,
     TypeId::TAGGED_UINT64 as u32,
+    TypeId::FLOAT8 as u32,
     TypeId::FLOAT16 as u32,
+    TypeId::BFLOAT16 as u32,
     TypeId::FLOAT32 as u32,
     TypeId::FLOAT64 as u32,
     // Rust-specific
@@ -329,7 +339,7 @@ pub static PRIMITIVE_TYPES: [u32; 22] = [
     TypeId::ISIZE as u32,
 ];
 
-pub static PRIMITIVE_ARRAY_TYPES: [u32; 15] = [
+pub static PRIMITIVE_ARRAY_TYPES: [u32; 18] = [
     TypeId::BOOL_ARRAY as u32,
     TypeId::BINARY as u32,
     TypeId::INT8_ARRAY as u32,
@@ -340,6 +350,9 @@ pub static PRIMITIVE_ARRAY_TYPES: [u32; 15] = [
     TypeId::UINT16_ARRAY as u32,
     TypeId::UINT32_ARRAY as u32,
     TypeId::UINT64_ARRAY as u32,
+    TypeId::FLOAT8_ARRAY as u32,
+    TypeId::FLOAT16_ARRAY as u32,
+    TypeId::BFLOAT16_ARRAY as u32,
     TypeId::FLOAT32_ARRAY as u32,
     TypeId::FLOAT64_ARRAY as u32,
     // Rust-specific
@@ -406,6 +419,9 @@ pub const fn is_primitive_type_id(type_id: TypeId) -> bool {
             | TypeId::UINT16
             | TypeId::UINT32
             | TypeId::UINT64
+            | TypeId::FLOAT8
+            | TypeId::FLOAT16
+            | TypeId::BFLOAT16
             | TypeId::FLOAT32
             | TypeId::FLOAT64
             // Rust-specific
@@ -528,43 +544,47 @@ pub fn format_type_id(type_id: u32) -> String {
         13 => "UINT64",
         14 => "VAR_UINT64",
         15 => "TAGGED_UINT64",
-        16 => "FLOAT16",
-        17 => "FLOAT32",
-        18 => "FLOAT64",
-        19 => "STRING",
-        20 => "LIST",
-        21 => "SET",
-        22 => "MAP",
-        23 => "ENUM",
-        24 => "NAMED_ENUM",
-        25 => "STRUCT",
-        26 => "COMPATIBLE_STRUCT",
-        27 => "NAMED_STRUCT",
-        28 => "NAMED_COMPATIBLE_STRUCT",
-        29 => "EXT",
-        30 => "NAMED_EXT",
-        31 => "UNION",
-        32 => "TYPED_UNION",
-        33 => "NAMED_UNION",
-        34 => "NONE",
-        35 => "DURATION",
-        36 => "TIMESTAMP",
-        37 => "DATE",
-        38 => "DECIMAL",
-        39 => "BINARY",
-        40 => "ARRAY",
-        41 => "BOOL_ARRAY",
-        42 => "INT8_ARRAY",
-        43 => "INT16_ARRAY",
-        44 => "INT32_ARRAY",
-        45 => "INT64_ARRAY",
-        46 => "UINT8_ARRAY",
-        47 => "UINT16_ARRAY",
-        48 => "UINT32_ARRAY",
-        49 => "UINT64_ARRAY",
-        50 => "FLOAT16_ARRAY",
-        51 => "FLOAT32_ARRAY",
-        52 => "FLOAT64_ARRAY",
+        16 => "FLOAT8",
+        17 => "FLOAT16",
+        18 => "BFLOAT16",
+        19 => "FLOAT32",
+        20 => "FLOAT64",
+        21 => "STRING",
+        22 => "LIST",
+        23 => "SET",
+        24 => "MAP",
+        25 => "ENUM",
+        26 => "NAMED_ENUM",
+        27 => "STRUCT",
+        28 => "COMPATIBLE_STRUCT",
+        29 => "NAMED_STRUCT",
+        30 => "NAMED_COMPATIBLE_STRUCT",
+        31 => "EXT",
+        32 => "NAMED_EXT",
+        33 => "UNION",
+        34 => "TYPED_UNION",
+        35 => "NAMED_UNION",
+        36 => "NONE",
+        37 => "DURATION",
+        38 => "TIMESTAMP",
+        39 => "DATE",
+        40 => "DECIMAL",
+        41 => "BINARY",
+        42 => "ARRAY",
+        43 => "BOOL_ARRAY",
+        44 => "INT8_ARRAY",
+        45 => "INT16_ARRAY",
+        46 => "INT32_ARRAY",
+        47 => "INT64_ARRAY",
+        48 => "UINT8_ARRAY",
+        49 => "UINT16_ARRAY",
+        50 => "UINT32_ARRAY",
+        51 => "UINT64_ARRAY",
+        52 => "FLOAT8_ARRAY",
+        53 => "FLOAT16_ARRAY",
+        54 => "BFLOAT16_ARRAY",
+        55 => "FLOAT32_ARRAY",
+        56 => "FLOAT64_ARRAY",
         // Rust-specific types
         64 => "U128",
         65 => "INT128",
diff --git a/rust/fory-derive/src/object/util.rs b/rust/fory-derive/src/object/util.rs
index 84c8f9fb0..39c07c318 100644
--- a/rust/fory-derive/src/object/util.rs
+++ b/rust/fory-derive/src/object/util.rs
@@ -1060,7 +1060,9 @@ fn get_primitive_type_size(type_id_num: u32) -> i32 {
         TypeId::INT64 => 8,
         TypeId::VARINT64 => 8,
         TypeId::TAGGED_INT64 => 8,
+        TypeId::FLOAT8 => 1,
         TypeId::FLOAT16 => 2,
+        TypeId::BFLOAT16 => 2,
         TypeId::FLOAT32 => 4,
         TypeId::FLOAT64 => 8,
         TypeId::INT128 => 16,
@@ -1108,7 +1110,9 @@ fn is_internal_type_id(type_id: u32) -> bool {
         TypeId::INT32_ARRAY as u32,
         TypeId::INT64_ARRAY as u32,
         TypeId::INT128_ARRAY as u32,
+        TypeId::FLOAT8_ARRAY as u32,
         TypeId::FLOAT16_ARRAY as u32,
+        TypeId::BFLOAT16_ARRAY as u32,
         TypeId::FLOAT32_ARRAY as u32,
         TypeId::FLOAT64_ARRAY as u32,
         TypeId::UINT16_ARRAY as u32,
diff --git a/rust/tests/tests/test_marker.rs b/rust/tests/tests/test_marker.rs
index d543d9767..258198d8b 100644
--- a/rust/tests/tests/test_marker.rs
+++ b/rust/tests/tests/test_marker.rs
@@ -114,18 +114,18 @@ fn test_nested_struct_with_phantom_data() {
 // TypeId Tests for UNION and NONE
 // ============================================================================
 
-/// Test that UNION TypeId matches xlang spec (31)
+/// Test that UNION TypeId matches xlang spec (33)
 #[test]
 fn test_union_type_id() {
-    assert_eq!(TypeId::UNION as i16, 31);
-    assert_eq!(fory_core::types::UNION, 31);
+    assert_eq!(TypeId::UNION as i16, 33);
+    assert_eq!(fory_core::types::UNION, 33);
 }
 
-/// Test that NONE TypeId matches xlang spec (34)
+/// Test that NONE TypeId matches xlang spec (36)
 #[test]
 fn test_none_type_id() {
-    assert_eq!(TypeId::NONE as i16, 34);
-    assert_eq!(fory_core::types::NONE, 34);
+    assert_eq!(TypeId::NONE as i16, 36);
+    assert_eq!(fory_core::types::NONE, 36);
 }
 
 /// Test that PhantomData uses NONE TypeId (no runtime data)


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