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 f021947c4 refactor(rust): use absolute path in generated Rust code 
(#3666)
f021947c4 is described below

commit f021947c44317426f3c1021a0891cd422b208f4f
Author: Peiyang He <[email protected]>
AuthorDate: Sat May 9 05:27:41 2026 -0400

    refactor(rust): use absolute path in generated Rust code (#3666)
    
    <!--
    **Thanks for contributing to Apache Fory™.**
    
    **If this is your first time opening a PR on fory, you can refer to
    
[CONTRIBUTING.md](https://github.com/apache/fory/blob/main/CONTRIBUTING.md).**
    
    Contribution Checklist
    
    - The **Apache Fory™** community has requirements on the naming of pr
    titles. You can also find instructions in
    [CONTRIBUTING.md](https://github.com/apache/fory/blob/main/CONTRIBUTING.md).
    
    - Apache Fory™ has a strong focus on performance. If the PR you submit
    will have an impact on performance, please benchmark it first and
    provide the benchmark result here.
    -->
    
    ## Why?
    
    For generated Rust code, it would be better to use absolute paths like
    `::std::option::Option` instead of `Option`.
    On the one hand, this follows common practice in [procedural
    
macros](https://doc.rust-lang.org/reference/procedural-macros.html#r-macro.proc.hygiene)
    and prost; on the other hand, this will keep Fory/runtime/std/core
    references out of the generated code's local namespace, so IDL-defined
    names such as `String`, `Vec` won't collide with the generator-owned
    types.
    
    ## What does this PR do?
    
    - Use absolute paths across the Rust code generator and derived macros.
    - Remove collecting uses logic in the Rust code generator like
    
    
https://github.com/apache/fory/blob/b4441d0ac55ba0dc89eb4a311966daa58074b9fc/compiler/fory_compiler/generators/rust.py#L199-L215
    
    ## Related issues
    
    N/A.
    
    ## AI Contribution Checklist
    
    <!-- Full requirements and disclosure template:
    
    
https://github.com/apache/fory/blob/main/AI_POLICY.md#9-contributor-checklist-for-ai-assisted-prs
    -->
    
    - [ ] Substantial AI assistance was used in this PR: no
    - [ ] If `yes`, I included a completed [AI Contribution
    
Checklist](https://github.com/apache/fory/blob/main/AI_POLICY.md#9-contributor-checklist-for-ai-assisted-prs)
    in this PR description and the required `AI Usage Disclosure`.
    - [ ] If `yes`, my PR description includes the required `ai_review`
    summary and screenshot evidence of the final clean AI review results
    from both fresh reviewers on the current PR diff or current HEAD after
    the latest code changes.
    
    <!-- If substantial AI assistance = `yes`, paste the completed checklist
    and disclosure block here, including the final ai_review summary and
    screenshot evidence from both fresh reviewers on the current PR diff or
    current HEAD after the latest code changes. -->
    
    ## Does this PR introduce any user-facing change?
    
    <!--
    If any user-facing interface changes, please [open an
    issue](https://github.com/apache/fory/issues/new/choose) describing the
    need to do so and update the document if necessary.
    
    Delete section if not applicable.
    -->
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
---
 .gitignore                                         |   2 +-
 compiler/fory_compiler/generators/rust.py          | 183 +++++-------------
 .../fory_compiler/tests/test_generated_code.py     |  37 ++++
 rust/fory-derive/src/fory_row.rs                   |  16 +-
 rust/fory-derive/src/object/derive_enum.rs         |  78 ++++----
 rust/fory-derive/src/object/field_codec.rs         | 204 +++++++++++----------
 rust/fory-derive/src/object/misc.rs                |  19 +-
 rust/fory-derive/src/object/read.rs                |  80 ++++----
 rust/fory-derive/src/object/serializer.rs          |  64 +++----
 rust/fory-derive/src/object/util.rs                |  56 ++++--
 rust/fory-derive/src/object/write.rs               |  12 +-
 11 files changed, 366 insertions(+), 385 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6e074c91a..55c36b011 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,7 @@ bazel-*
 **/.bazel_user_root/
 .whl
 python/.cache
-python/pyfory/__pycache__/
+__pycache__/
 python/dist
 python/build
 python/pyfory.egg-info
diff --git a/compiler/fory_compiler/generators/rust.py 
b/compiler/fory_compiler/generators/rust.py
index 167c722ef..64885b530 100644
--- a/compiler/fory_compiler/generators/rust.py
+++ b/compiler/fory_compiler/generators/rust.py
@@ -55,17 +55,17 @@ class RustGenerator(BaseGenerator):
         PrimitiveKind.UINT16: "u16",
         PrimitiveKind.UINT32: "u32",
         PrimitiveKind.UINT64: "u64",
-        PrimitiveKind.FLOAT16: "Float16",
-        PrimitiveKind.BFLOAT16: "BFloat16",
+        PrimitiveKind.FLOAT16: "::fory::Float16",
+        PrimitiveKind.BFLOAT16: "::fory::BFloat16",
         PrimitiveKind.FLOAT32: "f32",
         PrimitiveKind.FLOAT64: "f64",
-        PrimitiveKind.STRING: "String",
-        PrimitiveKind.BYTES: "Vec<u8>",
-        PrimitiveKind.DATE: "chrono::NaiveDate",
-        PrimitiveKind.TIMESTAMP: "chrono::NaiveDateTime",
-        PrimitiveKind.DURATION: "chrono::Duration",
-        PrimitiveKind.DECIMAL: "fory::Decimal",
-        PrimitiveKind.ANY: "Box<dyn Any>",
+        PrimitiveKind.STRING: "::std::string::String",
+        PrimitiveKind.BYTES: "::std::vec::Vec<u8>",
+        PrimitiveKind.DATE: "::chrono::NaiveDate",
+        PrimitiveKind.TIMESTAMP: "::chrono::NaiveDateTime",
+        PrimitiveKind.DURATION: "::chrono::Duration",
+        PrimitiveKind.DECIMAL: "::fory::Decimal",
+        PrimitiveKind.ANY: "::std::boxed::Box<dyn ::std::any::Any>",
     }
 
     def generate(self) -> List[GeneratedFile]:
@@ -177,13 +177,15 @@ class RustGenerator(BaseGenerator):
     def generate_bytes_impl(self, type_name: str) -> List[str]:
         lines = []
         lines.append(f"impl {type_name} {{")
-        lines.append("    pub fn to_bytes(&self) -> Result<Vec<u8>, 
fory::Error> {")
+        lines.append(
+            "    pub fn to_bytes(&self) -> 
::std::result::Result<::std::vec::Vec<u8>, ::fory::Error> {"
+        )
         lines.append("        let fory = detail::get_fory();")
         lines.append("        fory.serialize(self)")
         lines.append("    }")
         lines.append("")
         lines.append(
-            f"    pub fn from_bytes(data: &[u8]) -> Result<{type_name}, 
fory::Error> {{"
+            f"    pub fn from_bytes(data: &[u8]) -> 
::std::result::Result<{type_name}, ::fory::Error> {{"
         )
         lines.append("        let fory = detail::get_fory();")
         lines.append("        fory.deserialize(data)")
@@ -194,44 +196,11 @@ class RustGenerator(BaseGenerator):
     def generate_module(self) -> GeneratedFile:
         """Generate a Rust module with all types."""
         lines = []
-        uses: Set[str] = set()
-
-        # Collect uses (including from nested types)
-        uses.add("use fory::Fory")
-        if any(not self.is_imported_type(message) for message in 
self.schema.messages):
-            uses.add("use fory::ForyStruct")
-        if any(not self.is_imported_type(enum) for enum in self.schema.enums) 
or any(
-            self.message_has_nested_enum(message)
-            for message in self.schema.messages
-            if not self.is_imported_type(message)
-        ):
-            uses.add("use fory::ForyEnum")
-        if any(not self.is_imported_type(union) for union in 
self.schema.unions) or any(
-            self.message_has_nested_union(message)
-            for message in self.schema.messages
-            if not self.is_imported_type(message)
-        ):
-            uses.add("use fory::ForyUnion")
-        uses.add("use std::sync::OnceLock")
-
-        for message in self.schema.messages:
-            if self.is_imported_type(message):
-                continue
-            self.collect_message_uses(message, uses)
-        for union in self.schema.unions:
-            if self.is_imported_type(union):
-                continue
-            self.collect_union_uses(union, uses)
 
         # License header
         lines.append(self.get_license_header("//"))
         lines.append("")
 
-        # Uses
-        for use in sorted(uses):
-            lines.append(f"{use};")
-        lines.append("")
-
         # Generate enums (top-level)
         for enum in self.schema.enums:
             if self.is_imported_type(enum):
@@ -273,15 +242,6 @@ class RustGenerator(BaseGenerator):
             content="\n".join(lines),
         )
 
-    def collect_message_uses(self, message: Message, uses: Set[str]):
-        """Collect uses for a message and its nested types recursively."""
-        for field in message.fields:
-            self.collect_uses_for_field(field, uses)
-        for nested_msg in message.nested_messages:
-            self.collect_message_uses(nested_msg, uses)
-        for nested_union in message.nested_unions:
-            self.collect_union_uses(nested_union, uses)
-
     def message_has_nested_enum(self, message: Message) -> bool:
         if message.nested_enums:
             return True
@@ -298,13 +258,6 @@ class RustGenerator(BaseGenerator):
             for nested_msg in message.nested_messages
         )
 
-    def collect_union_uses(self, union: Union, uses: Set[str]):
-        """Collect uses for a union and its cases."""
-        for field in union.fields:
-            if self.field_uses_pointer(field):
-                uses.add("use std::sync::Arc")
-            self.collect_uses(field.field_type, uses)
-
     def get_registration_type_name(
         self, name: str, parent_stack: Optional[List[Message]] = None
     ) -> str:
@@ -364,7 +317,9 @@ class RustGenerator(BaseGenerator):
         type_name = enum.name
 
         # Derive macros
-        lines.append("#[derive(ForyEnum, Debug, Clone, PartialEq, Eq, Hash, 
Default)]")
+        lines.append(
+            "#[derive(::fory::ForyEnum, Debug, Clone, PartialEq, Eq, Hash, 
Default)]"
+        )
         lines.append("#[repr(i32)]")
 
         lines.append(f"pub enum {type_name} {{")
@@ -396,7 +351,7 @@ class RustGenerator(BaseGenerator):
         comment = self.format_type_id_comment(union, "//")
         if comment:
             lines.append(comment)
-        derives = ["ForyUnion", "Debug"]
+        derives = ["::fory::ForyUnion", "Debug"]
         if not has_any:
             derives.extend(["Clone", "PartialEq"])
         lines.append(f"#[derive({', '.join(derives)})]")
@@ -411,7 +366,7 @@ class RustGenerator(BaseGenerator):
                 element_optional=field.element_optional,
                 element_ref=field.element_ref,
                 parent_stack=parent_stack,
-                pointer_type="Arc",
+                pointer_type="::std::sync::Arc",
             )
             lines.append(f"    #[fory(id = {field.number})]")
             payload_attr = self.get_payload_field_attr(field)
@@ -428,9 +383,11 @@ class RustGenerator(BaseGenerator):
         if union.fields:
             first_field = union.fields[0]
             first_variant = self.to_pascal_case(first_field.name)
-            lines.append(f"impl Default for {union.name} {{")
+            lines.append(f"impl ::std::default::Default for {union.name} {{")
             lines.append("    fn default() -> Self {")
-            lines.append(f"        Self::{first_variant}(Default::default())")
+            lines.append(
+                f"        
Self::{first_variant}(::std::default::Default::default())"
+            )
             lines.append("    }")
             lines.append("}")
             lines.append("")
@@ -454,7 +411,7 @@ class RustGenerator(BaseGenerator):
         if comment:
             lines.append(comment)
         needs_safe_debug = self.message_needs_safe_debug(message)
-        derives = ["ForyStruct"]
+        derives = ["::fory::ForyStruct"]
         if not needs_safe_debug:
             derives.append("Debug")
         if not self.message_has_any(message):
@@ -524,9 +481,9 @@ class RustGenerator(BaseGenerator):
         """Generate a Debug impl that avoids recursive ref expansion."""
         lines: List[str] = []
         type_name = self.to_pascal_case(message.name)
-        lines.append(f"impl std::fmt::Debug for {type_name} {{")
+        lines.append(f"impl ::std::fmt::Debug for {type_name} {{")
         lines.append(
-            "    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> 
std::fmt::Result {"
+            "    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> 
::std::fmt::Result {"
         )
         if not message.fields:
             lines.append(
@@ -760,15 +717,15 @@ class RustGenerator(BaseGenerator):
         element_optional: bool = False,
         element_ref: bool = False,
         parent_stack: Optional[List[Message]] = None,
-        pointer_type: str = "Arc",
+        pointer_type: str = "::std::sync::Arc",
     ) -> str:
         """Generate Rust type string."""
         if isinstance(field_type, PrimitiveType):
             if field_type.kind == PrimitiveKind.ANY:
-                return "Box<dyn Any>"
+                return "::std::boxed::Box<dyn ::std::any::Any>"
             base_type = self.PRIMITIVE_MAP[field_type.kind]
             if nullable:
-                return f"Option<{base_type}>"
+                return f"::std::option::Option<{base_type}>"
             return base_type
 
         elif isinstance(field_type, NamedType):
@@ -781,7 +738,7 @@ class RustGenerator(BaseGenerator):
             if ref:
                 type_name = f"{pointer_type}<{type_name}>"
             if nullable:
-                type_name = f"Option<{type_name}>"
+                type_name = f"::std::option::Option<{type_name}>"
             return type_name
 
         elif isinstance(field_type, ListType):
@@ -794,11 +751,11 @@ class RustGenerator(BaseGenerator):
                 parent_stack=parent_stack,
                 pointer_type=pointer_type,
             )
-            list_type = f"Vec<{element_type}>"
+            list_type = f"::std::vec::Vec<{element_type}>"
             if ref:
                 list_type = f"{pointer_type}<{list_type}>"
             if nullable:
-                list_type = f"Option<{list_type}>"
+                list_type = f"::std::option::Option<{list_type}>"
             return list_type
 
         elif isinstance(field_type, ArrayType):
@@ -809,11 +766,11 @@ class RustGenerator(BaseGenerator):
                 parent_stack=parent_stack,
                 pointer_type=pointer_type,
             )
-            array_type = f"Vec<{element_type}>"
+            array_type = f"::std::vec::Vec<{element_type}>"
             if ref:
                 array_type = f"{pointer_type}<{array_type}>"
             if nullable:
-                array_type = f"Option<{array_type}>"
+                array_type = f"::std::option::Option<{array_type}>"
             return array_type
 
         elif isinstance(field_type, MapType):
@@ -831,11 +788,11 @@ class RustGenerator(BaseGenerator):
                 parent_stack=parent_stack,
                 pointer_type=pointer_type,
             )
-            map_type = f"HashMap<{key_type}, {value_type}>"
+            map_type = f"::std::collections::HashMap<{key_type}, {value_type}>"
             if ref:
                 map_type = f"{pointer_type}<{map_type}>"
             if nullable:
-                map_type = f"Option<{map_type}>"
+                map_type = f"::std::option::Option<{map_type}>"
             return map_type
 
         return "()"
@@ -867,60 +824,6 @@ class RustGenerator(BaseGenerator):
 
         return self.to_pascal_case(type_name)
 
-    def collect_uses(self, field_type: FieldType, uses: Set[str]):
-        """Collect required use statements for a field type."""
-        if isinstance(field_type, PrimitiveType):
-            if field_type.kind in (
-                PrimitiveKind.DATE,
-                PrimitiveKind.TIMESTAMP,
-                PrimitiveKind.DURATION,
-            ):
-                uses.add("use chrono")
-            if field_type.kind == PrimitiveKind.FLOAT16:
-                uses.add("use fory::Float16")
-            if field_type.kind == PrimitiveKind.BFLOAT16:
-                uses.add("use fory::BFloat16")
-            if field_type.kind == PrimitiveKind.ANY:
-                uses.add("use std::any::Any")
-
-        elif isinstance(field_type, NamedType):
-            pass  # No additional uses needed
-
-        elif isinstance(field_type, ListType):
-            self.collect_uses(field_type.element_type, uses)
-
-        elif isinstance(field_type, ArrayType):
-            self.collect_uses(field_type.element_type, uses)
-
-        elif isinstance(field_type, MapType):
-            uses.add("use std::collections::HashMap")
-            self.collect_uses(field_type.key_type, uses)
-            self.collect_uses(field_type.value_type, uses)
-
-    def collect_uses_for_field(self, field: Field, uses: Set[str]):
-        """Collect uses for a field, including ref tracking."""
-        if isinstance(field.field_type, ListType) and field.element_ref:
-            ref_options = field.element_ref_options
-            weak_ref = ref_options.get("weak_ref") is True
-        elif isinstance(field.field_type, MapType) and 
field.field_type.value_ref:
-            ref_options = field.field_type.value_ref_options
-            weak_ref = ref_options.get("weak_ref") is True
-        else:
-            ref_options = field.ref_options
-            weak_ref = ref_options.get("weak_ref") is True
-        pointer_type = self.get_pointer_type(ref_options, weak_ref)
-        if weak_ref and self.field_uses_pointer(field):
-            if pointer_type == "RcWeak":
-                uses.add("use fory::RcWeak")
-            else:
-                uses.add("use fory::ArcWeak")
-        elif self.field_uses_pointer(field):
-            if pointer_type == "Rc":
-                uses.add("use std::rc::Rc")
-            else:
-                uses.add("use std::sync::Arc")
-        self.collect_uses(field.field_type, uses)
-
     def field_uses_pointer(self, field: Field) -> bool:
         if field.ref:
             return True
@@ -934,15 +837,15 @@ class RustGenerator(BaseGenerator):
         """Determine pointer type for ref tracking based on field options."""
         thread_safe = ref_options.get("thread_safe_pointer")
         if thread_safe is False:
-            return "RcWeak" if weak_ref else "Rc"
-        return "ArcWeak" if weak_ref else "Arc"
+            return "::fory::RcWeak" if weak_ref else "::std::rc::Rc"
+        return "::fory::ArcWeak" if weak_ref else "::std::sync::Arc"
 
     def generate_registration(self) -> List[str]:
         """Generate the Fory registration function."""
         lines = []
 
         lines.append(
-            "pub fn register_types(fory: &mut Fory) -> Result<(), fory::Error> 
{"
+            "pub fn register_types(fory: &mut ::fory::Fory) -> 
::std::result::Result<(), ::fory::Error> {"
         )
 
         # Register enums (top-level)
@@ -963,7 +866,7 @@ class RustGenerator(BaseGenerator):
                 continue
             self.generate_message_registration(lines, message, None)
 
-        lines.append("    Ok(())")
+        lines.append("    ::std::result::Result::Ok(())")
         lines.append("}")
 
         return lines
@@ -973,10 +876,12 @@ class RustGenerator(BaseGenerator):
         lines.append("mod detail {")
         lines.append("    use super::*;")
         lines.append("")
-        lines.append("    pub(super) fn get_fory() -> &'static Fory {")
-        lines.append("        static FORY: OnceLock<Fory> = OnceLock::new();")
+        lines.append("    pub(super) fn get_fory() -> &'static ::fory::Fory {")
+        lines.append(
+            "        static FORY: ::std::sync::OnceLock<::fory::Fory> = 
::std::sync::OnceLock::new();"
+        )
         lines.append("        FORY.get_or_init(|| {")
-        lines.append("            let mut fory = Fory::builder()")
+        lines.append("            let mut fory = ::fory::Fory::builder()")
         lines.append("                .xlang(true)")
         lines.append("                .track_ref(true)")
         lines.append("                .compatible(true)")
diff --git a/compiler/fory_compiler/tests/test_generated_code.py 
b/compiler/fory_compiler/tests/test_generated_code.py
index 2ac32176e..263c023cf 100644
--- a/compiler/fory_compiler/tests/test_generated_code.py
+++ b/compiler/fory_compiler/tests/test_generated_code.py
@@ -777,3 +777,40 @@ def 
test_go_generator_distinguishes_bytes_from_uint8_lists():
     go_output = render_files(generate_files(schema, GoGenerator))
     assert 'Payload []byte `fory:"id=1,type=bytes"`' in go_output
     assert 'Values []uint8 `fory:"id=2"`' in go_output
+
+
+def test_rust_generated_code_uses_absolute_paths():
+    schema = parse_fdl(
+        dedent(
+            """
+            package foo;
+
+            message String {
+                string value = 1;
+                list<string> items = 2;
+                map<string, string> labels = 3;
+                any payload = 4;
+                ref(weak=true) String parent = 5;
+            }
+
+            union Fory {
+                String text = 1;
+            }
+            """
+        )
+    )
+    rust_output = render_files(generate_files(schema, RustGenerator))
+    assert "use fory::" not in rust_output
+    assert "use std::" not in rust_output
+    assert "#[derive(::fory::ForyStruct" in rust_output
+    assert "#[derive(::fory::ForyUnion" in rust_output
+    assert "pub value: ::std::string::String," in rust_output
+    assert "pub items: ::std::vec::Vec<::std::string::String>," in rust_output
+    assert (
+        "pub labels: ::std::collections::HashMap<::std::string::String, 
::std::string::String>,"
+        in rust_output
+    )
+    assert "pub payload: ::std::boxed::Box<dyn ::std::any::Any>," in 
rust_output
+    assert "pub parent: ::fory::ArcWeak<String>," in rust_output
+    assert "pub fn register_types(fory: &mut ::fory::Fory)" in rust_output
+    assert "static FORY: ::std::sync::OnceLock<::fory::Fory>" in rust_output
diff --git a/rust/fory-derive/src/fory_row.rs b/rust/fory-derive/src/fory_row.rs
index 02173e98d..610d20f36 100644
--- a/rust/fory-derive/src/fory_row.rs
+++ b/rust/fory-derive/src/fory_row.rs
@@ -35,7 +35,7 @@ pub fn derive_row(ast: &syn::DeriveInput) -> TokenStream {
 
         quote! {
             let mut callback_info = struct_writer.write_start(#index);
-            <#ty as fory_core::row::Row<'a>>::write(&v.#ident, 
struct_writer.get_writer())?;
+            <#ty as ::fory_core::row::Row<'a>>::write(&v.#ident, 
struct_writer.get_writer())?;
             struct_writer.write_end(callback_info);
         }
     });
@@ -46,9 +46,9 @@ pub fn derive_row(ast: &syn::DeriveInput) -> TokenStream {
         let getter_name: proc_macro2::Ident = 
syn::Ident::new(&format!("{ident}"), ident.span());
 
         quote! {
-            pub fn #getter_name(&self) -> <#ty as 
fory_core::row::Row<'a>>::ReadResult {
+            pub fn #getter_name(&self) -> <#ty as 
::fory_core::row::Row<'a>>::ReadResult {
                 let bytes = self.struct_data.get_field_bytes(#index);
-                <#ty as fory_core::row::Row<'a>>::cast(bytes)
+                <#ty as ::fory_core::row::Row<'a>>::cast(bytes)
             }
         }
     });
@@ -59,25 +59,25 @@ pub fn derive_row(ast: &syn::DeriveInput) -> TokenStream {
 
     let gen = quote! {
         struct #getter<'a> {
-            struct_data: fory_core::row::StructViewer<'a>
+            struct_data: ::fory_core::row::StructViewer<'a>
         }
 
         impl<'a> #getter<'a> {
             #(#getter_exprs)*
         }
 
-        impl<'a> fory_core::row::Row<'a> for #name {
+        impl<'a> ::fory_core::row::Row<'a> for #name {
 
             type ReadResult = #getter<'a>;
 
-            fn write(v: &Self, writer: &mut fory_core::buffer::Writer) -> 
Result<(), fory_core::error::Error> {
-                let mut struct_writer = 
fory_core::row::StructWriter::new(#num_fields, writer);
+            fn write(v: &Self, writer: &mut ::fory_core::buffer::Writer) -> 
Result<(), ::fory_core::error::Error> {
+                let mut struct_writer = 
::fory_core::row::StructWriter::new(#num_fields, writer);
                 #(#write_exprs);*;
                 Ok(())
             }
 
             fn cast(bytes: &'a [u8]) -> Self::ReadResult {
-                #getter{ struct_data: fory_core::row::StructViewer::new(bytes, 
#num_fields) }
+                #getter{ struct_data: 
::fory_core::row::StructViewer::new(bytes, #num_fields) }
             }
         }
     };
diff --git a/rust/fory-derive/src/object/derive_enum.rs 
b/rust/fory-derive/src/object/derive_enum.rs
index d394b5fe0..fadb9f988 100644
--- a/rust/fory-derive/src/object/derive_enum.rs
+++ b/rust/fory-derive/src/object/derive_enum.rs
@@ -86,7 +86,7 @@ fn gen_write_variant_elements(
             .filter_map(|(binding, ident)| match binding {
                 FieldBinding::Codec(binding) => 
Some(binding.write_value_with_mode(
                     quote! { #ident },
-                    quote! { fory_core::RefMode::NullOnly },
+                    quote! { ::fory_core::RefMode::NullOnly },
                     quote! { true },
                 )),
                 FieldBinding::Skipped(_) => None,
@@ -101,7 +101,7 @@ fn gen_write_single_payload(source_fields: 
&[SourceField<'_>], value: TokenStrea
         Ok(bindings) => match bindings.as_slice() {
             [FieldBinding::Codec(binding)] => binding.write_value_with_mode(
                 value,
-                quote! { fory_core::RefMode::Tracking },
+                quote! { ::fory_core::RefMode::Tracking },
                 quote! { true },
             ),
             [FieldBinding::Skipped(_)] => {
@@ -153,7 +153,7 @@ fn gen_read_variant_elements(
                         let index = serialized_index;
                         serialized_index += 1;
                         let read_value = binding.read_with_mode_expr(
-                            quote! { fory_core::RefMode::NullOnly },
+                            quote! { ::fory_core::RefMode::NullOnly },
                             quote! { true },
                         );
                         read_fields.push(quote! {
@@ -186,7 +186,7 @@ fn gen_read_single_payload(source_fields: 
&[SourceField<'_>]) -> TokenStream {
     match build_bindings(source_fields) {
         Ok(bindings) => match bindings.as_slice() {
             [FieldBinding::Codec(binding)] => binding
-                .read_with_mode_expr(quote! { fory_core::RefMode::Tracking }, 
quote! { true }),
+                .read_with_mode_expr(quote! { ::fory_core::RefMode::Tracking 
}, quote! { true }),
             [FieldBinding::Skipped(_)] => {
                 quote! { compile_error!("skip is not valid for union payload 
fields") }
             }
@@ -209,25 +209,25 @@ pub fn gen_actual_type_id(data_enum: &DataEnum) -> 
TokenStream {
         quote! {
             if xlang {
                 if register_by_name {
-                    fory_core::type_id::TypeId::NAMED_UNION as u32
+                    ::fory_core::type_id::TypeId::NAMED_UNION as u32
                 } else {
-                    fory_core::type_id::TypeId::TYPED_UNION as u32
+                    ::fory_core::type_id::TypeId::TYPED_UNION as u32
                 }
             } else {
-                fory_core::serializer::enum_::actual_type_id(type_id, 
register_by_name, compatible)
+                ::fory_core::serializer::enum_::actual_type_id(type_id, 
register_by_name, compatible)
             }
         }
     } else {
         quote! {
             let _ = xlang;
-            fory_core::serializer::enum_::actual_type_id(type_id, 
register_by_name, compatible)
+            ::fory_core::serializer::enum_::actual_type_id(type_id, 
register_by_name, compatible)
         }
     }
 }
 
 pub fn gen_field_fields_info(_data_enum: &DataEnum) -> TokenStream {
     quote! {
-        Ok(Vec::new())
+        ::std::result::Result::Ok(::std::vec::Vec::new())
     }
 }
 
@@ -247,8 +247,8 @@ pub fn gen_variants_fields_info(enum_name: &syn::Ident, 
data_enum: &DataEnum) ->
                     quote! {
                         (
                             #variant_name.to_string(),
-                            std::any::TypeId::of::<#meta_type_ident>(),
-                            <#meta_type_ident as 
fory_core::serializer::enum_::NamedEnumVariantMetaTrait>::fory_fields_info(type_resolver)?
+                            ::std::any::TypeId::of::<#meta_type_ident>(),
+                            <#meta_type_ident as 
::fory_core::serializer::enum_::NamedEnumVariantMetaTrait>::fory_fields_info(type_resolver)?
                         )
                     }
                 }
@@ -257,8 +257,8 @@ pub fn gen_variants_fields_info(enum_name: &syn::Ident, 
data_enum: &DataEnum) ->
                     quote! {
                         (
                             #variant_name.to_string(),
-                            std::any::TypeId::of::<()>(), // Placeholder type 
ID
-                            Vec::new()
+                            ::std::any::TypeId::of::<()>(), // Placeholder 
type ID
+                            ::std::vec::Vec::new()
                         )
                     }
                 }
@@ -267,7 +267,7 @@ pub fn gen_variants_fields_info(enum_name: &syn::Ident, 
data_enum: &DataEnum) ->
         .collect();
 
     quote! {
-        Ok(vec![
+        ::std::result::Result::Ok(::std::vec![
             #(#variant_info),*
         ])
     }
@@ -334,12 +334,12 @@ pub(crate) fn 
gen_named_variant_meta_type_impl_with_enum_name(
     quote! {
         struct #meta_type_ident;
 
-        impl fory_core::serializer::enum_::NamedEnumVariantMetaTrait for 
#meta_type_ident {
+        impl ::fory_core::serializer::enum_::NamedEnumVariantMetaTrait for 
#meta_type_ident {
             fn fory_get_sorted_field_names() -> &'static [&'static str] {
                 &[#(#field_name_literals),*]
             }
 
-            fn fory_fields_info(type_resolver: 
&fory_core::resolver::TypeResolver) -> Result<Vec<fory_core::meta::FieldInfo>, 
fory_core::error::Error> {
+            fn fory_fields_info(type_resolver: 
&::fory_core::resolver::TypeResolver) -> 
::std::result::Result<::std::vec::Vec<::fory_core::meta::FieldInfo>, 
::fory_core::error::Error> {
                 #fields_info_ts
             }
         }
@@ -348,7 +348,7 @@ pub(crate) fn 
gen_named_variant_meta_type_impl_with_enum_name(
 
 pub fn gen_write(_data_enum: &DataEnum) -> TokenStream {
     quote! {
-        fory_core::serializer::enum_::write::<Self>(self, context, ref_mode, 
write_type_info)
+        ::fory_core::serializer::enum_::write::<Self>(self, context, ref_mode, 
write_type_info)
     }
 }
 
@@ -378,7 +378,7 @@ fn xlang_variant_branches(data_enum: &DataEnum, 
default_variant_value: u32) -> V
                             Self::#ident => {
                                 context.writer.write_var_u32(#tag_value);
                                 // Write null flag for unit variant (no value)
-                                
context.writer.write_i8(fory_core::RefFlag::Null as i8);
+                                
context.writer.write_i8(::fory_core::RefFlag::Null as i8);
                             }
                         }
                     } else {
@@ -562,7 +562,7 @@ fn rust_compatible_variant_write_branches(
                         Self::#ident { #(#field_idents),* } => {
                             context.writer.write_var_u32((#tag_value << 2) | 
0b10);
                             // Write type meta inline using streaming protocol
-                            
context.write_type_meta(std::any::TypeId::of::<#meta_type_ident>())?;
+                            
context.write_type_meta(::std::any::TypeId::of::<#meta_type_ident>())?;
                             // Write fields same as struct
                             #(#write_fields)*
                         }
@@ -620,29 +620,29 @@ pub fn gen_write_type_info(data_enum: &DataEnum) -> 
TokenStream {
         // Union-compatible with data: write typed/named union type info in 
xlang mode
         quote! {
             if context.is_xlang() {
-                let rs_type_id = std::any::TypeId::of::<Self>();
-                context.write_any_type_info(fory_core::type_id::UNKNOWN, 
rs_type_id)?;
+                let rs_type_id = ::std::any::TypeId::of::<Self>();
+                context.write_any_type_info(::fory_core::type_id::UNKNOWN, 
rs_type_id)?;
                 Ok(())
             } else {
-                fory_core::serializer::enum_::write_type_info::<Self>(context)
+                
::fory_core::serializer::enum_::write_type_info::<Self>(context)
             }
         }
     } else {
         quote! {
-            fory_core::serializer::enum_::write_type_info::<Self>(context)
+            ::fory_core::serializer::enum_::write_type_info::<Self>(context)
         }
     }
 }
 
 pub fn gen_read(_: &DataEnum) -> TokenStream {
     quote! {
-        fory_core::serializer::enum_::read::<Self>(context, ref_mode, 
read_type_info)
+        ::fory_core::serializer::enum_::read::<Self>(context, ref_mode, 
read_type_info)
     }
 }
 
 pub fn gen_read_with_type_info(_: &DataEnum) -> TokenStream {
     quote! {
-        fory_core::serializer::enum_::read::<Self>(context, ref_mode, false)
+        ::fory_core::serializer::enum_::read::<Self>(context, ref_mode, false)
     }
 }
 
@@ -674,9 +674,9 @@ pub fn gen_static_type_id(data_enum: &DataEnum) -> 
TokenStream {
         .any(|v| !matches!(v.fields, Fields::Unit));
 
     if is_union_compatible && has_data_variants {
-        quote! { fory_core::TypeId::UNION }
+        quote! { ::fory_core::TypeId::UNION }
     } else {
-        quote! { fory_core::TypeId::ENUM }
+        quote! { ::fory_core::TypeId::ENUM }
     }
 }
 
@@ -854,7 +854,7 @@ fn rust_compatible_variant_read_branches(
                             // Unit variant should have variant_type == 0b0
                             if variant_type != 0b0 {
                                 // Variant type mismatch: skip the data and 
use default
-                                use 
fory_core::serializer::skip::skip_enum_variant;
+                                use 
::fory_core::serializer::skip::skip_enum_variant;
                                 skip_enum_variant(context, variant_type, 
&None)?;
                                 return Ok(#default_value);
                             }
@@ -880,7 +880,7 @@ fn rust_compatible_variant_read_branches(
                             // Unnamed variant should have variant_type == 0b1
                             if variant_type != 0b1 {
                                 // Variant type mismatch: skip the data and 
use default
-                                use 
fory_core::serializer::skip::skip_enum_variant;
+                                use 
::fory_core::serializer::skip::skip_enum_variant;
                                 skip_enum_variant(context, variant_type, 
&None)?;
                                 return Ok(#default_value);
                             }
@@ -891,7 +891,7 @@ fn rust_compatible_variant_read_branches(
                             #(#read_fields;)*
 
                             // Skip any extra elements
-                            use fory_core::serializer::skip::skip_any_value;
+                            use ::fory_core::serializer::skip::skip_any_value;
                             for _ in #field_count..len {
                                 skip_any_value(context, true)?;
                             }
@@ -931,7 +931,7 @@ fn rust_compatible_variant_read_branches(
                             if variant_type != 0b10 {
                                 // Variant type mismatch: peer didn't write 
meta for non-named variant
                                 // Skip the data and use default
-                                use 
fory_core::serializer::skip::skip_enum_variant;
+                                use 
::fory_core::serializer::skip::skip_enum_variant;
                                 skip_enum_variant(context, variant_type, 
&None)?;
                                 return Ok(#default_value);
                             }
@@ -1005,12 +1005,12 @@ pub fn gen_read_data(data_enum: &DataEnum) -> 
TokenStream {
     let unknown_xlang_branch = if is_union_compatible && has_data_variants {
         quote! {
             _ => {
-                use fory_core::serializer::skip::skip_any_value;
+                use ::fory_core::serializer::skip::skip_any_value;
                 skip_any_value(context, true)?;
                 if context.is_compatible() {
                     Ok(#default_variant_construction)
                 } else {
-                    return Err(fory_core::error::Error::unknown_enum("unknown 
enum value"));
+                    return 
Err(::fory_core::error::Error::unknown_enum("unknown enum value"));
                 }
             }
         }
@@ -1021,7 +1021,7 @@ pub fn gen_read_data(data_enum: &DataEnum) -> TokenStream 
{
                 if context.is_compatible() {
                     Ok(#default_variant_construction)
                 } else {
-                    return Err(fory_core::error::Error::unknown_enum("unknown 
enum value"));
+                    return 
Err(::fory_core::error::Error::unknown_enum("unknown enum value"));
                 }
             }
         }
@@ -1045,7 +1045,7 @@ pub fn gen_read_data(data_enum: &DataEnum) -> TokenStream 
{
                     _ => {
                         // Unknown variant in compatible mode: skip the data 
and use default variant
                         // variant_type: 0b0 = Unit, 0b1 = Unnamed, 0b10 = 
Named
-                        use fory_core::serializer::skip::skip_enum_variant;
+                        use ::fory_core::serializer::skip::skip_enum_variant;
                         // For named variants, we don't have type_info yet, so 
pass None
                         // skip_enum_variant will read it from the stream
                         skip_enum_variant(context, variant_type, &None)?;
@@ -1056,7 +1056,7 @@ pub fn gen_read_data(data_enum: &DataEnum) -> TokenStream 
{
                 let tag = context.reader.read_var_u32()?;
                 match tag {
                     #(#rust_variant_branches)*
-                    _ => return 
Err(fory_core::error::Error::unknown_enum("unknown enum value")),
+                    _ => return 
Err(::fory_core::error::Error::unknown_enum("unknown enum value")),
                 }
             }
         }
@@ -1079,19 +1079,19 @@ pub fn gen_read_type_info(data_enum: &DataEnum) -> 
TokenStream {
                 let type_info = context.read_any_type_info()?;
                 let remote_type_id = type_info.get_type_id();
                 if remote_type_id != expected_type_id {
-                    return Err(fory_core::error::Error::type_mismatch(
+                    return Err(::fory_core::error::Error::type_mismatch(
                         expected_type_id as u32,
                         remote_type_id as u32,
                     ));
                 }
                 Ok(())
             } else {
-                fory_core::serializer::enum_::read_type_info::<Self>(context)
+                ::fory_core::serializer::enum_::read_type_info::<Self>(context)
             }
         }
     } else {
         quote! {
-            fory_core::serializer::enum_::read_type_info::<Self>(context)
+            ::fory_core::serializer::enum_::read_type_info::<Self>(context)
         }
     }
 }
diff --git a/rust/fory-derive/src/object/field_codec.rs 
b/rust/fory-derive/src/object/field_codec.rs
index 8241c142d..e00acad29 100644
--- a/rust/fory-derive/src/object/field_codec.rs
+++ b/rust/fory-derive/src/object/field_codec.rs
@@ -50,7 +50,7 @@ impl<'a> ResolvedField<'a> {
         match &self.dispatch {
             FieldDispatch::Codec { codec_ty } => {
                 let value_ty = self.value_ty;
-                quote! { <#codec_ty as 
fory_core::serializer::codec::Codec<#value_ty>> }
+                quote! { <#codec_ty as 
::fory_core::serializer::codec::Codec<#value_ty>> }
             }
             FieldDispatch::Serializer { .. } => {
                 quote! { compile_error!("serializer-dispatched field has no 
codec call") }
@@ -67,8 +67,8 @@ impl<'a> ResolvedField<'a> {
             FieldDispatch::Serializer { .. } => {
                 let ty = self.value_ty;
                 quote! {
-                    <#ty as fory_core::Serializer>::fory_reserved_space()
-                        + fory_core::type_id::SIZE_OF_REF_AND_TYPE
+                    <#ty as ::fory_core::Serializer>::fory_reserved_space()
+                        + ::fory_core::type_id::SIZE_OF_REF_AND_TYPE
                 }
             }
         }
@@ -92,7 +92,7 @@ impl<'a> ResolvedField<'a> {
                 let ty = self.value_ty;
                 if serializer_field_can_use_data_path(self.source.field) {
                     quote! {
-                        <#ty as 
fory_core::Serializer>::fory_write_data_generic(
+                        <#ty as 
::fory_core::Serializer>::fory_write_data_generic(
                             #value,
                             context,
                             #has_generics
@@ -102,13 +102,13 @@ impl<'a> ResolvedField<'a> {
                     let ref_mode = 
serializer_ref_mode_for_field(self.source.field);
                     quote! {
                         let write_type_info = if context.is_compatible() {
-                            
fory_core::serializer::util::field_need_write_type_info(
-                                <#ty as 
fory_core::Serializer>::fory_static_type_id()
+                            
::fory_core::serializer::util::field_need_write_type_info(
+                                <#ty as 
::fory_core::Serializer>::fory_static_type_id()
                             )
                         } else {
-                            <#ty as 
fory_core::Serializer>::fory_is_polymorphic()
+                            <#ty as 
::fory_core::Serializer>::fory_is_polymorphic()
                         };
-                        <#ty as fory_core::Serializer>::fory_write(
+                        <#ty as ::fory_core::Serializer>::fory_write(
                             #value,
                             context,
                             #ref_mode,
@@ -143,7 +143,7 @@ impl<'a> ResolvedField<'a> {
             FieldDispatch::Serializer { has_generics, .. } => {
                 let ty = self.value_ty;
                 quote! {
-                    <#ty as fory_core::Serializer>::fory_write(
+                    <#ty as ::fory_core::Serializer>::fory_write(
                         #value,
                         context,
                         #ref_mode,
@@ -168,19 +168,19 @@ impl<'a> ResolvedField<'a> {
                 let ty = self.value_ty;
                 if serializer_field_can_use_data_path(self.source.field) {
                     quote! {
-                        let #var = <#ty as 
fory_core::Serializer>::fory_read_data(context)?;
+                        let #var = <#ty as 
::fory_core::Serializer>::fory_read_data(context)?;
                     }
                 } else {
                     let ref_mode = 
serializer_ref_mode_for_field(self.source.field);
                     quote! {
                         let read_type_info = if context.is_compatible() {
-                            
fory_core::serializer::util::field_need_read_type_info(
-                                <#ty as 
fory_core::Serializer>::fory_static_type_id() as u32
+                            
::fory_core::serializer::util::field_need_read_type_info(
+                                <#ty as 
::fory_core::Serializer>::fory_static_type_id() as u32
                             )
                         } else {
-                            <#ty as 
fory_core::Serializer>::fory_is_polymorphic()
+                            <#ty as 
::fory_core::Serializer>::fory_is_polymorphic()
                         };
-                        let #var = <#ty as fory_core::Serializer>::fory_read(
+                        let #var = <#ty as ::fory_core::Serializer>::fory_read(
                             context,
                             #ref_mode,
                             read_type_info
@@ -206,7 +206,7 @@ impl<'a> ResolvedField<'a> {
             FieldDispatch::Serializer { .. } => {
                 let ty = self.value_ty;
                 quote! {
-                    <#ty as fory_core::Serializer>::fory_read(context, 
#ref_mode, #read_type_info)?
+                    <#ty as ::fory_core::Serializer>::fory_read(context, 
#ref_mode, #read_type_info)?
                 }
             }
         }
@@ -242,11 +242,11 @@ impl<'a> ResolvedField<'a> {
                     )? {
                         #var = Some(value);
                     } else {
-                        let read_ref_flag = 
fory_core::serializer::util::field_need_write_ref_into(
+                        let read_ref_flag = 
::fory_core::serializer::util::field_need_write_ref_into(
                             remote_field_type.type_id,
                             remote_field_type.nullable,
                         );
-                        fory_core::serializer::skip::skip_field_value(context, 
remote_field_type, read_ref_flag)?;
+                        
::fory_core::serializer::skip::skip_field_value(context, remote_field_type, 
read_ref_flag)?;
                     }
                 }
             }
@@ -254,30 +254,30 @@ impl<'a> ResolvedField<'a> {
                 let ty = self.value_ty;
                 quote! {
                     let remote_field_type = &_field.field_type;
-                    if fory_core::serializer::codec::field_types_compatible(
+                    if ::fory_core::serializer::codec::field_types_compatible(
                         local_field_type,
                         remote_field_type,
                     ) {
                         let read_ref_mode =
-                            
fory_core::serializer::codec::field_ref_mode(remote_field_type);
+                            
::fory_core::serializer::codec::field_ref_mode(remote_field_type);
                         let read_type_info = if context.is_compatible() {
-                            
fory_core::serializer::util::field_need_read_type_info(
+                            
::fory_core::serializer::util::field_need_read_type_info(
                                 remote_field_type.type_id
                             )
                         } else {
-                            <#ty as 
fory_core::Serializer>::fory_is_polymorphic()
+                            <#ty as 
::fory_core::Serializer>::fory_is_polymorphic()
                         };
-                        #var = Some(<#ty as fory_core::Serializer>::fory_read(
+                        #var = Some(<#ty as 
::fory_core::Serializer>::fory_read(
                             context,
                             read_ref_mode,
                             read_type_info,
                         )?);
                     } else {
-                        let read_ref_flag = 
fory_core::serializer::util::field_need_write_ref_into(
+                        let read_ref_flag = 
::fory_core::serializer::util::field_need_write_ref_into(
                             remote_field_type.type_id,
                             remote_field_type.nullable,
                         );
-                        fory_core::serializer::skip::skip_field_value(context, 
remote_field_type, read_ref_flag)?;
+                        
::fory_core::serializer::skip::skip_field_value(context, remote_field_type, 
read_ref_flag)?;
                     }
                 }
             }
@@ -291,7 +291,7 @@ impl<'a> ResolvedField<'a> {
             FieldDispatch::Codec { .. } => {
                 let call = self.codec_call();
                 quote! {
-                    fory_core::meta::FieldInfo::new_with_id(
+                    ::fory_core::meta::FieldInfo::new_with_id(
                         #field_id,
                         #name,
                         #call::field_type(type_resolver)?
@@ -300,7 +300,7 @@ impl<'a> ResolvedField<'a> {
             }
             FieldDispatch::Serializer { field_type, .. } => {
                 quote! {
-                    fory_core::meta::FieldInfo::new_with_id(
+                    ::fory_core::meta::FieldInfo::new_with_id(
                         #field_id,
                         #name,
                         #field_type
@@ -414,7 +414,7 @@ pub(crate) fn codec_type_for(
         };
         let inner_codec = codec_type_for(&inner, &inner_meta, false, false)?;
         return Ok(quote! {
-            fory_core::serializer::codec::OptionCodec<#inner, #inner_codec, 
#track_ref>
+            ::fory_core::serializer::codec::OptionCodec<#inner, #inner_codec, 
#track_ref>
         });
     }
 
@@ -444,7 +444,7 @@ pub(crate) fn codec_type_for(
                     return Err(syn::Error::new_spanned(ty, "bytes schema 
requires Vec<u8>"));
                 }
                 return Ok(quote! {
-                    fory_core::serializer::codec::SerializerCodec<#ty, 
#nullable, #track_ref>
+                    ::fory_core::serializer::codec::SerializerCodec<#ty, 
#nullable, #track_ref>
                 });
             }
             if meta.array {
@@ -456,7 +456,7 @@ pub(crate) fn codec_type_for(
                 }
                 let type_id = 
primitive_array_type_id_for_vec_element(elem_ty)?;
                 return Ok(quote! {
-                    fory_core::serializer::codec::PrimitiveArrayVecCodec<
+                    ::fory_core::serializer::codec::PrimitiveArrayVecCodec<
                         #elem_ty,
                         #type_id,
                         #nullable,
@@ -474,7 +474,7 @@ pub(crate) fn codec_type_for(
                     elem_meta.effective_ref(elem_class),
                 )?;
                 return Ok(quote! {
-                    fory_core::serializer::codec::VecCodec<#elem_ty, 
#elem_codec, #nullable, #track_ref>
+                    ::fory_core::serializer::codec::VecCodec<#elem_ty, 
#elem_codec, #nullable, #track_ref>
                 });
             }
             let elem_meta = meta.element_meta();
@@ -483,7 +483,7 @@ pub(crate) fn codec_type_for(
             let elem_track_ref = elem_meta.effective_ref(elem_class);
             let elem_codec = codec_type_for(elem_ty, &elem_meta, 
elem_nullable, elem_track_ref)?;
             return Ok(quote! {
-                fory_core::serializer::codec::VecCodec<#elem_ty, #elem_codec, 
#nullable, #track_ref>
+                ::fory_core::serializer::codec::VecCodec<#elem_ty, 
#elem_codec, #nullable, #track_ref>
             });
         }
         if name == "HashMap" {
@@ -535,11 +535,11 @@ pub(crate) fn codec_type_for(
                     || contains_exact_any_object(value_ty)
                 {
                     return Ok(quote! {
-                        fory_core::serializer::codec::HashMapCodec<#key_ty, 
#value_ty, #key_codec, #value_codec, #nullable, #track_ref>
+                        ::fory_core::serializer::codec::HashMapCodec<#key_ty, 
#value_ty, #key_codec, #value_codec, #nullable, #track_ref>
                     });
                 }
                 return Ok(quote! {
-                    fory_core::serializer::codec::MapSerializerCodec<
+                    ::fory_core::serializer::codec::MapSerializerCodec<
                         #ty,
                         #key_ty,
                         #value_ty,
@@ -573,7 +573,7 @@ pub(crate) fn codec_type_for(
                 value_meta.effective_ref(value_class),
             )?;
             return Ok(quote! {
-                fory_core::serializer::codec::HashMapCodec<#key_ty, #value_ty, 
#key_codec, #value_codec, #nullable, #track_ref>
+                ::fory_core::serializer::codec::HashMapCodec<#key_ty, 
#value_ty, #key_codec, #value_codec, #nullable, #track_ref>
             });
         }
         if name == "HashSet" {
@@ -617,11 +617,11 @@ pub(crate) fn codec_type_for(
                 elem_meta.effective_ref(elem_class),
             )?;
             return Ok(quote! {
-                fory_core::serializer::codec::CollectionSerializerCodec<
+                ::fory_core::serializer::codec::CollectionSerializerCodec<
                     #ty,
                     #elem_ty,
                     #elem_codec,
-                    { fory_core::type_id::TypeId::SET as u8 },
+                    { ::fory_core::type_id::TypeId::SET as u8 },
                     #nullable,
                     #track_ref
                 >
@@ -640,7 +640,7 @@ pub(crate) fn codec_type_for(
             )?;
             let type_id = serializer_backed_collection_type_id(&name);
             return Ok(quote! {
-                fory_core::serializer::codec::CollectionSerializerCodec<
+                ::fory_core::serializer::codec::CollectionSerializerCodec<
                     #ty,
                     #elem_ty,
                     #elem_codec,
@@ -670,7 +670,7 @@ pub(crate) fn codec_type_for(
                 value_meta.effective_ref(value_class),
             )?;
             return Ok(quote! {
-                fory_core::serializer::codec::MapSerializerCodec<
+                ::fory_core::serializer::codec::MapSerializerCodec<
                     #ty,
                     #key_ty,
                     #value_ty,
@@ -725,11 +725,11 @@ pub(crate) fn codec_type_for(
                 elem_meta.effective_ref(elem_class),
             )?;
             return Ok(quote! {
-                fory_core::serializer::codec::CollectionSerializerCodec<
+                ::fory_core::serializer::codec::CollectionSerializerCodec<
                     #ty,
                     #elem_ty,
                     #elem_codec,
-                    { fory_core::type_id::TypeId::LIST as u8 },
+                    { ::fory_core::type_id::TypeId::LIST as u8 },
                     #nullable,
                     #track_ref
                 >
@@ -738,13 +738,13 @@ pub(crate) fn codec_type_for(
     }
 
     if is_exact_any(ty, "Box") {
-        return Ok(quote! { 
fory_core::serializer::codec::AnyBoxCodec<#nullable, #track_ref> });
+        return Ok(quote! { 
::fory_core::serializer::codec::AnyBoxCodec<#nullable, #track_ref> });
     }
     if is_exact_any(ty, "Rc") {
-        return Ok(quote! { fory_core::serializer::codec::AnyRcCodec<#nullable, 
#track_ref> });
+        return Ok(quote! { 
::fory_core::serializer::codec::AnyRcCodec<#nullable, #track_ref> });
     }
     if is_exact_any(ty, "Arc") {
-        return Ok(quote! { 
fory_core::serializer::codec::AnyArcCodec<#nullable, #track_ref> });
+        return Ok(quote! { 
::fory_core::serializer::codec::AnyArcCodec<#nullable, #track_ref> });
     }
 
     if let Some((_, trait_name)) = is_box_dyn_trait(ty) {
@@ -789,7 +789,7 @@ pub(crate) fn codec_type_for(
         return Ok(codec);
     }
 
-    Ok(quote! { fory_core::serializer::codec::SerializerCodec<#ty, #nullable, 
#track_ref> })
+    Ok(quote! { ::fory_core::serializer::codec::SerializerCodec<#ty, 
#nullable, #track_ref> })
 }
 
 fn is_vec_type(ty: &Type) -> bool {
@@ -807,9 +807,9 @@ fn integer_codec_type(
     match type_name.as_str() {
         "i32" => {
             let wire = match encoding {
-                IntEncoding::Fixed => quote! { { 
fory_core::type_id::TypeId::INT32 as u8 } },
+                IntEncoding::Fixed => quote! { { 
::fory_core::type_id::TypeId::INT32 as u8 } },
                 IntEncoding::Varint => {
-                    quote! { { fory_core::type_id::TypeId::VARINT32 as u8 } }
+                    quote! { { ::fory_core::type_id::TypeId::VARINT32 as u8 } }
                 }
                 IntEncoding::Tagged => {
                     return Some(quote! {
@@ -817,25 +817,25 @@ fn integer_codec_type(
                     });
                 }
             };
-            Some(quote! { fory_core::serializer::codec::I32Codec<#wire, 
#nullable, #track_ref> })
+            Some(quote! { ::fory_core::serializer::codec::I32Codec<#wire, 
#nullable, #track_ref> })
         }
         "i64" => {
             let wire = match encoding {
-                IntEncoding::Fixed => quote! { { 
fory_core::type_id::TypeId::INT64 as u8 } },
+                IntEncoding::Fixed => quote! { { 
::fory_core::type_id::TypeId::INT64 as u8 } },
                 IntEncoding::Varint => {
-                    quote! { { fory_core::type_id::TypeId::VARINT64 as u8 } }
+                    quote! { { ::fory_core::type_id::TypeId::VARINT64 as u8 } }
                 }
                 IntEncoding::Tagged => {
-                    quote! { { fory_core::type_id::TypeId::TAGGED_INT64 as u8 
} }
+                    quote! { { ::fory_core::type_id::TypeId::TAGGED_INT64 as 
u8 } }
                 }
             };
-            Some(quote! { fory_core::serializer::codec::I64Codec<#wire, 
#nullable, #track_ref> })
+            Some(quote! { ::fory_core::serializer::codec::I64Codec<#wire, 
#nullable, #track_ref> })
         }
         "u32" => {
             let wire = match encoding {
-                IntEncoding::Fixed => quote! { { 
fory_core::type_id::TypeId::UINT32 as u8 } },
+                IntEncoding::Fixed => quote! { { 
::fory_core::type_id::TypeId::UINT32 as u8 } },
                 IntEncoding::Varint => {
-                    quote! { { fory_core::type_id::TypeId::VAR_UINT32 as u8 } }
+                    quote! { { ::fory_core::type_id::TypeId::VAR_UINT32 as u8 
} }
                 }
                 IntEncoding::Tagged => {
                     return Some(quote! {
@@ -843,19 +843,19 @@ fn integer_codec_type(
                     });
                 }
             };
-            Some(quote! { fory_core::serializer::codec::U32Codec<#wire, 
#nullable, #track_ref> })
+            Some(quote! { ::fory_core::serializer::codec::U32Codec<#wire, 
#nullable, #track_ref> })
         }
         "u64" => {
             let wire = match encoding {
-                IntEncoding::Fixed => quote! { { 
fory_core::type_id::TypeId::UINT64 as u8 } },
+                IntEncoding::Fixed => quote! { { 
::fory_core::type_id::TypeId::UINT64 as u8 } },
                 IntEncoding::Varint => {
-                    quote! { { fory_core::type_id::TypeId::VAR_UINT64 as u8 } }
+                    quote! { { ::fory_core::type_id::TypeId::VAR_UINT64 as u8 
} }
                 }
                 IntEncoding::Tagged => {
-                    quote! { { fory_core::type_id::TypeId::TAGGED_UINT64 as u8 
} }
+                    quote! { { ::fory_core::type_id::TypeId::TAGGED_UINT64 as 
u8 } }
                 }
             };
-            Some(quote! { fory_core::serializer::codec::U64Codec<#wire, 
#nullable, #track_ref> })
+            Some(quote! { ::fory_core::serializer::codec::U64Codec<#wire, 
#nullable, #track_ref> })
         }
         _ => {
             if meta.encoding.is_some() {
@@ -886,7 +886,9 @@ fn type_name_and_args(
 }
 
 fn vec_element_type_name(ty: &Type) -> Option<String> {
-    Some(ty.to_token_stream().to_string().replace(' ', ""))
+    type_name_and_args(ty)
+        .map(|(name, _)| name)
+        .or_else(|| Some(ty.to_token_stream().to_string().replace(' ', "")))
 }
 
 fn single_type_arg<'a>(
@@ -994,13 +996,13 @@ fn field_type_expr_for(ty: &Type, nullable: bool, 
track_ref: bool) -> syn::Resul
 
     if let Type::Array(array) = ty {
         let type_id = get_type_id_by_type_ast(ty);
-        if fory_core::type_id::PRIMITIVE_ARRAY_TYPES.contains(&type_id) {
+        if ::fory_core::type_id::PRIMITIVE_ARRAY_TYPES.contains(&type_id) {
             return Ok(field_type_literal(type_id, nullable, track_ref, 
Vec::new()));
         }
         let elem_ty = array.elem.as_ref();
         let elem_type = nested_field_type_expr(elem_ty)?;
         return Ok(field_type_literal(
-            fory_core::type_id::TypeId::LIST as u32,
+            ::fory_core::type_id::TypeId::LIST as u32,
             nullable,
             track_ref,
             vec![elem_type],
@@ -1009,14 +1011,14 @@ fn field_type_expr_for(ty: &Type, nullable: bool, 
track_ref: bool) -> syn::Resul
 
     if matches!(ty, Type::Tuple(_)) {
         return Ok(field_type_literal(
-            fory_core::type_id::TypeId::LIST as u32,
+            ::fory_core::type_id::TypeId::LIST as u32,
             nullable,
             track_ref,
             vec![quote! {
-                fory_core::meta::FieldType::new(
-                    fory_core::type_id::TypeId::UNKNOWN as u32,
+                ::fory_core::meta::FieldType::new(
+                    ::fory_core::type_id::TypeId::UNKNOWN as u32,
                     true,
-                    Vec::new(),
+                    ::std::vec::Vec::new(),
                 )
             }],
         ));
@@ -1028,7 +1030,7 @@ fn field_type_expr_for(ty: &Type, nullable: bool, 
track_ref: bool) -> syn::Resul
                 let elem_ty = single_type_arg(args, ty, "Vec")?;
                 let elem_type = nested_field_type_expr(elem_ty)?;
                 return Ok(field_type_literal(
-                    fory_core::type_id::TypeId::LIST as u32,
+                    ::fory_core::type_id::TypeId::LIST as u32,
                     nullable,
                     track_ref,
                     vec![elem_type],
@@ -1038,7 +1040,7 @@ fn field_type_expr_for(ty: &Type, nullable: bool, 
track_ref: bool) -> syn::Resul
                 let elem_ty = single_type_arg(args, ty, &name)?;
                 let elem_type = nested_field_type_expr(elem_ty)?;
                 return Ok(field_type_literal(
-                    fory_core::type_id::TypeId::LIST as u32,
+                    ::fory_core::type_id::TypeId::LIST as u32,
                     nullable,
                     track_ref,
                     vec![elem_type],
@@ -1048,7 +1050,7 @@ fn field_type_expr_for(ty: &Type, nullable: bool, 
track_ref: bool) -> syn::Resul
                 let elem_ty = single_type_arg(args, ty, &name)?;
                 let elem_type = nested_field_type_expr(elem_ty)?;
                 return Ok(field_type_literal(
-                    fory_core::type_id::TypeId::SET as u32,
+                    ::fory_core::type_id::TypeId::SET as u32,
                     nullable,
                     track_ref,
                     vec![elem_type],
@@ -1059,7 +1061,7 @@ fn field_type_expr_for(ty: &Type, nullable: bool, 
track_ref: bool) -> syn::Resul
                 let key_type = nested_field_type_expr(key_ty)?;
                 let value_type = nested_field_type_expr(value_ty)?;
                 return Ok(field_type_literal(
-                    fory_core::type_id::TypeId::MAP as u32,
+                    ::fory_core::type_id::TypeId::MAP as u32,
                     nullable,
                     track_ref,
                     vec![key_type, value_type],
@@ -1079,7 +1081,7 @@ fn nested_field_type_expr(ty: &Type) -> 
syn::Result<TokenStream> {
     let track_ref = meta.effective_ref(class);
     let codec_ty = codec_type_for(ty, &meta, nullable, track_ref)?;
     Ok(quote! {
-        <#codec_ty as 
fory_core::serializer::codec::Codec<#ty>>::field_type(type_resolver)?
+        <#codec_ty as 
::fory_core::serializer::codec::Codec<#ty>>::field_type(type_resolver)?
     })
 }
 
@@ -1090,30 +1092,30 @@ fn field_type_literal(
     generics: Vec<TokenStream>,
 ) -> TokenStream {
     quote! {
-        fory_core::meta::FieldType::new_with_ref(
+        ::fory_core::meta::FieldType::new_with_ref(
             #type_id,
             #nullable,
             #track_ref,
-            vec![#(#generics),*],
+            ::std::vec![#(#generics),*],
         )
     }
 }
 
 fn serializer_field_type_expr(ty: &Type, nullable: bool, track_ref: bool) -> 
TokenStream {
     quote! {
-        <fory_core::serializer::codec::SerializerCodec<#ty, #nullable, 
#track_ref>
-            as 
fory_core::serializer::codec::Codec<#ty>>::field_type(type_resolver)?
+        <::fory_core::serializer::codec::SerializerCodec<#ty, #nullable, 
#track_ref>
+            as 
::fory_core::serializer::codec::Codec<#ty>>::field_type(type_resolver)?
     }
 }
 
 fn serializer_ref_mode_for_field(field: &syn::Field) -> TokenStream {
     let (nullable, track_ref) = serializer_field_markers(field);
     if track_ref {
-        quote! { fory_core::RefMode::Tracking }
+        quote! { ::fory_core::RefMode::Tracking }
     } else if nullable {
-        quote! { fory_core::RefMode::NullOnly }
+        quote! { ::fory_core::RefMode::NullOnly }
     } else {
-        quote! { fory_core::RefMode::None }
+        quote! { ::fory_core::RefMode::None }
     }
 }
 
@@ -1135,23 +1137,27 @@ fn is_serializer_backed_collection(name: &str) -> bool {
 }
 
 fn primitive_array_type_id_for_vec_element(ty: &Type) -> 
syn::Result<TokenStream> {
-    let type_name = ty.to_token_stream().to_string().replace(' ', "");
+    let type_name = type_name_and_args(ty)
+        .map(|(name, _)| name)
+        .unwrap_or_else(|| ty.to_token_stream().to_string().replace(' ', ""));
     match type_name.as_str() {
-        "bool" => Ok(quote! { { fory_core::type_id::TypeId::BOOL_ARRAY as u8 } 
}),
-        "i8" => Ok(quote! { { fory_core::type_id::TypeId::INT8_ARRAY as u8 } 
}),
-        "i16" => Ok(quote! { { fory_core::type_id::TypeId::INT16_ARRAY as u8 } 
}),
-        "i32" => Ok(quote! { { fory_core::type_id::TypeId::INT32_ARRAY as u8 } 
}),
-        "i64" => Ok(quote! { { fory_core::type_id::TypeId::INT64_ARRAY as u8 } 
}),
-        "u8" => Ok(quote! { { fory_core::type_id::TypeId::UINT8_ARRAY as u8 } 
}),
-        "u16" => Ok(quote! { { fory_core::type_id::TypeId::UINT16_ARRAY as u8 
} }),
-        "u32" => Ok(quote! { { fory_core::type_id::TypeId::UINT32_ARRAY as u8 
} }),
-        "u64" => Ok(quote! { { fory_core::type_id::TypeId::UINT64_ARRAY as u8 
} }),
-        "float16" | "Float16" => Ok(quote! { { 
fory_core::type_id::TypeId::FLOAT16_ARRAY as u8 } }),
+        "bool" => Ok(quote! { { ::fory_core::type_id::TypeId::BOOL_ARRAY as u8 
} }),
+        "i8" => Ok(quote! { { ::fory_core::type_id::TypeId::INT8_ARRAY as u8 } 
}),
+        "i16" => Ok(quote! { { ::fory_core::type_id::TypeId::INT16_ARRAY as u8 
} }),
+        "i32" => Ok(quote! { { ::fory_core::type_id::TypeId::INT32_ARRAY as u8 
} }),
+        "i64" => Ok(quote! { { ::fory_core::type_id::TypeId::INT64_ARRAY as u8 
} }),
+        "u8" => Ok(quote! { { ::fory_core::type_id::TypeId::UINT8_ARRAY as u8 
} }),
+        "u16" => Ok(quote! { { ::fory_core::type_id::TypeId::UINT16_ARRAY as 
u8 } }),
+        "u32" => Ok(quote! { { ::fory_core::type_id::TypeId::UINT32_ARRAY as 
u8 } }),
+        "u64" => Ok(quote! { { ::fory_core::type_id::TypeId::UINT64_ARRAY as 
u8 } }),
+        "float16" | "Float16" => {
+            Ok(quote! { { ::fory_core::type_id::TypeId::FLOAT16_ARRAY as u8 } 
})
+        }
         "bfloat16" | "BFloat16" => {
-            Ok(quote! { { fory_core::type_id::TypeId::BFLOAT16_ARRAY as u8 } })
+            Ok(quote! { { ::fory_core::type_id::TypeId::BFLOAT16_ARRAY as u8 } 
})
         }
-        "f32" => Ok(quote! { { fory_core::type_id::TypeId::FLOAT32_ARRAY as u8 
} }),
-        "f64" => Ok(quote! { { fory_core::type_id::TypeId::FLOAT64_ARRAY as u8 
} }),
+        "f32" => Ok(quote! { { ::fory_core::type_id::TypeId::FLOAT32_ARRAY as 
u8 } }),
+        "f64" => Ok(quote! { { ::fory_core::type_id::TypeId::FLOAT64_ARRAY as 
u8 } }),
         _ => Err(syn::Error::new_spanned(
             ty,
             "array requires a non-null number or bool Vec element type",
@@ -1161,8 +1167,8 @@ fn primitive_array_type_id_for_vec_element(ty: &Type) -> 
syn::Result<TokenStream
 
 fn serializer_backed_collection_type_id(name: &str) -> TokenStream {
     match name {
-        "BTreeSet" | "BinaryHeap" => quote! { { 
fory_core::type_id::TypeId::SET as u8 } },
-        _ => quote! { { fory_core::type_id::TypeId::LIST as u8 } },
+        "BTreeSet" | "BinaryHeap" => quote! { { 
::fory_core::type_id::TypeId::SET as u8 } },
+        _ => quote! { { ::fory_core::type_id::TypeId::LIST as u8 } },
     }
 }
 
@@ -1270,7 +1276,7 @@ fn is_exact_any(ty: &Type, owner: &str) -> bool {
 }
 
 fn is_primitive_array_type(ty: &Type) -> bool {
-    
fory_core::type_id::PRIMITIVE_ARRAY_TYPES.contains(&get_type_id_by_type_ast(ty))
+    
::fory_core::type_id::PRIMITIVE_ARRAY_TYPES.contains(&get_type_id_by_type_ast(ty))
 }
 
 pub(crate) fn default_expr_for_type(ty: &Type) -> TokenStream {
@@ -1279,8 +1285,8 @@ pub(crate) fn default_expr_for_type(ty: &Type) -> 
TokenStream {
         let trait_ident = format_ident!("{}", trait_name);
         return quote! {
             {
-                let wrapper = <#wrapper_ty as 
fory_core::ForyDefault>::fory_default();
-                std::rc::Rc::<dyn #trait_ident>::from(wrapper)
+                let wrapper = <#wrapper_ty as 
::fory_core::ForyDefault>::fory_default();
+                ::std::rc::Rc::<dyn #trait_ident>::from(wrapper)
             }
         };
     }
@@ -1289,12 +1295,12 @@ pub(crate) fn default_expr_for_type(ty: &Type) -> 
TokenStream {
         let trait_ident = format_ident!("{}", trait_name);
         return quote! {
             {
-                let wrapper = <#wrapper_ty as 
fory_core::ForyDefault>::fory_default();
-                std::sync::Arc::<dyn #trait_ident>::from(wrapper)
+                let wrapper = <#wrapper_ty as 
::fory_core::ForyDefault>::fory_default();
+                ::std::sync::Arc::<dyn #trait_ident>::from(wrapper)
             }
         };
     }
-    quote! { <#ty as fory_core::ForyDefault>::fory_default() }
+    quote! { <#ty as ::fory_core::ForyDefault>::fory_default() }
 }
 
 #[cfg(test)]
diff --git a/rust/fory-derive/src/object/misc.rs 
b/rust/fory-derive/src/object/misc.rs
index 63d730700..073fcfd50 100644
--- a/rust/fory-derive/src/object/misc.rs
+++ b/rust/fory-derive/src/object/misc.rs
@@ -38,18 +38,17 @@ fn hash(fields: &[&Field]) -> TokenStream {
         let ty = &field.ty;
         let name = super::util::get_field_name(field, idx);
         quote! {
-            (#name, <#ty as 
fory_core::serializer::Serializer>::fory_get_type_id())
+            (#name, <#ty as 
::fory_core::serializer::Serializer>::fory_get_type_id())
         }
     });
 
     quote! {
         fn fory_hash() -> u32 {
-            use std::sync::Once;
             static mut name_hash: u32 = 0u32;
-            static name_hash_once: Once = Once::new();
+            static name_hash_once: ::std::sync::Once = 
::std::sync::Once::new();
             unsafe {
                 name_hash_once.call_once(|| {
-                        name_hash = 
fory_core::meta::compute_struct_hash(vec![#(#props),*]);
+                        name_hash = 
::fory_core::meta::compute_struct_hash(::std::vec![#(#props),*]);
                 });
                 name_hash
             }
@@ -59,16 +58,16 @@ fn hash(fields: &[&Field]) -> TokenStream {
 
 pub fn gen_actual_type_id() -> TokenStream {
     quote! {
-        fory_core::serializer::struct_::actual_type_id(type_id, 
register_by_name, compatible)
+        ::fory_core::serializer::struct_::actual_type_id(type_id, 
register_by_name, compatible)
     }
 }
 
 pub fn gen_actual_type_id_no_evolving() -> TokenStream {
     quote! {
         if register_by_name {
-            fory_core::type_id::TypeId::NAMED_STRUCT as u32
+            ::fory_core::type_id::TypeId::NAMED_STRUCT as u32
         } else {
-            fory_core::type_id::TypeId::STRUCT as u32
+            ::fory_core::type_id::TypeId::STRUCT as u32
         }
     }
 }
@@ -94,9 +93,9 @@ pub fn gen_field_fields_info(source_fields: 
&[SourceField<'_>]) -> TokenStream {
     let static_field_names = get_sort_fields_ts(&fields);
 
     quote! {
-        let mut field_infos: Vec<fory_core::meta::FieldInfo> = 
vec![#(#field_infos),*];
+        let mut field_infos: ::std::vec::Vec<::fory_core::meta::FieldInfo> = 
::std::vec![#(#field_infos),*];
         let sorted_field_names = #static_field_names;
-        fory_core::meta::sort_fields(&mut field_infos, sorted_field_names)?;
-        Ok(field_infos)
+        ::fory_core::meta::sort_fields(&mut field_infos, sorted_field_names)?;
+        ::std::result::Result::Ok(field_infos)
     }
 }
diff --git a/rust/fory-derive/src/object/read.rs 
b/rust/fory-derive/src/object/read.rs
index 00b5508e5..e41b92d15 100644
--- a/rust/fory-derive/src/object/read.rs
+++ b/rust/fory-derive/src/object/read.rs
@@ -80,7 +80,7 @@ pub(crate) fn assign_value(source_fields: &[SourceField<'_>]) 
-> Vec<TokenStream
 
 pub fn gen_read_type_info() -> TokenStream {
     quote! {
-        fory_core::serializer::struct_::read_type_info_fast::<Self>(context)
+        ::fory_core::serializer::struct_::read_type_info_fast::<Self>(context)
     }
 }
 
@@ -104,16 +104,16 @@ fn get_source_fields_loop_ts(source_fields: 
&[SourceField<'_>]) -> TokenStream {
                     );
                     let private_ident = &binding.private_ident;
                     quote! {
-                        
fory_core::serializer::struct_::struct_before_read_field(
+                        
::fory_core::serializer::struct_::struct_before_read_field(
                             #struct_name_lit,
                             #field_name_lit,
                             context,
                         );
                         #base
-                        
fory_core::serializer::struct_::struct_after_read_field(
+                        
::fory_core::serializer::struct_::struct_after_read_field(
                             #struct_name_lit,
                             #field_name_lit,
-                            (&#private_ident) as &dyn std::any::Any,
+                            (&#private_ident) as &dyn ::std::any::Any,
                             context,
                         );
                     }
@@ -168,9 +168,9 @@ pub fn gen_read_data(source_fields: &[SourceField<'_>]) -> 
TokenStream {
         // Read and check version hash when class version checking is enabled
         if context.is_check_struct_version() {
             let read_version = context.reader.read_i32()?;
-            let type_name = std::any::type_name::<Self>();
+            let type_name = ::std::any::type_name::<Self>();
             let local_version: i32 = #version_hash_ts;
-            fory_core::meta::TypeMeta::check_struct_version(read_version, 
local_version, type_name)?;
+            ::fory_core::meta::TypeMeta::check_struct_version(read_version, 
local_version, type_name)?;
         }
         #read_fields
         #self_construction
@@ -182,37 +182,37 @@ pub fn gen_read(_struct_ident: &Ident) -> TokenStream {
     // When the struct has generics (e.g., LeaderId<C>), using `Self` ensures 
the full
     // type with generics is used in the impl block.
     quote! {
-        let ref_flag = if ref_mode != fory_core::RefMode::None {
+        let ref_flag = if ref_mode != ::fory_core::RefMode::None {
             context.reader.read_i8()?
         } else {
-            fory_core::RefFlag::NotNullValue as i8
+            ::fory_core::RefFlag::NotNullValue as i8
         };
-        if ref_flag == (fory_core::RefFlag::NotNullValue as i8) || ref_flag == 
(fory_core::RefFlag::RefValue as i8) {
+        if ref_flag == (::fory_core::RefFlag::NotNullValue as i8) || ref_flag 
== (::fory_core::RefFlag::RefValue as i8) {
             // For RefValueFlag with Tracking mode, reserve a ref_id to 
participate in ref tracking.
             // This is needed for xlang compatibility where all objects (not 
just Rc/Arc)
             // participate in reference tracking when ref tracking is enabled.
             // Only reserve for Tracking mode, not NullOnly mode.
-            if ref_flag == (fory_core::RefFlag::RefValue as i8) && ref_mode == 
fory_core::RefMode::Tracking {
+            if ref_flag == (::fory_core::RefFlag::RefValue as i8) && ref_mode 
== ::fory_core::RefMode::Tracking {
                 context.ref_reader.reserve_ref_id();
             }
             if context.is_compatible() {
                 let type_info = if read_type_info {
                     context.read_any_type_info()?
                 } else {
-                    let rs_type_id = std::any::TypeId::of::<Self>();
+                    let rs_type_id = ::std::any::TypeId::of::<Self>();
                     context.get_type_info(&rs_type_id)?
                 };
-                <Self as 
fory_core::StructSerializer>::fory_read_compatible(context, type_info)
+                <Self as 
::fory_core::StructSerializer>::fory_read_compatible(context, type_info)
             } else {
                 if read_type_info {
-                    <Self as 
fory_core::Serializer>::fory_read_type_info(context)?;
+                    <Self as 
::fory_core::Serializer>::fory_read_type_info(context)?;
                 }
-                <Self as fory_core::Serializer>::fory_read_data(context)
+                <Self as ::fory_core::Serializer>::fory_read_data(context)
             }
-        } else if ref_flag == (fory_core::RefFlag::Null as i8) {
-            Ok(<Self as fory_core::ForyDefault>::fory_default())
+        } else if ref_flag == (::fory_core::RefFlag::Null as i8) {
+            Ok(<Self as ::fory_core::ForyDefault>::fory_default())
         } else {
-            Err(fory_core::error::Error::invalid_ref(format!("Unknown ref 
flag, value:{ref_flag}")))
+            Err(::fory_core::error::Error::invalid_ref(format!("Unknown ref 
flag, value:{ref_flag}")))
         }
     }
 }
@@ -225,21 +225,21 @@ pub fn gen_read_with_type_info() -> TokenStream {
     // ) -> Result<Self, Error>
     // Note: We use `Self` instead of `#struct_ident` to correctly handle 
generic types.
     quote! {
-        let ref_flag = if ref_mode != fory_core::RefMode::None {
+        let ref_flag = if ref_mode != ::fory_core::RefMode::None {
             context.reader.read_i8()?
         } else {
-            fory_core::RefFlag::NotNullValue as i8
+            ::fory_core::RefFlag::NotNullValue as i8
         };
-        if ref_flag == (fory_core::RefFlag::NotNullValue as i8) || ref_flag == 
(fory_core::RefFlag::RefValue as i8) {
+        if ref_flag == (::fory_core::RefFlag::NotNullValue as i8) || ref_flag 
== (::fory_core::RefFlag::RefValue as i8) {
             if context.is_compatible() {
-                <Self as 
fory_core::StructSerializer>::fory_read_compatible(context, type_info)
+                <Self as 
::fory_core::StructSerializer>::fory_read_compatible(context, type_info)
             } else {
-                <Self as fory_core::Serializer>::fory_read_data(context)
+                <Self as ::fory_core::Serializer>::fory_read_data(context)
             }
-        } else if ref_flag == (fory_core::RefFlag::Null as i8) {
-            Ok(<Self as fory_core::ForyDefault>::fory_default())
+        } else if ref_flag == (::fory_core::RefFlag::Null as i8) {
+            Ok(<Self as ::fory_core::ForyDefault>::fory_default())
         } else {
-            Err(fory_core::error::Error::invalid_ref(format!("Unknown ref 
flag, value:{ref_flag}")))
+            Err(::fory_core::error::Error::invalid_ref(format!("Unknown ref 
flag, value:{ref_flag}")))
         }
     }
 }
@@ -291,19 +291,19 @@ pub(crate) fn gen_read_compatible_with_construction(
         quote! {
             _ => {
                 let field_type = &_field.field_type;
-                let read_ref_flag = 
fory_core::serializer::util::field_need_write_ref_into(
+                let read_ref_flag = 
::fory_core::serializer::util::field_need_write_ref_into(
                     field_type.type_id,
                     field_type.nullable,
                 );
                 let field_name = _field.field_name.as_str();
-                fory_core::serializer::struct_::struct_before_read_field(
+                ::fory_core::serializer::struct_::struct_before_read_field(
                     #struct_name_lit,
                     field_name,
                     context,
                 );
-                fory_core::serializer::skip::skip_field_value(context, 
&field_type, read_ref_flag)?;
-                let placeholder: &dyn std::any::Any = &();
-                fory_core::serializer::struct_::struct_after_read_field(
+                ::fory_core::serializer::skip::skip_field_value(context, 
&field_type, read_ref_flag)?;
+                let placeholder: &dyn ::std::any::Any = &();
+                ::fory_core::serializer::struct_::struct_after_read_field(
                     #struct_name_lit,
                     field_name,
                     placeholder,
@@ -315,11 +315,11 @@ pub(crate) fn gen_read_compatible_with_construction(
         quote! {
             _ => {
                 let field_type = &_field.field_type;
-                let read_ref_flag = 
fory_core::serializer::util::field_need_write_ref_into(
+                let read_ref_flag = 
::fory_core::serializer::util::field_need_write_ref_into(
                     field_type.type_id,
                     field_type.nullable,
                 );
-                fory_core::serializer::skip::skip_field_value(context, 
field_type, read_ref_flag)?;
+                ::fory_core::serializer::skip::skip_field_value(context, 
field_type, read_ref_flag)?;
             }
         }
     };
@@ -352,21 +352,21 @@ pub(crate) fn gen_read_compatible_with_construction(
         quote! {
             let local_variant_type_info = context
                 .get_type_resolver()
-                .get_type_info(&std::any::TypeId::of::<#meta_type_ident>())
-                .map_err(|_| fory_core::Error::type_error(
+                .get_type_info(&::std::any::TypeId::of::<#meta_type_ident>())
+                .map_err(|_| ::fory_core::Error::type_error(
                     concat!("Local enum variant metadata not found for ", 
#variant_name_lit)
                 ))?;
             let local_variant_type_meta = 
local_variant_type_info.get_type_meta();
             let local_fields = local_variant_type_meta.get_field_infos();
 
-            let field_index_by_name: std::collections::HashMap<_, _> = 
local_fields
+            let field_index_by_name: ::std::collections::HashMap<_, _> = 
local_fields
                 .iter()
                 .enumerate()
                 .filter(|(_, f)| !f.field_name.is_empty())
                 .map(|(i, f)| (f.field_name.clone(), (i, f)))
                 .collect();
 
-            let field_index_by_id: std::collections::HashMap<_, _> = 
local_fields
+            let field_index_by_id: ::std::collections::HashMap<_, _> = 
local_fields
                 .iter()
                 .enumerate()
                 .filter(|(_, f)| f.field_id >= 0)
@@ -378,7 +378,7 @@ pub(crate) fn gen_read_compatible_with_construction(
                     field_index_by_id.get(&field.field_id).copied()
                 } else {
                     let snake_case_name =
-                        fory_core::util::to_snake_case(&field.field_name);
+                        ::fory_core::util::to_snake_case(&field.field_name);
                     field_index_by_name.get(&snake_case_name).copied()
                 };
 
@@ -414,14 +414,14 @@ pub(crate) fn gen_read_compatible_with_construction(
 
     quote! {
         let meta = context.get_type_resolver().get_type_meta_by_index_ref(
-            &std::any::TypeId::of::<Self>(),
-            <Self as fory_core::StructSerializer>::fory_type_index(),
+            &::std::any::TypeId::of::<Self>(),
+            <Self as ::fory_core::StructSerializer>::fory_type_index(),
         )?;
         let local_type_hash = meta.get_hash();
         let remote_meta = type_info.get_type_meta_ref();
         let remote_type_hash = remote_meta.get_hash();
         if remote_type_hash == local_type_hash {
-            return <Self as fory_core::Serializer>::fory_read_data(context);
+            return <Self as ::fory_core::Serializer>::fory_read_data(context);
         }
         #fields_binding
         #(#declare_ts)*
diff --git a/rust/fory-derive/src/object/serializer.rs 
b/rust/fory-derive/src/object/serializer.rs
index 605c3c452..c3f0db429 100644
--- a/rust/fory-derive/src/object/serializer.rs
+++ b/rust/fory-derive/src/object/serializer.rs
@@ -73,7 +73,7 @@ pub fn derive_serializer(ast: &syn::DeriveInput, attrs: 
ForyAttrs) -> TokenStrea
                 actual_type_id_ts,
                 misc::gen_get_sorted_field_names(&fields),
                 misc::gen_field_fields_info(&source_fields),
-                quote! { Ok(Vec::new()) }, // No variants for structs
+                quote! { ::std::result::Result::Ok(::std::vec::Vec::new()) }, 
// No variants for structs
                 read::gen_read_compatible(&source_fields),
                 vec![], // No variant meta types for structs
             )
@@ -88,7 +88,7 @@ pub fn derive_serializer(ast: &syn::DeriveInput, attrs: 
ForyAttrs) -> TokenStrea
                 derive_enum::gen_field_fields_info(s),
                 derive_enum::gen_variants_fields_info(name, s),
                 quote! {
-                    Err(fory_core::Error::not_allowed("`fory_read_compatible` 
should only be invoked at struct type"
+                    
::std::result::Result::Err(::fory_core::Error::not_allowed("`fory_read_compatible`
 should only be invoked at struct type"
                 ))
                 },
                 variant_meta_types,
@@ -121,7 +121,7 @@ pub fn derive_serializer(ast: &syn::DeriveInput, attrs: 
ForyAttrs) -> TokenStrea
                 read::gen_read_data(&source_fields),
                 read::gen_read_type_info(),
                 write::gen_reserved_space(&source_fields),
-                quote! { fory_core::TypeId::STRUCT },
+                quote! { ::fory_core::TypeId::STRUCT },
             )
         }
         syn::Data::Enum(e) => (
@@ -144,14 +144,14 @@ pub fn derive_serializer(ast: &syn::DeriveInput, attrs: 
ForyAttrs) -> TokenStrea
     let type_idx = misc::allocate_type_id();
 
     let gen = quote! {
-        use fory_core::ForyDefault as _;
+        use ::fory_core::ForyDefault as _;
 
         // Generate variant meta types for enums (must be at module scope)
         #(#enum_variant_meta_types)*
 
         #default_impl
 
-        impl #impl_generics fory_core::StructSerializer for #name #ty_generics 
#where_clause {
+        impl #impl_generics ::fory_core::StructSerializer for #name 
#ty_generics #where_clause {
             #[inline(always)]
             fn fory_type_index() -> u32 {
                 #type_idx
@@ -166,41 +166,41 @@ pub fn derive_serializer(ast: &syn::DeriveInput, attrs: 
ForyAttrs) -> TokenStrea
                 #get_sorted_field_names_ts
             }
 
-            fn fory_fields_info(type_resolver: 
&fory_core::resolver::TypeResolver) -> Result<Vec<fory_core::meta::FieldInfo>, 
fory_core::error::Error> {
+            fn fory_fields_info(type_resolver: 
&::fory_core::resolver::TypeResolver) -> 
::std::result::Result<::std::vec::Vec<::fory_core::meta::FieldInfo>, 
::fory_core::error::Error> {
                 #fields_info_ts
             }
 
-            fn fory_variants_fields_info(type_resolver: 
&fory_core::resolver::TypeResolver) -> Result<Vec<(String, std::any::TypeId, 
Vec<fory_core::meta::FieldInfo>)>, fory_core::error::Error> {
+            fn fory_variants_fields_info(type_resolver: 
&::fory_core::resolver::TypeResolver) -> 
::std::result::Result<::std::vec::Vec<(::std::string::String, 
::std::any::TypeId, ::std::vec::Vec<::fory_core::meta::FieldInfo>)>, 
::fory_core::error::Error> {
                 #variants_fields_info_ts
             }
 
             #[inline]
-            fn fory_read_compatible(context: &mut fory_core::ReadContext, 
type_info: std::rc::Rc<fory_core::TypeInfo>) -> Result<Self, 
fory_core::error::Error> {
+            fn fory_read_compatible(context: &mut ::fory_core::ReadContext, 
type_info: ::std::rc::Rc<::fory_core::TypeInfo>) -> ::std::result::Result<Self, 
::fory_core::error::Error> {
                 #read_compatible_ts
             }
         }
 
-        impl #impl_generics fory_core::Serializer for #name #ty_generics 
#where_clause {
+        impl #impl_generics ::fory_core::Serializer for #name #ty_generics 
#where_clause {
             #[inline(always)]
-            fn fory_get_type_id(type_resolver: 
&fory_core::resolver::TypeResolver) -> Result<fory_core::TypeId, 
fory_core::error::Error> {
+            fn fory_get_type_id(type_resolver: 
&::fory_core::resolver::TypeResolver) -> 
::std::result::Result<::fory_core::TypeId, ::fory_core::error::Error> {
                 let type_id = type_resolver
-                    .get_type_id(&std::any::TypeId::of::<Self>(), #type_idx)
-                    
.map_err(fory_core::error::Error::enhance_type_error::<Self>)?;
-                Ok(type_id)
+                    .get_type_id(&::std::any::TypeId::of::<Self>(), #type_idx)
+                    
.map_err(::fory_core::error::Error::enhance_type_error::<Self>)?;
+                ::std::result::Result::Ok(type_id)
             }
 
             #[inline(always)]
-            fn fory_type_id_dyn(&self, type_resolver: 
&fory_core::resolver::TypeResolver) -> Result<fory_core::TypeId, 
fory_core::error::Error> {
+            fn fory_type_id_dyn(&self, type_resolver: 
&::fory_core::resolver::TypeResolver) -> 
::std::result::Result<::fory_core::TypeId, ::fory_core::error::Error> {
                 Self::fory_get_type_id(type_resolver)
             }
 
             #[inline(always)]
-            fn as_any(&self) -> &dyn std::any::Any {
+            fn as_any(&self) -> &dyn ::std::any::Any {
                 self
             }
 
             #[inline(always)]
-            fn fory_static_type_id() -> fory_core::TypeId
+            fn fory_static_type_id() -> ::fory_core::TypeId
             where
                 Self: Sized,
             {
@@ -213,37 +213,37 @@ pub fn derive_serializer(ast: &syn::DeriveInput, attrs: 
ForyAttrs) -> TokenStrea
             }
 
             #[inline(always)]
-            fn fory_write(&self, context: &mut fory_core::WriteContext, 
ref_mode: fory_core::RefMode, write_type_info: bool, _: bool) -> Result<(), 
fory_core::error::Error> {
+            fn fory_write(&self, context: &mut ::fory_core::WriteContext, 
ref_mode: ::fory_core::RefMode, write_type_info: bool, _: bool) -> 
::std::result::Result<(), ::fory_core::error::Error> {
                 #write_ts
             }
 
             #[inline]
-            fn fory_write_data(&self, context: &mut fory_core::WriteContext) 
-> Result<(), fory_core::error::Error> {
+            fn fory_write_data(&self, context: &mut ::fory_core::WriteContext) 
-> ::std::result::Result<(), ::fory_core::error::Error> {
                 #write_data_ts
             }
 
             #[inline(always)]
-            fn fory_write_type_info(context: &mut fory_core::WriteContext) -> 
Result<(), fory_core::error::Error> {
+            fn fory_write_type_info(context: &mut ::fory_core::WriteContext) 
-> ::std::result::Result<(), ::fory_core::error::Error> {
                 #write_type_info_ts
             }
 
             #[inline(always)]
-            fn fory_read(context: &mut fory_core::ReadContext, ref_mode: 
fory_core::RefMode, read_type_info: bool) -> Result<Self, 
fory_core::error::Error> {
+            fn fory_read(context: &mut ::fory_core::ReadContext, ref_mode: 
::fory_core::RefMode, read_type_info: bool) -> ::std::result::Result<Self, 
::fory_core::error::Error> {
                 #read_ts
             }
 
             #[inline(always)]
-            fn fory_read_with_type_info(context: &mut fory_core::ReadContext, 
ref_mode: fory_core::RefMode, type_info: std::rc::Rc<fory_core::TypeInfo>) -> 
Result<Self, fory_core::error::Error> {
+            fn fory_read_with_type_info(context: &mut 
::fory_core::ReadContext, ref_mode: ::fory_core::RefMode, type_info: 
::std::rc::Rc<::fory_core::TypeInfo>) -> ::std::result::Result<Self, 
::fory_core::error::Error> {
                 #read_with_type_info_ts
             }
 
             #[inline]
-            fn fory_read_data( context: &mut fory_core::ReadContext) -> 
Result<Self, fory_core::error::Error> {
+            fn fory_read_data( context: &mut ::fory_core::ReadContext) -> 
::std::result::Result<Self, ::fory_core::error::Error> {
                 #read_data_ts
             }
 
             #[inline(always)]
-            fn fory_read_type_info(context: &mut fory_core::ReadContext) -> 
Result<(), fory_core::error::Error> {
+            fn fory_read_type_info(context: &mut ::fory_core::ReadContext) -> 
::std::result::Result<(), ::fory_core::error::Error> {
                 #read_type_info_ts
             }
         }
@@ -292,12 +292,12 @@ fn generate_default_impl(
             if should_generate_default {
                 // User requested Default generation via 
#[fory(generate_default)]
                 quote! {
-                    impl #impl_generics fory_core::ForyDefault for #name 
#ty_generics #where_clause {
+                    impl #impl_generics ::fory_core::ForyDefault for #name 
#ty_generics #where_clause {
                         fn fory_default() -> Self {
                             #self_construction
                         }
                     }
-                    impl #impl_generics std::default::Default for #name 
#ty_generics #where_clause {
+                    impl #impl_generics ::std::default::Default for #name 
#ty_generics #where_clause {
                         fn default() -> Self {
                             Self::fory_default()
                         }
@@ -307,7 +307,7 @@ fn generate_default_impl(
                 // Default case: only generate ForyDefault, not Default
                 // This avoids conflicts with existing Default implementations
                 quote! {
-                   impl #impl_generics fory_core::ForyDefault for #name 
#ty_generics #where_clause {
+                   impl #impl_generics ::fory_core::ForyDefault for #name 
#ty_generics #where_clause {
                         fn fory_default() -> Self {
                             #self_construction
                         }
@@ -332,7 +332,7 @@ fn generate_default_impl(
                     syn::Fields::Unnamed(fields) => {
                         let defaults = fields.unnamed.iter().map(|f| {
                             let ty = &f.ty;
-                            quote! { <#ty as 
fory_core::ForyDefault>::fory_default() }
+                            quote! { <#ty as 
::fory_core::ForyDefault>::fory_default() }
                         });
                         quote! { (#(#defaults),*) }
                     }
@@ -340,7 +340,7 @@ fn generate_default_impl(
                         let field_inits = fields.named.iter().map(|f| {
                             let ident = &f.ident;
                             let ty = &f.ty;
-                            quote! { #ident: <#ty as 
fory_core::ForyDefault>::fory_default() }
+                            quote! { #ident: <#ty as 
::fory_core::ForyDefault>::fory_default() }
                         });
                         quote! { { #(#field_inits),* } }
                     }
@@ -350,7 +350,7 @@ fn generate_default_impl(
                     // User has #[derive(Default)] or #[default] attribute
                     // Only generate ForyDefault that delegates to Default
                     quote! {
-                        impl #impl_generics fory_core::ForyDefault for #name 
#ty_generics #where_clause {
+                        impl #impl_generics ::fory_core::ForyDefault for #name 
#ty_generics #where_clause {
                             fn fory_default() -> Self {
                                 Self::default()
                             }
@@ -359,13 +359,13 @@ fn generate_default_impl(
                 } else if should_generate_default {
                     // User requested Default generation via 
#[fory(generate_default)]
                     quote! {
-                        impl #impl_generics fory_core::ForyDefault for #name 
#ty_generics #where_clause {
+                        impl #impl_generics ::fory_core::ForyDefault for #name 
#ty_generics #where_clause {
                             fn fory_default() -> Self {
                                 Self::#variant_ident #field_defaults
                             }
                         }
 
-                        impl #impl_generics std::default::Default for #name 
#ty_generics #where_clause {
+                        impl #impl_generics ::std::default::Default for #name 
#ty_generics #where_clause {
                             fn default() -> Self {
                                 Self::#variant_ident #field_defaults
                             }
@@ -374,7 +374,7 @@ fn generate_default_impl(
                 } else {
                     // Default case: only generate ForyDefault, not Default
                     quote! {
-                        impl #impl_generics fory_core::ForyDefault for #name 
#ty_generics #where_clause {
+                        impl #impl_generics ::fory_core::ForyDefault for #name 
#ty_generics #where_clause {
                             fn fory_default() -> Self {
                                 Self::#variant_ident #field_defaults
                             }
diff --git a/rust/fory-derive/src/object/util.rs 
b/rust/fory-derive/src/object/util.rs
index 360ccbb0c..b5cc0b26d 100644
--- a/rust/fory-derive/src/object/util.rs
+++ b/rust/fory-derive/src/object/util.rs
@@ -211,8 +211,30 @@ type FieldGroups = (
     FieldGroup,
 );
 
+/// Extract the inner generic arguments from a type name while ignoring path 
qualifiers.
+///
+/// e.g., both `Vec<T>` and `::std::vec::Vec<T>` return `T` when `outer` is 
`Vec`.
+fn extract_generic_inner<'a>(s: &'a str, outer: &str) -> Option<&'a str> {
+    let generic_start = s.find('<')?;
+    let owner = s[..generic_start]
+        .rsplit("::")
+        .next()
+        .unwrap_or(&s[..generic_start]);
+    if owner != outer {
+        return None;
+    }
+    s[generic_start + 1..].strip_suffix('>')
+}
+
+/// Return the final path segment so absolute generated paths match the same 
runtime type names.
+///
+/// e.g., `::fory::Float16` and `Float16` both normalize to `Float16`.
+fn unqualified_type_name(ty: &str) -> &str {
+    ty.rsplit("::").next().unwrap_or(ty)
+}
+
 fn extract_option_inner(s: &str) -> Option<&str> {
-    s.strip_prefix("Option<")?.strip_suffix(">")
+    extract_generic_inner(s, "Option")
 }
 
 const PRIMITIVE_TYPE_NAMES: [&str; 17] = [
@@ -220,8 +242,12 @@ const PRIMITIVE_TYPE_NAMES: [&str; 17] = [
     "f64", "u8", "u16", "u32", "u64", "u128",
 ];
 
+fn is_primitive_type_name(ty: &str) -> bool {
+    PRIMITIVE_TYPE_NAMES.contains(&unqualified_type_name(ty))
+}
+
 fn get_primitive_type_id(ty: &str) -> u32 {
-    match ty {
+    match unqualified_type_name(ty) {
         "bool" => TypeId::BOOL as u32,
         "i8" => TypeId::INT8 as u32,
         "i16" => TypeId::INT16 as u32,
@@ -311,15 +337,23 @@ pub(crate) fn get_type_id_by_name(ty: &str) -> u32 {
     }
 
     // Check collection types
-    if ty.starts_with("Vec<") || ty.starts_with("VecDeque<") || 
ty.starts_with("LinkedList<") {
+    if extract_generic_inner(ty, "Vec").is_some()
+        || extract_generic_inner(ty, "VecDeque").is_some()
+        || extract_generic_inner(ty, "LinkedList").is_some()
+    {
         return TypeId::LIST as u32;
     }
 
-    if ty.starts_with("HashSet<") || ty.starts_with("BTreeSet<") || 
ty.starts_with("BinaryHeap<") {
+    if extract_generic_inner(ty, "HashSet").is_some()
+        || extract_generic_inner(ty, "BTreeSet").is_some()
+        || extract_generic_inner(ty, "BinaryHeap").is_some()
+    {
         return TypeId::SET as u32;
     }
 
-    if ty.starts_with("HashMap<") || ty.starts_with("BTreeMap<") {
+    if extract_generic_inner(ty, "HashMap").is_some()
+        || extract_generic_inner(ty, "BTreeMap").is_some()
+    {
         return TypeId::MAP as u32;
     }
 
@@ -493,7 +527,7 @@ fn group_fields_by_type(fields: &[&Field]) -> FieldGroups {
 
         // handle Option<Primitive> specially
         if let Some(inner) = extract_option_inner(&ty) {
-            if PRIMITIVE_TYPE_NAMES.contains(&inner) {
+            if is_primitive_type_name(inner) {
                 // Get base type ID and adjust for encoding attributes
                 let base_type_id = get_primitive_type_id(inner);
                 let type_id = adjust_type_id_for_encoding(base_type_id, &meta);
@@ -501,7 +535,7 @@ fn group_fields_by_type(fields: &[&Field]) -> FieldGroups {
             } else {
                 group_field(ident, sort_key, inner, false);
             }
-        } else if PRIMITIVE_TYPE_NAMES.contains(&ty.as_str()) {
+        } else if is_primitive_type_name(&ty) {
             group_field(ident, sort_key, &ty, true);
         } else {
             group_field(ident, sort_key, &ty, false);
@@ -644,8 +678,8 @@ fn adjust_type_id_for_encoding(base_type_id: u32, meta: 
&super::field_meta::Fory
 }
 
 fn array_type_id_for_vec_name(ty: &str) -> Option<u32> {
-    let elem = ty.strip_prefix("Vec<")?.strip_suffix('>')?;
-    match elem {
+    let elem = extract_generic_inner(ty, "Vec")?;
+    match unqualified_type_name(elem) {
         "bool" => Some(TypeId::BOOL_ARRAY as u32),
         "i8" => Some(TypeId::INT8_ARRAY as u32),
         "i16" => Some(TypeId::INT16_ARRAY as u32),
@@ -873,10 +907,10 @@ pub(crate) fn gen_struct_version_hash_ts(fields: 
&[&Field]) -> TokenStream {
     quote! {
         {
             const VERSION_HASH: i32 = #version_hash;
-            if fory_core::util::ENABLE_FORY_DEBUG_OUTPUT {
+            if ::fory_core::util::ENABLE_FORY_DEBUG_OUTPUT {
                 println!(
                     "[rust][fory-debug] struct {} version fingerprint=\"{}\" 
hash={}",
-                    std::any::type_name::<Self>(),
+                    ::std::any::type_name::<Self>(),
                     #fingerprint,
                     VERSION_HASH
                 );
diff --git a/rust/fory-derive/src/object/write.rs 
b/rust/fory-derive/src/object/write.rs
index 813f4a0ad..acfe7e3aa 100644
--- a/rust/fory-derive/src/object/write.rs
+++ b/rust/fory-derive/src/object/write.rs
@@ -44,7 +44,7 @@ pub fn gen_reserved_space(source_fields: &[SourceField<'_>]) 
-> TokenStream {
 
 pub fn gen_write_type_info() -> TokenStream {
     quote! {
-        fory_core::serializer::struct_::write_type_info_fast::<Self>(context)
+        ::fory_core::serializer::struct_::write_type_info_fast::<Self>(context)
     }
 }
 
@@ -73,17 +73,17 @@ pub fn gen_write_data(source_fields: &[SourceField<'_>]) -> 
TokenStream {
                         proc_macro2::Span::call_site(),
                     );
                     Some(quote! {
-                        
fory_core::serializer::struct_::struct_before_write_field(
+                        
::fory_core::serializer::struct_::struct_before_write_field(
                             #struct_name_lit,
                             #field_name_lit,
-                            (&#value_ts) as &dyn std::any::Any,
+                            (&#value_ts) as &dyn ::std::any::Any,
                             context,
                         );
                         #base
-                        
fory_core::serializer::struct_::struct_after_write_field(
+                        
::fory_core::serializer::struct_::struct_after_write_field(
                             #struct_name_lit,
                             #field_name_lit,
-                            (&#value_ts) as &dyn std::any::Any,
+                            (&#value_ts) as &dyn ::std::any::Any,
                             context,
                         );
                     })
@@ -108,6 +108,6 @@ pub fn gen_write_data(source_fields: &[SourceField<'_>]) -> 
TokenStream {
 
 pub fn gen_write() -> TokenStream {
     quote! {
-        fory_core::serializer::struct_::write::<Self>(self, context, ref_mode, 
write_type_info)
+        ::fory_core::serializer::struct_::write::<Self>(self, context, 
ref_mode, write_type_info)
     }
 }


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

Reply via email to