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 3c9c999c0 refactor(rust): move Fory configuration to builder (#3593)
3c9c999c0 is described below

commit 3c9c999c07278a5aa630cc1514fc1b81595fe8fb
Author: Shawn Yang <[email protected]>
AuthorDate: Mon Apr 20 20:52:12 2026 +0800

    refactor(rust): move Fory configuration to builder (#3593)
    
    ## Why?
    
    
    
    ## What does this PR do?
    
    
    
    ## Related issues
    
    
    
    ## AI Contribution Checklist
    
    
    
    - [ ] Substantial AI assistance was used in this PR: `yes` / `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.
    
    
    
    ## Does this PR introduce any user-facing change?
    
    
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
---
 README.md                                          |   2 +-
 compiler/fory_compiler/generators/rust.py          |   5 +-
 docs/guide/python/cross-language.md                |   4 +-
 docs/guide/rust/configuration.md                   |  20 +--
 docs/guide/rust/cross-language.md                  |  12 +-
 docs/guide/rust/polymorphism.md                    |   4 +-
 docs/guide/rust/schema-evolution.md                |   6 +-
 docs/guide/rust/troubleshooting.md                 |   2 +-
 docs/guide/rust/type-registration.md               |   4 +-
 docs/guide/xlang/field-reference-tracking.md       |   6 +-
 docs/guide/xlang/getting-started.md                |   4 +-
 docs/guide/xlang/serialization.md                  |   4 +-
 .../idl_tests/rust/tests/idl_roundtrip.rs          |  14 +-
 rust/README.md                                     |  10 +-
 rust/fory-core/src/fory.rs                         | 174 +++++++++++++--------
 rust/fory-core/src/lib.rs                          |   6 +-
 rust/fory-core/src/serializer/trait_object.rs      |   2 +-
 rust/fory-core/src/serializer/weak.rs              |   4 +-
 rust/fory/src/lib.rs                               |  30 ++--
 rust/tests/tests/compatible/test_basic_type.rs     |   6 +-
 rust/tests/tests/compatible/test_container.rs      |  22 +--
 rust/tests/tests/compatible/test_struct.rs         |  46 +++---
 rust/tests/tests/compatible/test_struct_enum.rs    |  44 +++---
 rust/tests/tests/test_array.rs                     |   4 +-
 rust/tests/tests/test_collection.rs                |   2 +-
 rust/tests/tests/test_cross_language.rs            | 114 ++++++++------
 rust/tests/tests/test_debug.rs                     |   2 +-
 rust/tests/tests/test_enum.rs                      |  12 +-
 rust/tests/tests/test_enum_compatible.rs           |  34 ++--
 rust/tests/tests/test_ext.rs                       |   2 +-
 rust/tests/tests/test_field_meta.rs                |  22 +--
 rust/tests/tests/test_fory.rs                      |   7 +-
 rust/tests/tests/test_list.rs                      |   2 +-
 rust/tests/tests/test_map.rs                       |   4 +-
 rust/tests/tests/test_max_dyn_depth.rs             |   7 +-
 rust/tests/tests/test_one_struct.rs                |   4 +-
 rust/tests/tests/test_rc_arc_trait_object.rs       |   2 +-
 rust/tests/tests/test_simple_struct.rs             |  25 +--
 rust/tests/tests/test_skip_fields.rs               |   4 +-
 rust/tests/tests/test_trait_object.rs              |   2 +-
 rust/tests/tests/test_tuple.rs                     |   6 +-
 rust/tests/tests/test_tuple_compatible.rs          |  64 ++++----
 rust/tests/tests/test_tuple_struct.rs              |  18 +--
 rust/tests/tests/test_unsigned.rs                  |  24 +--
 rust/tests/tests/test_weak.rs                      |  18 +--
 45 files changed, 436 insertions(+), 374 deletions(-)

diff --git a/README.md b/README.md
index a9e5104fb..2d2bd8fc5 100644
--- a/README.md
+++ b/README.md
@@ -573,7 +573,7 @@ struct Person {
 }
 
 fn main() -> Result<(), Error> {
-    let mut fory = Fory::default().xlang(true);
+    let mut fory = Fory::builder().xlang(true).build();
     fory.register::<Person>(1)?;
     // fory.register_by_name::<Person>("example.Person")?;
     let person = Person {
diff --git a/compiler/fory_compiler/generators/rust.py 
b/compiler/fory_compiler/generators/rust.py
index 75752face..f9c8ae852 100644
--- a/compiler/fory_compiler/generators/rust.py
+++ b/compiler/fory_compiler/generators/rust.py
@@ -879,10 +879,11 @@ class RustGenerator(BaseGenerator):
         lines.append("    pub(super) fn get_fory() -> &'static Fory {")
         lines.append("        static FORY: OnceLock<Fory> = OnceLock::new();")
         lines.append("        FORY.get_or_init(|| {")
-        lines.append("            let mut fory = Fory::default()")
+        lines.append("            let mut fory = Fory::builder()")
         lines.append("                .xlang(true)")
         lines.append("                .track_ref(true)")
-        lines.append("                .compatible(true);")
+        lines.append("                .compatible(true)")
+        lines.append("                .build();")
         for module in self._collect_imported_modules():
             lines.append(
                 f'            crate::{module}::register_types(&mut 
fory).expect("failed to register fory types");'
diff --git a/docs/guide/python/cross-language.md 
b/docs/guide/python/cross-language.md
index 0a75e0581..b5b96f5ca 100644
--- a/docs/guide/python/cross-language.md
+++ b/docs/guide/python/cross-language.md
@@ -85,9 +85,9 @@ struct Person {
     age: i32,
 }
 
-let mut fory = Fory::default()
+let mut fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 fory.register_by_namespace::<Person>("example", "Person");
 let person: Person = fory.deserialize(&binary_data)?;
diff --git a/docs/guide/rust/configuration.md b/docs/guide/rust/configuration.md
index 52d741472..dd6435ee3 100644
--- a/docs/guide/rust/configuration.md
+++ b/docs/guide/rust/configuration.md
@@ -38,7 +38,7 @@ let fory = Fory::default(); // SchemaConsistent by default
 Allows independent schema evolution:
 
 ```rust
-let fory = Fory::default().compatible(true);
+let fory = Fory::builder().compatible(true).build();
 ```
 
 ## Configuration
@@ -56,7 +56,7 @@ let fory = Fory::default(); // max_dyn_depth = 5
 **Custom depth limit:**
 
 ```rust
-let fory = Fory::default().max_dyn_depth(10); // Allow up to 10 levels
+let fory = Fory::builder().max_dyn_depth(10).build(); // Allow up to 10 levels
 ```
 
 **When to adjust:**
@@ -79,9 +79,9 @@ Note: Static data types (non-dynamic types) are secure by 
nature and not subject
 Enable cross-language serialization:
 
 ```rust
-let fory = Fory::default()
+let fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 ```
 
 ## Builder Pattern
@@ -93,21 +93,21 @@ use fory::Fory;
 let fory = Fory::default();
 
 // Compatible mode for schema evolution
-let fory = Fory::default().compatible(true);
+let fory = Fory::builder().compatible(true).build();
 
 // Cross-language mode
-let fory = Fory::default()
+let fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 // Custom depth limit
-let fory = Fory::default().max_dyn_depth(10);
+let fory = Fory::builder().max_dyn_depth(10).build();
 
 // Combined configuration
-let fory = Fory::default()
+let fory = Fory::builder()
     .compatible(true)
     .xlang(true)
-    .max_dyn_depth(10);
+    .max_dyn_depth(10).build();
 ```
 
 ## Configuration Summary
diff --git a/docs/guide/rust/cross-language.md 
b/docs/guide/rust/cross-language.md
index fb0ff5377..dac48ec6a 100644
--- a/docs/guide/rust/cross-language.md
+++ b/docs/guide/rust/cross-language.md
@@ -27,9 +27,9 @@ Apache Fory™ supports seamless data exchange across multiple 
languages includi
 use fory::Fory;
 
 // Enable cross-language mode
-let mut fory = Fory::default()
+let mut fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 // Register types with consistent IDs across languages
 fory.register::<MyStruct>(100);
@@ -45,9 +45,9 @@ fory.register_by_namespace::<MyStruct>("com.example", 
"MyStruct");
 For fast, compact serialization with consistent IDs across languages:
 
 ```rust
-let mut fory = Fory::default()
+let mut fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 fory.register::<User>(100);  // Same ID in Java, Python, etc.
 ```
@@ -74,9 +74,9 @@ struct Person {
     age: i32,
 }
 
-let mut fory = Fory::default()
+let mut fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 fory.register::<Person>(100);
 
diff --git a/docs/guide/rust/polymorphism.md b/docs/guide/rust/polymorphism.md
index 80d2bb2c0..2afff965d 100644
--- a/docs/guide/rust/polymorphism.md
+++ b/docs/guide/rust/polymorphism.md
@@ -64,7 +64,7 @@ struct Zoo {
     star_animal: Box<dyn Animal>,
 }
 
-let mut fory = Fory::default().compatible(true);
+let mut fory = Fory::builder().compatible(true).build();
 fory.register::<Dog>(100);
 fory.register::<Cat>(101);
 fory.register::<Zoo>(102);
@@ -153,7 +153,7 @@ struct AnimalShelter {
     registry: HashMap<String, Arc<dyn Animal>>,
 }
 
-let mut fory = Fory::default().compatible(true);
+let mut fory = Fory::builder().compatible(true).build();
 fory.register::<Dog>(100);
 fory.register::<Cat>(101);
 fory.register::<AnimalShelter>(102);
diff --git a/docs/guide/rust/schema-evolution.md 
b/docs/guide/rust/schema-evolution.md
index f58db6ad0..6b51ba1ac 100644
--- a/docs/guide/rust/schema-evolution.md
+++ b/docs/guide/rust/schema-evolution.md
@@ -47,10 +47,10 @@ struct PersonV2 {
     metadata: HashMap<String, String>,
 }
 
-let mut fory1 = Fory::default().compatible(true);
+let mut fory1 = Fory::builder().compatible(true).build();
 fory1.register::<PersonV1>(1);
 
-let mut fory2 = Fory::default().compatible(true);
+let mut fory2 = Fory::builder().compatible(true).build();
 fory2.register::<PersonV2>(1);
 
 let person_v1 = PersonV1 {
@@ -155,7 +155,7 @@ enum NewEvent {
     KeyPress(String),  // New variant
 }
 
-let mut fory = Fory::default().compatible(true);
+let mut fory = Fory::builder().compatible(true).build();
 
 // Serialize with old schema
 let old_bytes = fory.serialize(&OldEvent::Click { x: 100, y: 200 })?;
diff --git a/docs/guide/rust/troubleshooting.md 
b/docs/guide/rust/troubleshooting.md
index f67f5071a..6d99c551b 100644
--- a/docs/guide/rust/troubleshooting.md
+++ b/docs/guide/rust/troubleshooting.md
@@ -51,7 +51,7 @@ Confirm that:
 - Ensure field types match across versions
 
 ```rust
-let fory = Fory::default().compatible(true);
+let fory = Fory::builder().compatible(true).build();
 ```
 
 ## Debugging Techniques
diff --git a/docs/guide/rust/type-registration.md 
b/docs/guide/rust/type-registration.md
index 0c209ce55..d44d0094a 100644
--- a/docs/guide/rust/type-registration.md
+++ b/docs/guide/rust/type-registration.md
@@ -52,9 +52,9 @@ let decoded: User = fory.deserialize(&bytes)?;
 For cross-language compatibility, register with namespace and type name:
 
 ```rust
-let mut fory = Fory::default()
+let mut fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 // Register with namespace-based naming
 fory.register_by_namespace::<MyStruct>("com.example", "MyStruct")?;
diff --git a/docs/guide/xlang/field-reference-tracking.md 
b/docs/guide/xlang/field-reference-tracking.md
index f6076c13c..d7729c240 100644
--- a/docs/guide/xlang/field-reference-tracking.md
+++ b/docs/guide/xlang/field-reference-tracking.md
@@ -64,9 +64,9 @@ auto fory = 
fory::Fory::builder().xlang(true).track_ref(true).build();
 ### Rust
 
 ```rust
-let fory = Fory::default()
+let fory = Fory::builder()
     .xlang(true)
-    .track_ref(true);
+    .track_ref(true).build();
 ```
 
 ## Wire Format
@@ -158,7 +158,7 @@ FORY_STRUCT(Document, title, author, data, tag_owner);
 ```
 
 To disable reference tracking for C++ entirely, set
-`Fory::builder().track_ref(false)` on the serializer.
+`Fory::builder().track_ref(false).build()` on the serializer.
 
 #### Rust: Field Attributes
 
diff --git a/docs/guide/xlang/getting-started.md 
b/docs/guide/xlang/getting-started.md
index ae0d2a17c..9cc41d5fe 100644
--- a/docs/guide/xlang/getting-started.md
+++ b/docs/guide/xlang/getting-started.md
@@ -113,7 +113,7 @@ fory := forygo.NewFory(forygo.WithXlang(true), 
forygo.WithTrackRef(true))
 ```rust
 use fory::Fory;
 
-let fory = Fory::default().xlang(true);
+let fory = Fory::builder().xlang(true).build();
 ```
 
 ### JavaScript
@@ -173,7 +173,7 @@ struct Person {
     age: i32,
 }
 
-let mut fory = Fory::default().xlang(true);
+let mut fory = Fory::builder().xlang(true).build();
 fory
     .register_by_namespace::<Person>("example", "Person")
     .expect("register Person");
diff --git a/docs/guide/xlang/serialization.md 
b/docs/guide/xlang/serialization.md
index c9b270ebd..a646db6e5 100644
--- a/docs/guide/xlang/serialization.md
+++ b/docs/guide/xlang/serialization.md
@@ -133,7 +133,7 @@ console.log(result);
 use fory::Fory;
 
 fn run() {
-    let fory = Fory::default().xlang(true);
+    let fory = Fory::builder().xlang(true).build();
     let bin = fory.serialize(&"hello".to_string()).expect("serialize success");
     let obj: String = fory.deserialize(&bin).expect("deserialize success");
     assert_eq!("hello".to_string(), obj);
@@ -399,7 +399,7 @@ fn complex_struct() {
         c6: 4.0,
     };
 
-    let mut fory = Fory::default().xlang(true);
+    let mut fory = Fory::builder().xlang(true).build();
     fory
         .register_by_namespace::<Animal>("example", "foo2")
         .expect("register Animal");
diff --git a/integration_tests/idl_tests/rust/tests/idl_roundtrip.rs 
b/integration_tests/idl_tests/rust/tests/idl_roundtrip.rs
index c286f80d2..7f2c3869b 100644
--- a/integration_tests/idl_tests/rust/tests/idl_roundtrip.rs
+++ b/integration_tests/idl_tests/rust/tests/idl_roundtrip.rs
@@ -507,9 +507,9 @@ fn test_address_book_roundtrip_schema_consistent() {
 
 #[test]
 fn test_evolving_roundtrip() {
-    let mut fory_v1 = Fory::default().xlang(true).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(true).compatible(true).build();
     evolving1::register_types(&mut fory_v1).expect("register evolving1 types");
-    let mut fory_v2 = Fory::default().xlang(true).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(true).compatible(true).build();
     evolving2::register_types(&mut fory_v2).expect("register evolving2 types");
 
     let msg_v1 = evolving1::EvolvingMessage {
@@ -557,7 +557,10 @@ fn test_evolving_roundtrip() {
 }
 
 fn run_address_book_roundtrip(compatible: bool) {
-    let mut fory = Fory::default().xlang(true).compatible(compatible);
+    let mut fory = Fory::builder()
+        .xlang(true)
+        .compatible(compatible)
+        .build();
     complex_pb::register_types(&mut fory).expect("register complex pb types");
     addressbook::register_types(&mut fory).expect("register types");
     auto_id::register_types(&mut fory).expect("register auto_id types");
@@ -764,10 +767,11 @@ fn run_address_book_roundtrip(compatible: bool) {
     let result: Result<AnyHolder, _> = fory.deserialize(&bytes);
     assert!(result.is_err());
 
-    let mut ref_fory = Fory::default()
+    let mut ref_fory = Fory::builder()
         .xlang(true)
         .compatible(compatible)
-        .track_ref(true);
+        .track_ref(true)
+        .build();
     tree::register_types(&mut ref_fory).expect("register tree types");
     graph::register_types(&mut ref_fory).expect("register graph types");
 
diff --git a/rust/README.md b/rust/README.md
index 40ac4549e..34648dc92 100644
--- a/rust/README.md
+++ b/rust/README.md
@@ -280,7 +280,7 @@ struct Zoo {
     star_animal: Box<dyn Animal>,
 }
 
-let mut fory = Fory::default().compatible(true);
+let mut fory = Fory::builder().compatible(true).build();
 fory.register::<Dog>(100);
 fory.register::<Cat>(101);
 fory.register::<Zoo>(102);
@@ -339,10 +339,10 @@ struct PersonV2 {
     metadata: HashMap<String, String>,
 }
 
-let mut fory1 = Fory::default().compatible(true);
+let mut fory1 = Fory::builder().compatible(true).build();
 fory1.register::<PersonV1>(1);
 
-let mut fory2 = Fory::default().compatible(true);
+let mut fory2 = Fory::builder().compatible(true).build();
 fory2.register::<PersonV2>(1);
 
 let person_v1 = PersonV1 {
@@ -601,9 +601,9 @@ Apache Fory™ supports seamless data exchange across 
multiple languages:
 use fory::Fory;
 
 // Enable cross-language mode
-let mut fory = Fory::default()
+let mut fory = Fory::builder()
     .compatible(true)
-    .xlang(true);
+    .xlang(true).build();
 
 // Register types with consistent IDs across languages
 fory.register::<MyStruct>(100);
diff --git a/rust/fory-core/src/fory.rs b/rust/fory-core/src/fory.rs
index 0aeded559..7ad755546 100644
--- a/rust/fory-core/src/fory.rs
+++ b/rust/fory-core/src/fory.rs
@@ -43,72 +43,27 @@ thread_local! {
         UnsafeCell::new(ContextCache::new());
 }
 
-/// The main Fory serialization framework instance.
-///
-/// `Fory` provides high-performance cross-language serialization and 
deserialization
-/// capabilities with support for multiple modes, reference tracking, and 
trait object serialization.
-///
-/// # Features
-///
-/// - **Cross-language serialization**: Serialize data in Rust and deserialize 
in other languages
-/// - **Multiple modes**: Schema-consistent and compatible serialization modes
-/// - **Reference tracking**: Handles shared and circular references
-/// - **Trait object serialization**: Supports serializing polymorphic trait 
objects
-/// - **Dynamic depth limiting**: Configurable limit for nested dynamic object 
serialization
-///
-/// # Examples
-///
-/// Basic usage:
-///
-/// ```rust, ignore
-/// use fory::Fory;
-/// use fory::ForyObject;
-///
-/// #[derive(ForyObject)]
-/// struct User {
-///     name: String,
-///     age: u32,
-/// }
-///
-/// let fory = Fory::default();
-/// let user = User { name: "Alice".to_string(), age: 30 };
-/// let bytes = fory.serialize(&user);
-/// let deserialized: User = fory.deserialize(&bytes).unwrap();
-/// ```
+/// Builder for configuring a [`Fory`] runtime before first use.
 ///
-/// Custom configuration:
+/// `ForyBuilder` owns the configuration phase. Call [`build`](Self::build) to 
create the
+/// runtime, then use [`Fory`] for registration and serialization operations.
 ///
 /// ```rust
 /// use fory_core::Fory;
 ///
-/// let fory = Fory::default()
+/// let fory = Fory::builder()
 ///     .compatible(true)
 ///     .compress_string(true)
-///     .max_dyn_depth(10);
+///     .max_dyn_depth(10)
+///     .build();
 /// ```
-pub struct Fory {
-    /// Unique identifier for this Fory instance, used as key in thread-local 
context maps.
-    id: u64,
-    /// Configuration for serialization behavior.
+#[derive(Default)]
+pub struct ForyBuilder {
     config: Config,
-    type_resolver: TypeResolver,
-    /// Lazy-initialized final type resolver (thread-safe, one-time 
initialization).
-    final_type_resolver: OnceLock<Result<TypeResolver, Error>>,
 }
 
-impl Default for Fory {
-    fn default() -> Self {
-        Fory {
-            id: FORY_ID_COUNTER.fetch_add(1, Ordering::Relaxed),
-            config: Config::default(),
-            type_resolver: TypeResolver::default(),
-            final_type_resolver: OnceLock::new(),
-        }
-    }
-}
-
-impl Fory {
-    /// Sets the serialization compatible mode for this Fory instance.
+impl ForyBuilder {
+    /// Sets the serialization compatible mode for this Fory builder.
     ///
     /// # Arguments
     ///
@@ -133,13 +88,12 @@ impl Fory {
     /// ```rust
     /// use fory_core::Fory;
     ///
-    /// let fory = Fory::default().compatible(true);
+    /// let fory = Fory::builder().compatible(true).build();
     /// ```
     pub fn compatible(mut self, compatible: bool) -> Self {
         // Setting share_meta individually is not supported currently
         self.config.share_meta = compatible;
         self.config.compatible = compatible;
-        self.type_resolver.set_compatible(compatible);
         if compatible {
             self.config.check_struct_version = false;
         }
@@ -168,18 +122,17 @@ impl Fory {
     /// use fory_core::Fory;
     ///
     /// // For cross-language use (default)
-    /// let fory = Fory::default().xlang(true);
+    /// let fory = Fory::builder().xlang(true).build();
     ///
     /// // For Rust-only optimization, this mode is faster and more compact 
since it avoids
     /// // cross-language metadata and type system costs.
-    /// let fory = Fory::default().xlang(false);
+    /// let fory = Fory::builder().xlang(false).build();
     /// ```
     pub fn xlang(mut self, xlang: bool) -> Self {
         self.config.xlang = xlang;
         if !self.config.check_struct_version {
             self.config.check_struct_version = !self.config.compatible;
         }
-        self.type_resolver.set_xlang(xlang);
         self
     }
 
@@ -209,7 +162,7 @@ impl Fory {
     /// ```rust
     /// use fory_core::Fory;
     ///
-    /// let fory = Fory::default().compress_string(true);
+    /// let fory = Fory::builder().compress_string(true).build();
     /// ```
     pub fn compress_string(mut self, compress_string: bool) -> Self {
         self.config.compress_string = compress_string;
@@ -243,9 +196,10 @@ impl Fory {
     /// ```rust
     /// use fory_core::Fory;
     ///
-    /// let fory = Fory::default()
+    /// let fory = Fory::builder()
     ///     .compatible(false)
-    ///     .check_struct_version(true);
+    ///     .check_struct_version(true)
+    ///     .build();
     /// ```
     pub fn check_struct_version(mut self, check_struct_version: bool) -> Self {
         if self.config.compatible && check_struct_version {
@@ -277,7 +231,7 @@ impl Fory {
     /// ```rust
     /// use fory_core::Fory;
     ///
-    /// let fory = Fory::default().track_ref(true);
+    /// let fory = Fory::builder().track_ref(true).build();
     /// ```
     pub fn track_ref(mut self, track_ref: bool) -> Self {
         self.config.track_ref = track_ref;
@@ -311,10 +265,10 @@ impl Fory {
     /// use fory_core::Fory;
     ///
     /// // Allow deeper nesting for complex object graphs
-    /// let fory = Fory::default().max_dyn_depth(10);
+    /// let fory = Fory::builder().max_dyn_depth(10).build();
     ///
     /// // Restrict nesting for safer deserialization
-    /// let fory = Fory::default().max_dyn_depth(3);
+    /// let fory = Fory::builder().max_dyn_depth(3).build();
     /// ```
     pub fn max_dyn_depth(mut self, max_dyn_depth: u32) -> Self {
         self.config.max_dyn_depth = max_dyn_depth;
@@ -343,7 +297,7 @@ impl Fory {
     /// use fory_core::Fory;
     ///
     /// // Limit binary payloads to 1 MB
-    /// let fory = Fory::default().max_binary_size(1024 * 1024);
+    /// let fory = Fory::builder().max_binary_size(1024 * 1024).build();
     /// ```
     pub fn max_binary_size(mut self, max_binary_size: u32) -> Self {
         self.config.max_binary_size = max_binary_size;
@@ -373,13 +327,97 @@ impl Fory {
     /// use fory_core::Fory;
     ///
     /// // Limit collections to 10000 elements
-    /// let fory = Fory::default().max_collection_size(10000);
+    /// let fory = Fory::builder().max_collection_size(10000).build();
     /// ```
     pub fn max_collection_size(mut self, max_collection_size: u32) -> Self {
         self.config.max_collection_size = max_collection_size;
         self
     }
 
+    /// Builds a [`Fory`] runtime with the current builder configuration.
+    pub fn build(self) -> Fory {
+        Fory::from_config(self.config)
+    }
+}
+
+/// The main Fory serialization framework instance.
+///
+/// `Fory` provides high-performance cross-language serialization and 
deserialization
+/// capabilities with support for multiple modes, reference tracking, and 
trait object serialization.
+///
+/// # Features
+///
+/// - **Cross-language serialization**: Serialize data in Rust and deserialize 
in other languages
+/// - **Multiple modes**: Schema-consistent and compatible serialization modes
+/// - **Reference tracking**: Handles shared and circular references
+/// - **Trait object serialization**: Supports serializing polymorphic trait 
objects
+/// - **Dynamic depth limiting**: Configurable limit for nested dynamic object 
serialization
+///
+/// # Examples
+///
+/// Basic usage:
+///
+/// ```rust, ignore
+/// use fory::Fory;
+/// use fory::ForyObject;
+///
+/// #[derive(ForyObject)]
+/// struct User {
+///     name: String,
+///     age: u32,
+/// }
+///
+/// let fory = Fory::default();
+/// let user = User { name: "Alice".to_string(), age: 30 };
+/// let bytes = fory.serialize(&user);
+/// let deserialized: User = fory.deserialize(&bytes).unwrap();
+/// ```
+///
+/// Custom configuration:
+///
+/// ```rust
+/// use fory_core::Fory;
+///
+/// let fory = Fory::builder()
+///     .compatible(true)
+///     .compress_string(true)
+///     .max_dyn_depth(10)
+///     .build();
+/// ```
+pub struct Fory {
+    /// Unique identifier for this Fory instance, used as key in thread-local 
context maps.
+    id: u64,
+    /// Configuration for serialization behavior.
+    config: Config,
+    type_resolver: TypeResolver,
+    /// Lazy-initialized final type resolver (thread-safe, one-time 
initialization).
+    final_type_resolver: OnceLock<Result<TypeResolver, Error>>,
+}
+
+impl Default for Fory {
+    fn default() -> Self {
+        Self::builder().build()
+    }
+}
+
+impl Fory {
+    /// Creates a builder for configuring a [`Fory`] runtime.
+    pub fn builder() -> ForyBuilder {
+        ForyBuilder::default()
+    }
+
+    fn from_config(config: Config) -> Self {
+        let mut type_resolver = TypeResolver::default();
+        type_resolver.set_compatible(config.compatible);
+        type_resolver.set_xlang(config.xlang);
+        Self {
+            id: FORY_ID_COUNTER.fetch_add(1, Ordering::Relaxed),
+            config,
+            type_resolver,
+            final_type_resolver: OnceLock::new(),
+        }
+    }
+
     /// Returns whether cross-language serialization is enabled.
     pub fn is_xlang(&self) -> bool {
         self.config.xlang
diff --git a/rust/fory-core/src/lib.rs b/rust/fory-core/src/lib.rs
index 976a760af..b9be2e764 100644
--- a/rust/fory-core/src/lib.rs
+++ b/rust/fory-core/src/lib.rs
@@ -99,7 +99,7 @@
 //! }
 //!
 //! # fn main() {
-//! let mut fory = Fory::default().compatible(true);
+//! let mut fory = Fory::builder().compatible(true).build();
 //! fory.register::<Dog>(100);
 //! fory.register::<Cat>(101);
 //! fory.register::<Zoo>(102);
@@ -147,7 +147,7 @@
 //! use std::collections::HashMap;
 //!
 //! // Create a Fory instance
-//! let mut fory = Fory::default().compatible(true);
+//! let mut fory = Fory::builder().compatible(true).build();
 //!
 //! // Serialize String
 //! let text = String::from("Hello, Fory!");
@@ -195,7 +195,7 @@ pub use paste;
 pub use crate::buffer::{Reader, Writer};
 pub use crate::config::Config;
 pub use crate::error::Error;
-pub use crate::fory::Fory;
+pub use crate::fory::{Fory, ForyBuilder};
 pub use crate::resolver::context::{ReadContext, WriteContext};
 pub use crate::resolver::type_resolver::{TypeInfo, TypeResolver};
 pub use crate::serializer::weak::{ArcWeak, RcWeak};
diff --git a/rust/fory-core/src/serializer/trait_object.rs 
b/rust/fory-core/src/serializer/trait_object.rs
index f5b9ddf5b..6367e533c 100644
--- a/rust/fory-core/src/serializer/trait_object.rs
+++ b/rust/fory-core/src/serializer/trait_object.rs
@@ -90,7 +90,7 @@ macro_rules! downcast_and_serialize {
 /// register_trait_type!(Animal, Dog, Cat);
 ///
 /// # fn main() {
-/// let mut fory = Fory::default().compatible(true);
+/// let mut fory = Fory::builder().compatible(true).build();
 /// fory.register::<Dog>(100);
 /// fory.register::<Cat>(101);
 ///
diff --git a/rust/fory-core/src/serializer/weak.rs 
b/rust/fory-core/src/serializer/weak.rs
index 0bdd96aca..26b3e6f2f 100644
--- a/rust/fory-core/src/serializer/weak.rs
+++ b/rust/fory-core/src/serializer/weak.rs
@@ -338,7 +338,7 @@ impl<T: Serializer + ForyDefault + 'static> Serializer for 
RcWeak<T> {
         // Weak pointers require track_ref to be enabled on the Fory instance
         if !context.is_track_ref() {
             return Err(Error::invalid_ref(
-                "RcWeak requires track_ref to be enabled. Use 
Fory::default().track_ref(true)",
+                "RcWeak requires track_ref to be enabled. Use 
Fory::builder().track_ref(true).build()",
             ));
         }
         // Weak MUST use ref tracking - otherwise read value will be lost
@@ -511,7 +511,7 @@ impl<T: Serializer + ForyDefault + Send + Sync + 'static> 
Serializer for ArcWeak
         // Weak pointers require track_ref to be enabled on the Fory instance
         if !context.is_track_ref() {
             return Err(Error::invalid_ref(
-                "ArcWeak requires track_ref to be enabled. Use 
Fory::default().track_ref(true)",
+                "ArcWeak requires track_ref to be enabled. Use 
Fory::builder().track_ref(true).build()",
             ));
         }
         // Weak MUST use ref tracking - otherwise read value will be lost
diff --git a/rust/fory/src/lib.rs b/rust/fory/src/lib.rs
index f38cc7a37..d8199eb22 100644
--- a/rust/fory/src/lib.rs
+++ b/rust/fory/src/lib.rs
@@ -251,7 +251,7 @@
 //! }
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory = Fory::default().track_ref(true);
+//! let mut fory = Fory::builder().track_ref(true).build();
 //! fory.register::<Node>(2000);
 //!
 //! let parent = Rc::new(RefCell::new(Node {
@@ -293,7 +293,7 @@
 //! }
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory = Fory::default().track_ref(true);
+//! let mut fory = Fory::builder().track_ref(true).build();
 //! fory.register::<Node>(6000);
 //!
 //! let parent = Arc::new(Mutex::new(Node {
@@ -374,7 +374,7 @@
 //! }
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory = Fory::default().compatible(true);
+//! let mut fory = Fory::builder().compatible(true).build();
 //! fory.register::<Dog>(100);
 //! fory.register::<Cat>(101);
 //! fory.register::<Zoo>(102);
@@ -501,7 +501,7 @@
 //! }
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory = Fory::default().compatible(true);
+//! let mut fory = Fory::builder().compatible(true).build();
 //! fory.register::<Dog>(100);
 //! fory.register::<Cat>(101);
 //! fory.register::<AnimalShelter>(102);
@@ -555,7 +555,7 @@
 //! register_trait_type!(Animal, Dog);
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory = Fory::default().compatible(true);
+//! let mut fory = Fory::builder().compatible(true).build();
 //! fory.register::<Dog>(100);
 //!
 //! // For Rc<dyn Trait>
@@ -630,10 +630,10 @@
 //! }
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory1 = Fory::default().compatible(true);
+//! let mut fory1 = Fory::builder().compatible(true).build();
 //! fory1.register::<PersonV1>(1);
 //!
-//! let mut fory2 = Fory::default().compatible(true);
+//! let mut fory2 = Fory::builder().compatible(true).build();
 //! fory2.register::<PersonV2>(1);
 //!
 //! let person_v1 = PersonV1 {
@@ -727,10 +727,10 @@
 //! }
 //!
 //! # fn main() -> Result<(), Error> {
-//! let mut fory_old = Fory::default().compatible(true);
+//! let mut fory_old = Fory::builder().compatible(true).build();
 //! fory_old.register::<OldEvent>(5)?;
 //!
-//! let mut fory_new = Fory::default().compatible(true);
+//! let mut fory_new = Fory::builder().compatible(true).build();
 //! fory_new.register::<NewEvent>(5)?;
 //!
 //! // Serialize with old schema (2 fields)
@@ -1034,7 +1034,7 @@
 //! ```rust
 //! use fory::Fory;
 //!
-//! let fory = Fory::default().compatible(true);
+//! let fory = Fory::builder().compatible(true).build();
 //! ```
 //!
 //! ## Cross-Language Serialization
@@ -1051,9 +1051,9 @@
 //! use fory::Fory;
 //! use fory::ForyObject;
 //!
-//! let mut fory = Fory::default()
+//! let mut fory = Fory::builder()
 //!     .compatible(true)
-//!     .xlang(true);
+//!     .xlang(true).build();
 //!
 //! #[derive(ForyObject)]
 //! struct MyStruct {
@@ -1201,8 +1201,8 @@
 //! - **[GitHub Repository](https://github.com/apache/fory)** - Source code 
and issue tracking
 
 pub use fory_core::{
-    error::Error, fory::Fory, register_trait_type, row::from_row, row::to_row, 
types::TypeId,
-    ArcWeak, ForyDefault, RcWeak, ReadContext, Reader, Serializer, 
TypeResolver, WriteContext,
-    Writer,
+    error::Error, fory::Fory, fory::ForyBuilder, register_trait_type, 
row::from_row, row::to_row,
+    types::TypeId, ArcWeak, ForyDefault, RcWeak, ReadContext, Reader, 
Serializer, TypeResolver,
+    WriteContext, Writer,
 };
 pub use fory_derive::{ForyObject, ForyRow};
diff --git a/rust/tests/tests/compatible/test_basic_type.rs 
b/rust/tests/tests/compatible/test_basic_type.rs
index 4f08fee64..d1e124411 100644
--- a/rust/tests/tests/compatible/test_basic_type.rs
+++ b/rust/tests/tests/compatible/test_basic_type.rs
@@ -415,7 +415,7 @@ fn deserialize_nullable(fory: &Fory, bins: Vec<u8>, 
auto_conv: bool) {
 // non-null <-> non-null
 #[test]
 fn basic() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
     // serialize
     let bins = serialize_non_null(&fory);
     // deserialize
@@ -425,7 +425,7 @@ fn basic() {
 // nullable <-> nullable
 #[test]
 fn basic_nullable() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
     // serialize
     let bins = serialize_nullable(&fory);
     // deserialize
@@ -435,7 +435,7 @@ fn basic_nullable() {
 // non-null -> nullable -> non-null
 #[test]
 fn auto_conv() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
     // serialize_non-null
     let bins = serialize_non_null(&fory);
     deserialize_nullable(&fory, bins, true);
diff --git a/rust/tests/tests/compatible/test_container.rs 
b/rust/tests/tests/compatible/test_container.rs
index 2076574ef..f5d9189c3 100644
--- a/rust/tests/tests/compatible/test_container.rs
+++ b/rust/tests/tests/compatible/test_container.rs
@@ -219,7 +219,7 @@ fn complex_container2() -> Vec<HashMap<Vec<Item>, 
Vec<Item>>> {
 
 #[test]
 fn container_outer_auto_conv() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
     // serialize_outer_non-null
     let bytes = fory.serialize(&basic_list()).unwrap();
     assert_eq!(
@@ -285,9 +285,9 @@ fn container_outer_auto_conv() {
 
 #[test]
 fn collection_inner() {
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory2.register_by_name::<Item>("item").unwrap();
     for fory in [fory1, fory2] {
         // serialize
@@ -348,9 +348,9 @@ fn collection_inner() {
 
 #[test]
 fn collection_inner_auto_conv() {
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory2.register_by_name::<Item>("item").unwrap();
     for fory in [fory1, fory2] {
         // serialize_non_null
@@ -416,9 +416,9 @@ fn collection_inner_auto_conv() {
 
 #[test]
 fn map_inner() {
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory2.register_by_name::<Item>("item").unwrap();
     for fory in [fory1, fory2] {
         // serialize
@@ -453,9 +453,9 @@ fn map_inner() {
 
 #[test]
 fn map_inner_auto_conv() {
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory2.register_by_name::<Item>("item").unwrap();
     for fory in [fory1, fory2] {
         // serialize_non_null
@@ -493,9 +493,9 @@ fn map_inner_auto_conv() {
 
 #[test]
 fn complex() {
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory2.register_by_name::<Item>("item").unwrap();
     for fory in [fory1, fory2] {
         let mut bins = vec![
diff --git a/rust/tests/tests/compatible/test_struct.rs 
b/rust/tests/tests/compatible/test_struct.rs
index 50533e51c..98ea7552a 100644
--- a/rust/tests/tests/compatible/test_struct.rs
+++ b/rust/tests/tests/compatible/test_struct.rs
@@ -45,8 +45,8 @@ fn simple() {
         f7: i16,
         last: i8,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Animal1>(999).unwrap();
     fory2.register::<Animal2>(999).unwrap();
     let animal: Animal1 = Animal1 {
@@ -84,8 +84,8 @@ fn skip_option() {
         f2: i8,
         last: i64,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
     let item1 = Item1 {
@@ -123,8 +123,8 @@ fn nonexistent_struct() {
         f3: i64,
         last: String,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(899).unwrap();
     fory1.register::<Person1>(999).unwrap();
     fory2.register::<Item2>(799).unwrap();
@@ -155,7 +155,7 @@ fn option() {
         f5: Vec<Option<Vec<Option<String>>>>,
         last: i64,
     }
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<Animal>(999).unwrap();
     let animal: Animal = Animal {
         f1: Some(String::from("f1")),
@@ -199,8 +199,8 @@ fn nullable() {
         last: i64,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
 
@@ -253,8 +253,8 @@ fn nullable_container() {
         last: i64,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
 
@@ -305,8 +305,8 @@ fn inner_nullable() {
         f3: HashMap<i8, i8>,
         last: i64,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
 
@@ -352,8 +352,8 @@ fn nullable_struct() {
         f3: Item,
         last: i64,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(199).unwrap();
     fory1.register::<Person1>(200).unwrap();
     fory2.register::<Item>(199).unwrap();
@@ -429,11 +429,11 @@ fn enum_without_payload() {
         last: i8,
     }
 
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register::<Color1>(101).unwrap();
     fory1.register::<Color2>(102).unwrap();
     fory1.register::<Person1>(103).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register::<Color1>(101).unwrap();
     fory2.register::<Color2>(102).unwrap();
     fory2.register::<Person2>(103).unwrap();
@@ -495,10 +495,10 @@ fn named_enum() {
         f6: Option<Color>,
         last: i8,
     }
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register_by_name::<Color>("a").unwrap();
     fory1.register::<Item1>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register_by_name::<Color>("a").unwrap();
     fory2.register::<Item2>(101).unwrap();
     let item1 = Item1 {
@@ -551,9 +551,9 @@ fn boxed() {
         f6: Option<i32>,
     }
 
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register::<Item1>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register::<Item2>(101).unwrap();
 
     let f1 = 1;
@@ -667,9 +667,9 @@ fn test_struct_with_generic() {
         }
     }
 
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     let mut fory2 = Fory::default(); // Without compatible it works fine.
-    let mut fory3 = Fory::default().xlang(true); // Works fine with xlang 
enabled
+    let mut fory3 = Fory::builder().xlang(true).build(); // Works fine with 
xlang enabled
 
     fn inner_test(fory: &mut Fory) -> Result<(), Error> {
         fory.register::<MyStruct>(1)?;
diff --git a/rust/tests/tests/compatible/test_struct_enum.rs 
b/rust/tests/tests/compatible/test_struct_enum.rs
index 0952b6833..63c92c3d0 100644
--- a/rust/tests/tests/compatible/test_struct_enum.rs
+++ b/rust/tests/tests/compatible/test_struct_enum.rs
@@ -44,8 +44,8 @@ fn simple() {
         f7: i16,
         last: i8,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Animal1>(999).unwrap();
     fory2.register::<Animal2>(999).unwrap();
     let animal: Animal1 = Animal1 {
@@ -81,7 +81,7 @@ fn simple_write_continuous() {
         last: i8,
     }
 
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<Animal1>(999).unwrap();
     let animal: Animal1 = Animal1 {
         f1: HashMap::from([(1, vec![2])]),
@@ -128,8 +128,8 @@ fn skip_option() {
         f2: i8,
         last: i64,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
     let item1 = Item1 {
@@ -167,8 +167,8 @@ fn nonexistent_struct() {
         f3: i64,
         last: String,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(899).unwrap();
     fory1.register::<Person1>(999).unwrap();
     fory2.register::<Item2>(799).unwrap();
@@ -199,7 +199,7 @@ fn option() {
         f5: Vec<Option<Vec<Option<String>>>>,
         last: i64,
     }
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<Animal>(999).unwrap();
     let animal: Animal = Animal {
         f1: Some(String::from("f1")),
@@ -243,8 +243,8 @@ fn nullable() {
         last: i64,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
 
@@ -297,8 +297,8 @@ fn nullable_container() {
         last: i64,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
 
@@ -349,8 +349,8 @@ fn inner_nullable() {
         f3: HashMap<i8, i8>,
         last: i64,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item1>(999).unwrap();
     fory2.register::<Item2>(999).unwrap();
 
@@ -396,8 +396,8 @@ fn nullable_struct() {
         f3: Item,
         last: i64,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Item>(199).unwrap();
     fory1.register::<Person1>(200).unwrap();
     fory2.register::<Item>(199).unwrap();
@@ -473,11 +473,11 @@ fn enum_without_payload() {
         last: i8,
     }
 
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register::<Color1>(101).unwrap();
     fory1.register::<Color2>(102).unwrap();
     fory1.register::<Person1>(103).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register::<Color1>(101).unwrap();
     fory2.register::<Color2>(102).unwrap();
     fory2.register::<Person2>(103).unwrap();
@@ -539,10 +539,10 @@ fn named_enum() {
         f6: Option<Color>,
         last: i8,
     }
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register_by_name::<Color>("a").unwrap();
     fory1.register::<Item1>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register_by_name::<Color>("a").unwrap();
     fory2.register::<Item2>(101).unwrap();
     let item1 = Item1 {
@@ -595,9 +595,9 @@ fn boxed() {
         f6: Option<i32>,
     }
 
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register::<Item1>(101).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register::<Item2>(101).unwrap();
 
     let f1 = 1;
diff --git a/rust/tests/tests/test_array.rs b/rust/tests/tests/test_array.rs
index 84e0201fe..784afcecd 100644
--- a/rust/tests/tests/test_array.rs
+++ b/rust/tests/tests/test_array.rs
@@ -255,7 +255,7 @@ register_trait_type!(Shape, Circle, Rectangle);
 
 #[test]
 fn test_array_box_trait_objects() {
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<Circle>(9001).unwrap();
     fory.register::<Rectangle>(9002).unwrap();
 
@@ -333,7 +333,7 @@ fn test_struct_with_vec_of_arrays() {
 
 #[test]
 fn test_array_rc_trait_objects() {
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<Circle>(9001).unwrap();
     fory.register::<Rectangle>(9002).unwrap();
 
diff --git a/rust/tests/tests/test_collection.rs 
b/rust/tests/tests/test_collection.rs
index 0d6264793..d3f0684fc 100644
--- a/rust/tests/tests/test_collection.rs
+++ b/rust/tests/tests/test_collection.rs
@@ -131,7 +131,7 @@ fn test_hashset_max_collection_size_guardrail() {
     ]);
     let serialized = fory.serialize(&original).unwrap();
 
-    let limited_fory = Fory::default().max_collection_size(2);
+    let limited_fory = Fory::builder().max_collection_size(2).build();
     let err = limited_fory
         .deserialize::<HashSet<String>>(&serialized)
         .expect_err("expected collection size guardrail to reject the 
payload");
diff --git a/rust/tests/tests/test_cross_language.rs 
b/rust/tests/tests/test_cross_language.rs
index 8a7b48288..712d6309c 100644
--- a/rust/tests/tests/test_cross_language.rs
+++ b/rust/tests/tests/test_cross_language.rs
@@ -243,15 +243,17 @@ fn test_string_serializer() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
-    let fory = Fory::default()
+    let fory = Fory::builder()
         .compatible(true)
         .xlang(true)
-        .compress_string(false);
+        .compress_string(false)
+        .build();
     let mut reader_compress = Reader::new(bytes.as_slice());
-    let fory_compress = Fory::default()
+    let fory_compress = Fory::builder()
         .compatible(true)
         .xlang(true)
-        .compress_string(true);
+        .compress_string(true)
+        .build();
     let test_strings: Vec<String> = vec![
         // Latin1
         "ab".to_string(),
@@ -273,7 +275,7 @@ fn test_string_serializer() {
                 .unwrap()
         );
     }
-    let fory = Fory::default().compatible(true).xlang(true);
+    let fory = Fory::builder().compatible(true).xlang(true).build();
     let mut buf = Vec::new();
     for s in &test_strings {
         fory.serialize_to(&mut buf, s).unwrap();
@@ -305,7 +307,7 @@ fn test_cross_language_serializer() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Color>(101).unwrap();
     assert_de!(fory, reader, bool, true);
     assert_de!(fory, reader, bool, false);
@@ -372,7 +374,7 @@ fn test_cross_language_serializer() {
 fn test_simple_struct() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Color>(101).unwrap();
     fory.register::<Item>(102).unwrap();
     fory.register::<SimpleStruct>(103).unwrap();
@@ -403,7 +405,7 @@ fn test_simple_struct() {
 fn test_named_simple_struct() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register_by_namespace::<Color>("demo", "color")
         .unwrap();
     fory.register_by_namespace::<Item>("demo", "item").unwrap();
@@ -436,7 +438,7 @@ fn test_named_simple_struct() {
 fn test_struct_evolving_override() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register_by_namespace::<EvolvingOverrideStruct>("test", 
"evolving_yes")
         .unwrap();
     fory.register_by_namespace::<FixedOverrideStruct>("test", "evolving_off")
@@ -470,7 +472,7 @@ fn test_list() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Item>(102).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
 
@@ -512,7 +514,7 @@ fn test_map() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Item>(102).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
 
@@ -585,7 +587,7 @@ fn test_integer() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Item2>(101).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
     let f1 = 1;
@@ -692,10 +694,10 @@ fn _test_skip_custom(fory1: &Fory, fory2: &Fory) {
 #[test]
 #[ignore]
 fn test_skip_id_custom() {
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1.register_serializer::<MyExt>(103).unwrap();
     fory1.register::<Empty>(104).unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register::<Color>(101).unwrap();
     fory2.register::<MyStruct>(102).unwrap();
     fory2.register_serializer::<MyExt>(103).unwrap();
@@ -706,12 +708,12 @@ fn test_skip_id_custom() {
 #[test]
 #[ignore]
 fn test_skip_name_custom() {
-    let mut fory1 = Fory::default().compatible(true).xlang(true);
+    let mut fory1 = Fory::builder().compatible(true).xlang(true).build();
     fory1
         .register_serializer_by_name::<MyExt>("my_ext")
         .unwrap();
     fory1.register_by_name::<Empty>("my_wrapper").unwrap();
-    let mut fory2 = Fory::default().compatible(true).xlang(true);
+    let mut fory2 = Fory::builder().compatible(true).xlang(true).build();
     fory2.register_by_name::<Color>("color").unwrap();
     fory2.register_by_name::<MyStruct>("my_struct").unwrap();
     fory2
@@ -724,7 +726,7 @@ fn test_skip_name_custom() {
 #[test]
 #[ignore]
 fn test_consistent_named() {
-    let mut fory = Fory::default().compatible(false).xlang(true);
+    let mut fory = Fory::builder().compatible(false).xlang(true).build();
     fory.register_by_name::<Color>("color").unwrap();
     fory.register_by_name::<MyStruct>("my_struct").unwrap();
     fory.register_serializer_by_name::<MyExt>("my_ext").unwrap();
@@ -827,10 +829,11 @@ struct TwoEnumFieldStruct {
 fn test_struct_version_check() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
-    let mut fory = Fory::default()
+    let mut fory = Fory::builder()
         .compatible(false)
         .xlang(true)
-        .check_struct_version(true);
+        .check_struct_version(true)
+        .build();
     fory.register::<VersionCheckStruct>(201).unwrap();
 
     let local_obj = VersionCheckStruct {
@@ -852,7 +855,7 @@ fn test_item() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Item>(102).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
 
@@ -887,7 +890,7 @@ fn test_color() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Color>(101).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
 
@@ -914,7 +917,7 @@ fn test_struct_with_list() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<StructWithList>(201).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
 
@@ -946,7 +949,7 @@ fn test_struct_with_map() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<StructWithMap>(202).unwrap();
     let mut reader = Reader::new(bytes.as_slice());
 
@@ -1009,7 +1012,7 @@ fn test_polymorphic_list() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Dog>(302).unwrap();
     fory.register::<Cat>(303).unwrap();
     fory.register::<AnimalListHolder>(304).unwrap();
@@ -1060,7 +1063,7 @@ fn test_polymorphic_map() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<Dog>(302).unwrap();
     fory.register::<Cat>(303).unwrap();
     fory.register::<AnimalMapHolder>(305).unwrap();
@@ -1123,7 +1126,7 @@ fn test_one_string_field_schema() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(false).xlang(true);
+    let mut fory = Fory::builder().compatible(false).xlang(true).build();
     fory.register::<OneStringFieldStruct>(200).unwrap();
 
     let value: OneStringFieldStruct = fory.deserialize(&bytes).unwrap();
@@ -1139,7 +1142,7 @@ fn test_one_string_field_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<OneStringFieldStruct>(200).unwrap();
 
     let value: OneStringFieldStruct = fory.deserialize(&bytes).unwrap();
@@ -1155,7 +1158,7 @@ fn test_two_string_field_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<TwoStringFieldStruct>(201).unwrap();
 
     let value: TwoStringFieldStruct = fory.deserialize(&bytes).unwrap();
@@ -1173,7 +1176,7 @@ fn test_schema_evolution_compatible() {
     let bytes = fs::read(&data_file_path).unwrap();
 
     // Read TwoStringFieldStruct data as EmptyStructEvolution
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<EmptyStructEvolution>(200).unwrap();
 
     let value: EmptyStructEvolution = fory.deserialize(&bytes).unwrap();
@@ -1190,7 +1193,7 @@ fn test_schema_evolution_compatible_reverse() {
     let bytes = fs::read(&data_file_path).unwrap();
 
     // Read OneStringFieldStruct data as TwoStringFieldStruct (missing f2)
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<TwoStringFieldStruct>(200).unwrap();
 
     let value: TwoStringFieldStruct = fory.deserialize(&bytes).unwrap();
@@ -1214,7 +1217,7 @@ fn test_one_enum_field_schema() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(false).xlang(true);
+    let mut fory = Fory::builder().compatible(false).xlang(true).build();
     fory.register::<TestEnum>(210).unwrap();
     fory.register::<OneEnumFieldStruct>(211).unwrap();
 
@@ -1231,7 +1234,7 @@ fn test_one_enum_field_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<TestEnum>(210).unwrap();
     fory.register::<OneEnumFieldStruct>(211).unwrap();
 
@@ -1248,7 +1251,7 @@ fn test_two_enum_field_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<TestEnum>(210).unwrap();
     fory.register::<TwoEnumFieldStruct>(212).unwrap();
 
@@ -1267,7 +1270,7 @@ fn test_enum_schema_evolution_compatible() {
     let bytes = fs::read(&data_file_path).unwrap();
 
     // Read TwoEnumFieldStruct data as EmptyStructEvolution
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<TestEnum>(210).unwrap();
     fory.register::<EmptyStructEvolution>(211).unwrap();
 
@@ -1285,7 +1288,7 @@ fn test_enum_schema_evolution_compatible_reverse() {
     let bytes = fs::read(&data_file_path).unwrap();
 
     // Read OneEnumFieldStruct data as TwoEnumFieldStruct (missing f2)
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<TestEnum>(210).unwrap();
     fory.register::<TwoEnumFieldStruct>(211).unwrap();
 
@@ -1420,7 +1423,7 @@ fn test_nullable_field_schema_consistent_not_null() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(false).xlang(true);
+    let mut fory = Fory::builder().compatible(false).xlang(true).build();
     fory.register::<NullableComprehensiveSchemaConsistent>(401)
         .unwrap();
 
@@ -1470,7 +1473,7 @@ fn test_nullable_field_schema_consistent_null() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(false).xlang(true);
+    let mut fory = Fory::builder().compatible(false).xlang(true).build();
     fory.register::<NullableComprehensiveSchemaConsistent>(401)
         .unwrap();
 
@@ -1523,7 +1526,7 @@ fn test_nullable_field_compatible_not_null() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<NullableComprehensiveCompatible>(402)
         .unwrap();
 
@@ -1583,7 +1586,7 @@ fn test_nullable_field_compatible_null() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<NullableComprehensiveCompatible>(402)
         .unwrap();
 
@@ -1667,7 +1670,7 @@ fn test_union_xlang() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     // Register both the enum and the struct that contains it
     fory.register::<StringOrLong>(300).unwrap();
     fory.register::<StructWithUnion2>(301).unwrap();
@@ -1761,10 +1764,11 @@ fn test_ref_schema_consistent() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default()
+    let mut fory = Fory::builder()
         .compatible(false)
         .xlang(true)
-        .track_ref(true);
+        .track_ref(true)
+        .build();
     fory.register::<RefInnerSchemaConsistent>(501).unwrap();
     fory.register::<RefOuterSchemaConsistent>(502).unwrap();
 
@@ -1808,7 +1812,11 @@ fn test_ref_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = 
Fory::default().compatible(true).xlang(true).track_ref(true);
+    let mut fory = Fory::builder()
+        .compatible(true)
+        .xlang(true)
+        .track_ref(true)
+        .build();
     fory.register::<RefInnerCompatible>(503).unwrap();
     fory.register::<RefOuterCompatible>(504).unwrap();
 
@@ -1848,10 +1856,11 @@ fn test_collection_element_ref_override() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default()
+    let mut fory = Fory::builder()
         .compatible(false)
         .xlang(true)
-        .track_ref(true);
+        .track_ref(true)
+        .build();
     fory.register::<RefOverrideElement>(701).unwrap();
     fory.register::<RefOverrideContainer>(702).unwrap();
 
@@ -1902,10 +1911,11 @@ fn test_circular_ref_schema_consistent() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default()
+    let mut fory = Fory::builder()
         .compatible(false)
         .xlang(true)
-        .track_ref(true);
+        .track_ref(true)
+        .build();
     fory.register::<CircularRefStruct>(601).unwrap();
 
     // Deserialize as Rc<CircularRefStruct> since the whole struct needs ref 
tracking
@@ -1946,7 +1956,11 @@ fn test_circular_ref_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = 
Fory::default().compatible(true).xlang(true).track_ref(true);
+    let mut fory = Fory::builder()
+        .compatible(true)
+        .xlang(true)
+        .track_ref(true)
+        .build();
     fory.register::<CircularRefStruct>(602).unwrap();
 
     // Deserialize as Rc<CircularRefStruct> since the whole struct needs ref 
tracking
@@ -2061,7 +2075,7 @@ fn test_unsigned_schema_consistent() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(false).xlang(true);
+    let mut fory = Fory::builder().compatible(false).xlang(true).build();
     fory.register::<UnsignedSchemaConsistent>(501).unwrap();
 
     let local_obj = UnsignedSchemaConsistent {
@@ -2098,7 +2112,7 @@ fn test_unsigned_schema_compatible() {
     let data_file_path = get_data_file();
     let bytes = fs::read(&data_file_path).unwrap();
 
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     fory.register::<UnsignedSchemaCompatible>(502).unwrap();
 
     let local_obj = UnsignedSchemaCompatible {
diff --git a/rust/tests/tests/test_debug.rs b/rust/tests/tests/test_debug.rs
index 7c0e86369..a83e3a9f8 100644
--- a/rust/tests/tests/test_debug.rs
+++ b/rust/tests/tests/test_debug.rs
@@ -150,7 +150,7 @@ fn debug_hooks_trigger_for_struct() {
 
     event_log().lock().unwrap().clear();
 
-    let mut fory_compat = Fory::default().compatible(true);
+    let mut fory_compat = Fory::builder().compatible(true).build();
     fory_compat.register::<DebugSample>(4001).unwrap();
     let compat_bytes = fory_compat.serialize(&sample).unwrap();
     let _: DebugSample = 
fory_compat.deserialize(compat_bytes.as_slice()).unwrap();
diff --git a/rust/tests/tests/test_enum.rs b/rust/tests/tests/test_enum.rs
index 6e5722bb8..a355ed11d 100644
--- a/rust/tests/tests/test_enum.rs
+++ b/rust/tests/tests/test_enum.rs
@@ -34,7 +34,7 @@ fn basic() {
         Map(HashMap<String, Token>),
     }
 
-    let mut fory = Fory::default().xlang(false);
+    let mut fory = Fory::builder().xlang(false).build();
     fory.register::<Token>(1000).unwrap();
 
     let mut map = HashMap::new();
@@ -75,10 +75,10 @@ fn named_enum() {
         Assign { value: i32, target: String },
     }
 
-    let mut fory1 = Fory::default().xlang(false);
+    let mut fory1 = Fory::builder().xlang(false).build();
     fory1.register::<Token1>(1000).unwrap();
 
-    let mut fory2 = Fory::default().xlang(false);
+    let mut fory2 = Fory::builder().xlang(false).build();
     fory2.register::<Token2>(1000).unwrap();
 
     let token = Token1::Assign {
@@ -132,7 +132,7 @@ fn struct_with_enum_field() {
         Color::fory_static_type_id()
     );
 
-    let mut fory = Fory::default().xlang(true).compatible(false);
+    let mut fory = Fory::builder().xlang(true).compatible(false).build();
     fory.register::<Color>(100).unwrap();
     fory.register::<StructWithEnum>(101).unwrap();
 
@@ -176,7 +176,7 @@ fn union_compatible_enum_xlang_format() {
     }
 
     // Test xlang mode serialization
-    let mut fory = Fory::default().xlang(true).compatible(false);
+    let mut fory = Fory::builder().xlang(true).compatible(false).build();
     fory.register::<StringOrLong>(300).unwrap();
     fory.register::<StructWithUnion>(301).unwrap();
 
@@ -224,7 +224,7 @@ fn struct_with_enum_field_explicit_nullable() {
         "Status should have ENUM TypeId"
     );
 
-    let mut fory = Fory::default().xlang(true).compatible(false);
+    let mut fory = Fory::builder().xlang(true).compatible(false).build();
     fory.register::<Status>(200).unwrap();
     fory.register::<StructWithExplicitNullable>(201).unwrap();
 
diff --git a/rust/tests/tests/test_enum_compatible.rs 
b/rust/tests/tests/test_enum_compatible.rs
index 8d5c0f383..a6623e89a 100644
--- a/rust/tests/tests/test_enum_compatible.rs
+++ b/rust/tests/tests/test_enum_compatible.rs
@@ -40,10 +40,10 @@ fn test_unnamed_enum_variant_compatible() {
     }
 
     // Test 1: Serialize v1 (2 fields), deserialize as v2 (3 fields)
-    let mut fory_v1 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(false).compatible(true).build();
     fory_v1.register::<EventV1>(2000).unwrap();
 
-    let mut fory_v2 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(false).compatible(true).build();
     fory_v2.register::<EventV2>(2000).unwrap();
 
     let event_v1 = EventV1::Message(42, "hello".to_string());
@@ -80,7 +80,7 @@ fn test_unnamed_enum_variant_compatible() {
         NewVariant(bool), // This variant doesn't exist in EventV1
     }
 
-    let mut fory_v3 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v3 = Fory::builder().xlang(false).compatible(true).build();
     fory_v3.register::<EventV3>(2000).unwrap();
 
     let event_v3 = EventV3::NewVariant(true);
@@ -117,10 +117,10 @@ fn test_named_enum_variant_compatible() {
         },
     }
 
-    let mut fory_v1 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(false).compatible(true).build();
     fory_v1.register::<CommandV1>(3000).unwrap();
 
-    let mut fory_v2 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(false).compatible(true).build();
     fory_v2.register::<CommandV2>(3000).unwrap();
 
     // Test 1: Serialize v1, deserialize as v2 (new field gets default value)
@@ -198,13 +198,13 @@ fn test_named_enum_field_evolution() {
         },
     }
 
-    let mut fory_v1 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(false).compatible(true).build();
     fory_v1.register::<ConfigV1>(4000).unwrap();
 
-    let mut fory_v2 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(false).compatible(true).build();
     fory_v2.register::<ConfigV2>(4000).unwrap();
 
-    let mut fory_v3 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v3 = Fory::builder().xlang(false).compatible(true).build();
     fory_v3.register::<ConfigV3>(4000).unwrap();
 
     // Test V1 -> V2: New fields get default values
@@ -319,13 +319,13 @@ fn test_named_enum_variant_add_remove() {
         },
     }
 
-    let mut fory_v1 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(false).compatible(true).build();
     fory_v1.register::<TaskV1>(5000).unwrap();
 
-    let mut fory_v2 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(false).compatible(true).build();
     fory_v2.register::<TaskV2>(5000).unwrap();
 
-    let mut fory_v3 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v3 = Fory::builder().xlang(false).compatible(true).build();
     fory_v3.register::<TaskV3>(5000).unwrap();
 
     // Test V2 (new variant Completed) -> V1: Unknown variant falls back to 
default
@@ -458,13 +458,13 @@ fn test_enum_variant_type_change() {
         Finished,                // Unnamed -> Unit
     }
 
-    let mut fory_v1 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(false).compatible(true).build();
     fory_v1.register::<StatusV1>(6000).unwrap();
 
-    let mut fory_v2 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(false).compatible(true).build();
     fory_v2.register::<StatusV2>(6000).unwrap();
 
-    let mut fory_v3 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v3 = Fory::builder().xlang(false).compatible(true).build();
     fory_v3.register::<StatusV3>(6000).unwrap();
 
     // Test V1 Unit -> V2 Named: Type mismatch, uses default value
@@ -593,15 +593,15 @@ fn test_struct_with_enum_field_evolution() {
         sender: Option<String>, // New optional field
     }
 
-    let mut fory_v1 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v1 = Fory::builder().xlang(false).compatible(true).build();
     fory_v1.register::<StateV1>(7001).unwrap();
     fory_v1.register::<MessageV1>(7000).unwrap();
 
-    let mut fory_v2 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v2 = Fory::builder().xlang(false).compatible(true).build();
     fory_v2.register::<StateV2>(7001).unwrap();
     fory_v2.register::<MessageV2>(7000).unwrap();
 
-    let mut fory_v3 = Fory::default().xlang(false).compatible(true);
+    let mut fory_v3 = Fory::builder().xlang(false).compatible(true).build();
     fory_v3.register::<StateV3>(7001).unwrap();
     fory_v3.register::<MessageV3>(7000).unwrap();
 
diff --git a/rust/tests/tests/test_ext.rs b/rust/tests/tests/test_ext.rs
index 2cf0cc7b4..294769569 100644
--- a/rust/tests/tests/test_ext.rs
+++ b/rust/tests/tests/test_ext.rs
@@ -82,7 +82,7 @@ fn test_use() {
             self
         }
     }
-    let mut fory = Fory::default().compatible(true).xlang(true);
+    let mut fory = Fory::builder().compatible(true).xlang(true).build();
     let item = Item { f1: 1, f2: 2 };
     fory.register_serializer::<Item>(100).unwrap();
     let bytes = fory.serialize(&item).unwrap();
diff --git a/rust/tests/tests/test_field_meta.rs 
b/rust/tests/tests/test_field_meta.rs
index 034640459..b0f0b3920 100644
--- a/rust/tests/tests/test_field_meta.rs
+++ b/rust/tests/tests/test_field_meta.rs
@@ -326,10 +326,10 @@ mod compatible_v2 {
 #[test]
 fn test_compatible_mode_v1_to_v2() {
     // Serialize with V1, deserialize with V2 (forward compatibility)
-    let mut fory_v1 = Fory::default().compatible(true);
+    let mut fory_v1 = Fory::builder().compatible(true).build();
     fory_v1.register::<compatible_v1::UserV1>(100).unwrap();
 
-    let mut fory_v2 = Fory::default().compatible(true);
+    let mut fory_v2 = Fory::builder().compatible(true).build();
     fory_v2.register::<compatible_v2::UserV2>(100).unwrap();
 
     let user_v1 = compatible_v1::UserV1 {
@@ -351,10 +351,10 @@ fn test_compatible_mode_v1_to_v2() {
 #[test]
 fn test_compatible_mode_v2_to_v1() {
     // Serialize with V2, deserialize with V1 (backward compatibility)
-    let mut fory_v1 = Fory::default().compatible(true);
+    let mut fory_v1 = Fory::builder().compatible(true).build();
     fory_v1.register::<compatible_v1::UserV1>(100).unwrap();
 
-    let mut fory_v2 = Fory::default().compatible(true);
+    let mut fory_v2 = Fory::builder().compatible(true).build();
     fory_v2.register::<compatible_v2::UserV2>(100).unwrap();
 
     let user_v2 = compatible_v2::UserV2 {
@@ -407,12 +407,12 @@ mod compatible_reorder_v2 {
 #[test]
 fn test_compatible_mode_field_reorder() {
     // Test that field IDs allow fields to be reordered between versions
-    let mut fory_v1 = Fory::default().compatible(true);
+    let mut fory_v1 = Fory::builder().compatible(true).build();
     fory_v1
         .register::<compatible_reorder_v1::DataV1>(200)
         .unwrap();
 
-    let mut fory_v2 = Fory::default().compatible(true);
+    let mut fory_v2 = Fory::builder().compatible(true).build();
     fory_v2
         .register::<compatible_reorder_v2::DataV2>(200)
         .unwrap();
@@ -466,12 +466,12 @@ mod compatible_remove_field_v2 {
 #[test]
 fn test_compatible_mode_field_removed() {
     // Test that removed fields are handled in compatible mode
-    let mut fory_v1 = Fory::default().compatible(true);
+    let mut fory_v1 = Fory::builder().compatible(true).build();
     fory_v1
         .register::<compatible_remove_field_v1::ConfigV1>(300)
         .unwrap();
 
-    let mut fory_v2 = Fory::default().compatible(true);
+    let mut fory_v2 = Fory::builder().compatible(true).build();
     fory_v2
         .register::<compatible_remove_field_v2::ConfigV2>(300)
         .unwrap();
@@ -525,7 +525,7 @@ fn test_skip_with_field_id() {
 #[test]
 fn test_compatible_mode_roundtrip() {
     // Test full roundtrip with compatible mode and field IDs
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<compatible_v2::UserV2>(400).unwrap();
 
     let original = compatible_v2::UserV2 {
@@ -582,12 +582,12 @@ fn test_field_id_payload_compatible_mode() {
     // Test that structs with field IDs produce smaller payloads in compatible 
mode.
     // Field IDs are encoded as compact 1-2 byte integers instead of full 
field names,
     // following the xlang serialization spec (TAG_ID encoding with 2-bit 
marker 0b11).
-    let mut fory_compact = Fory::default().compatible(true);
+    let mut fory_compact = Fory::builder().compatible(true).build();
     fory_compact
         .register::<payload_with_field_ids::CompactUser>(500)
         .unwrap();
 
-    let mut fory_verbose = Fory::default().compatible(true);
+    let mut fory_verbose = Fory::builder().compatible(true).build();
     fory_verbose
         .register::<payload_without_field_ids::VerboseUser>(501)
         .unwrap();
diff --git a/rust/tests/tests/test_fory.rs b/rust/tests/tests/test_fory.rs
index 332428f9e..ebd2bb29f 100644
--- a/rust/tests/tests/test_fory.rs
+++ b/rust/tests/tests/test_fory.rs
@@ -338,9 +338,10 @@ fn test_size_guardrail_configuration_accessors() {
     assert_eq!(default_fory.get_max_binary_size(), 64 * 1024 * 1024);
     assert_eq!(default_fory.get_max_collection_size(), 1024 * 1024);
 
-    let configured_fory = Fory::default()
+    let configured_fory = Fory::builder()
         .max_binary_size(4096)
-        .max_collection_size(128);
+        .max_collection_size(128)
+        .build();
     assert_eq!(configured_fory.get_max_binary_size(), 4096);
     assert_eq!(configured_fory.get_max_collection_size(), 128);
 }
@@ -351,7 +352,7 @@ fn test_max_binary_size_does_not_limit_string_reads() {
     let original = "this string should not be treated as binary".repeat(4);
     let serialized = fory.serialize(&original).unwrap();
 
-    let limited_fory = Fory::default().max_binary_size(4);
+    let limited_fory = Fory::builder().max_binary_size(4).build();
     let deserialized: String = limited_fory.deserialize(&serialized).unwrap();
 
     assert_eq!(deserialized, original);
diff --git a/rust/tests/tests/test_list.rs b/rust/tests/tests/test_list.rs
index 0c8f8f5d2..b119697e4 100644
--- a/rust/tests/tests/test_list.rs
+++ b/rust/tests/tests/test_list.rs
@@ -197,7 +197,7 @@ fn test_vec_max_collection_size_guardrail() {
     let original = vec!["alpha".to_string(), "beta".to_string(), 
"gamma".to_string()];
     let serialized = fory.serialize(&original).unwrap();
 
-    let limited_fory = Fory::default().max_collection_size(2);
+    let limited_fory = Fory::builder().max_collection_size(2).build();
     let err = limited_fory
         .deserialize::<Vec<String>>(&serialized)
         .expect_err("expected vec deserialization to fail on 
max_collection_size");
diff --git a/rust/tests/tests/test_map.rs b/rust/tests/tests/test_map.rs
index 832dca516..b7562a1d0 100644
--- a/rust/tests/tests/test_map.rs
+++ b/rust/tests/tests/test_map.rs
@@ -78,7 +78,7 @@ fn test_hashmap_max_collection_size_guardrail() {
     ]);
     let serialized = fory.serialize(&map).unwrap();
 
-    let limited_fory = Fory::default().max_collection_size(2);
+    let limited_fory = Fory::builder().max_collection_size(2).build();
     let err = limited_fory
         .deserialize::<HashMap<String, i32>>(&serialized)
         .expect_err("expected hashmap deserialization to fail on 
max_collection_size");
@@ -103,7 +103,7 @@ fn test_btreemap_max_collection_size_guardrail() {
     ]);
     let serialized = fory.serialize(&map).unwrap();
 
-    let limited_fory = Fory::default().max_collection_size(2);
+    let limited_fory = Fory::builder().max_collection_size(2).build();
     let err = limited_fory
         .deserialize::<BTreeMap<String, i32>>(&serialized)
         .expect_err("expected btreemap deserialization to fail on 
max_collection_size");
diff --git a/rust/tests/tests/test_max_dyn_depth.rs 
b/rust/tests/tests/test_max_dyn_depth.rs
index 521a11303..03f7e3d82 100644
--- a/rust/tests/tests/test_max_dyn_depth.rs
+++ b/rust/tests/tests/test_max_dyn_depth.rs
@@ -32,7 +32,10 @@ fn test_max_dyn_depth_exceeded_box_dyn_any() {
         return;
     }
     for compatible in [false, true] {
-        let mut fory = Fory::default().max_dyn_depth(2).compatible(compatible);
+        let mut fory = Fory::builder()
+            .max_dyn_depth(2)
+            .compatible(compatible)
+            .build();
         fory.register::<Container>(100).unwrap();
 
         let level3 = Container {
@@ -66,7 +69,7 @@ fn test_max_dyn_depth_within_limit_box_dyn_any() {
     if fory_core::error::should_panic_on_error() {
         return;
     }
-    let mut fory = Fory::default().max_dyn_depth(3);
+    let mut fory = Fory::builder().max_dyn_depth(3).build();
     fory.register::<Container>(100).unwrap();
 
     let level3 = Container {
diff --git a/rust/tests/tests/test_one_struct.rs 
b/rust/tests/tests/test_one_struct.rs
index 070d3af04..bc69903bf 100644
--- a/rust/tests/tests/test_one_struct.rs
+++ b/rust/tests/tests/test_one_struct.rs
@@ -46,8 +46,8 @@ fn test_simple() {
         f7: i16,
         last: i8,
     }
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Animal1>(999).unwrap();
     fory2.register::<Animal2>(999).unwrap();
     let animal: Animal1 = Animal1 {
diff --git a/rust/tests/tests/test_rc_arc_trait_object.rs 
b/rust/tests/tests/test_rc_arc_trait_object.rs
index 2bbed8a1a..1ebc7b035 100644
--- a/rust/tests/tests/test_rc_arc_trait_object.rs
+++ b/rust/tests/tests/test_rc_arc_trait_object.rs
@@ -25,7 +25,7 @@ use std::rc::Rc;
 use std::sync::Arc;
 
 fn fory_compatible() -> Fory {
-    Fory::default().compatible(true)
+    Fory::builder().compatible(true).build()
 }
 
 trait Animal: Serializer + Send + Sync {
diff --git a/rust/tests/tests/test_simple_struct.rs 
b/rust/tests/tests/test_simple_struct.rs
index 94b7542e0..b0cb285ff 100644
--- a/rust/tests/tests/test_simple_struct.rs
+++ b/rust/tests/tests/test_simple_struct.rs
@@ -68,8 +68,8 @@ fn test_compatible_field_type_change() {
         value: Option<i32>,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<Data1>(100).unwrap();
     fory2.register::<Data2>(100).unwrap();
 
@@ -92,10 +92,11 @@ fn test_struct_evolving_override() {
         id: i32,
     }
 
-    let mut fory = Fory::default()
+    let mut fory = Fory::builder()
         .xlang(true)
         .compatible(true)
-        .track_ref(false);
+        .track_ref(false)
+        .build();
     fory.register::<Evolving>(100).unwrap();
     fory.register::<Fixed>(101).unwrap();
 
@@ -129,8 +130,8 @@ fn test_compatible_to_empty_struct() {
     #[derive(ForyObject, Debug)]
     struct EmptyData {}
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<DataWithField>(101).unwrap();
     fory2.register::<EmptyData>(101).unwrap();
 
@@ -155,8 +156,8 @@ fn test_compatible_from_empty_struct() {
         name: String,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<EmptyData>(102).unwrap();
     fory2.register::<DataWithField>(102).unwrap();
 
@@ -178,8 +179,8 @@ fn test_compatible_vec_to_empty_struct() {
     #[derive(ForyObject, Debug)]
     struct EmptyData {}
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<DataWithField>(101).unwrap();
     fory2.register::<EmptyData>(101).unwrap();
 
@@ -203,8 +204,8 @@ fn test_compatible_map_to_empty_struct() {
     #[derive(ForyObject, Debug)]
     struct EmptyData {}
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<DataWithField>(101).unwrap();
     fory2.register::<EmptyData>(101).unwrap();
 
diff --git a/rust/tests/tests/test_skip_fields.rs 
b/rust/tests/tests/test_skip_fields.rs
index 3f9cabd3e..5bb4b3699 100644
--- a/rust/tests/tests/test_skip_fields.rs
+++ b/rust/tests/tests/test_skip_fields.rs
@@ -357,7 +357,7 @@ fn test_trait_object_serialization() {
         skipped_animal: Box<dyn Animal>,
     }
 
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<Dog>(100).unwrap();
     fory.register::<Cat>(101).unwrap();
     fory.register::<Zoo>(102).unwrap();
@@ -397,7 +397,7 @@ fn test_trait_object_serialization() {
         normal_field: String,
     }
 
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<ComplexSkipExample>(106).unwrap();
 
     let complex = ComplexSkipExample {
diff --git a/rust/tests/tests/test_trait_object.rs 
b/rust/tests/tests/test_trait_object.rs
index 03979b27d..4113d35db 100644
--- a/rust/tests/tests/test_trait_object.rs
+++ b/rust/tests/tests/test_trait_object.rs
@@ -22,7 +22,7 @@ use fory_derive::ForyObject;
 use std::collections::{HashMap, HashSet};
 
 fn fory_compatible() -> Fory {
-    Fory::default().compatible(true)
+    Fory::builder().compatible(true).build()
 }
 
 #[test]
diff --git a/rust/tests/tests/test_tuple.rs b/rust/tests/tests/test_tuple.rs
index a28ea35c0..864e3cf5f 100644
--- a/rust/tests/tests/test_tuple.rs
+++ b/rust/tests/tests/test_tuple.rs
@@ -230,7 +230,7 @@ fn test_tuple_type_id() {
 // Test tuples in xlang mode
 #[test]
 fn test_tuple_xlang_mode() {
-    let fory = Fory::default().xlang(true);
+    let fory = Fory::builder().xlang(true).build();
 
     // Test homogeneous tuple
     let homogeneous = (1i32, 2i32, 3i32);
@@ -268,7 +268,7 @@ fn run_struct_with_simple_tuple_fields(xlang: bool) {
         triple: (bool, u32, i64),
     }
 
-    let mut fory = Fory::default().xlang(xlang);
+    let mut fory = Fory::builder().xlang(xlang).build();
     fory.register::<SimpleTupleStruct>(1).unwrap();
 
     let data = SimpleTupleStruct {
@@ -304,7 +304,7 @@ fn run_struct_with_complex_tuple_fields(xlang: bool) {
         complex_nested: ComplexNestedTuple,
     }
 
-    let mut fory = Fory::default().xlang(xlang);
+    let mut fory = Fory::builder().xlang(xlang).build();
     fory.register::<ComplexTupleStruct>(2).unwrap();
 
     let data = ComplexTupleStruct {
diff --git a/rust/tests/tests/test_tuple_compatible.rs 
b/rust/tests/tests/test_tuple_compatible.rs
index 43458cb29..6b61cd01d 100644
--- a/rust/tests/tests/test_tuple_compatible.rs
+++ b/rust/tests/tests/test_tuple_compatible.rs
@@ -34,7 +34,7 @@ const PI_F64: f64 = std::f64::consts::PI;
 /// Test 1: Direct tuple size mismatch - bidirectional serialization
 #[test]
 fn test_tuple_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Test 1a: Long tuple serialized, short tuple deserialized
     let long = (42i32, "hello".to_string(), PI_F64, true);
@@ -57,7 +57,7 @@ fn test_tuple_size_mismatch() {
 /// Test 2: Tuples containing list/set/map elements
 #[test]
 fn test_tuple_with_collections_compatible() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
     // Tuple with Vec
     let tuple_vec = (vec![1, 2, 3], vec!["a".to_string(), "b".to_string()]);
     let bin = fory.serialize(&tuple_vec).unwrap();
@@ -104,7 +104,7 @@ fn test_tuple_with_collections_compatible() {
 /// Test 2b: Tuple with collections - length mismatch
 #[test]
 fn test_tuple_collections_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Serialize tuple with 3 collections
     let tuple_long = (vec![1, 2, 3], vec!["a".to_string()], vec![1.0, 2.0]);
@@ -129,7 +129,7 @@ fn test_tuple_collections_size_mismatch() {
 /// Test 3: Nested tuples
 #[test]
 fn test_nested_tuples() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     let obj = ((42i32, "hello".to_string()), (PI_F64, true));
     let bin = fory.serialize(&obj).unwrap();
@@ -140,7 +140,7 @@ fn test_nested_tuples() {
 /// Test 3b: Nested tuple size mismatch
 #[test]
 fn test_nested_tuple_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Long to short
     let long = ((42i32, "test".to_string(), PI_F64), (true, 100i32));
@@ -164,7 +164,7 @@ fn test_nested_tuple_size_mismatch() {
 /// Test 3c: Deeply nested tuples with size mismatch
 #[test]
 fn test_deeply_nested_tuple_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Serialize deeply nested tuple
     let deep = (1i32, (2i32, (3i32, 4i32, 5i32)));
@@ -191,7 +191,7 @@ fn test_deeply_nested_tuple_size_mismatch() {
 /// Test 4: Tuples with Option/Arc elements
 #[test]
 fn test_tuple_with_option_arc_compatible() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Tuple with Options
     let tuple_opt = (Some(42i32), None::<String>, Some(PI_F64));
@@ -225,7 +225,7 @@ fn test_tuple_with_option_arc_compatible() {
 /// Test 4b: Tuple with Option size mismatch
 #[test]
 fn test_tuple_option_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Serialize longer tuple
     let long = (
@@ -257,7 +257,7 @@ fn test_tuple_option_size_mismatch() {
 /// Test 4c: Tuple with Arc size mismatch
 #[test]
 fn test_tuple_arc_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Serialize longer tuple
     let long = (Arc::new(1i32), Arc::new(2i32), Arc::new(3i32));
@@ -282,7 +282,7 @@ fn test_tuple_arc_size_mismatch() {
 /// Test 5: Schema evolution from homogeneous to heterogeneous tuple
 #[test]
 fn test_tuple_homogeneous_to_heterogeneous() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Serialize as homogeneous (all i32)
     let homogeneous = (1i32, 2i32, 3i32);
@@ -306,7 +306,7 @@ fn test_tuple_homogeneous_to_heterogeneous() {
 /// Test 6: Schema evolution with different element counts
 #[test]
 fn test_tuple_element_count_evolution() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Test growing from 2 to 5 elements
     let small = (42i32, "hello".to_string());
@@ -343,7 +343,7 @@ fn test_tuple_element_count_evolution() {
 /// Test 6b: Complex element count evolution
 #[test]
 fn test_tuple_element_count_evolution_complex() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // v1: simple 2-element tuple
     let v1 = (42i32, "hello".to_string());
@@ -369,7 +369,7 @@ fn test_tuple_element_count_evolution_complex() {
 /// Test 7: Edge case - empty tuple behavior
 #[test]
 fn test_empty_to_non_empty_tuple() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Simulate deserializing to tuple when data is missing
     // This is tested implicitly through struct field defaults
@@ -382,7 +382,7 @@ fn test_empty_to_non_empty_tuple() {
 /// Test 8: Very large tuple with size mismatch
 #[test]
 fn test_large_tuple_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Serialize a large tuple (10 elements)
     let large = (1i32, 2i32, 3i32, 4i32, 5i32, 6i32, 7i32, 8i32, 9i32, 10i32);
@@ -414,7 +414,7 @@ fn test_large_tuple_size_mismatch() {
 /// Test 9: Mixed complex types with size mismatch
 #[test]
 fn test_mixed_complex_types_size_mismatch() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
 
     // Complex tuple with many different types
     let complex = (
@@ -445,7 +445,7 @@ fn test_mixed_complex_types_size_mismatch() {
 /// Test compatible mode with tuples
 #[test]
 fn test_tuple_xlang_compatible_mode() {
-    let fory = Fory::default().compatible(true);
+    let fory = Fory::builder().compatible(true).build();
     // Test basic tuple
     let basic = (42i32, "hello".to_string(), vec![1, 2, 3]);
     let bin = fory.serialize(&basic).unwrap();
@@ -501,10 +501,10 @@ fn run_struct_missing_tuple_field(xlang: bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<StructV1>(1).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<StructV2>(1).unwrap();
 
     // Serialize V1 and deserialize as V2
@@ -553,10 +553,10 @@ fn run_struct_added_tuple_field(xlang: bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<StructV1>(2).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<StructV2>(2).unwrap();
 
     // Serialize V1 and deserialize as V2 (new tuple fields should be default)
@@ -601,10 +601,10 @@ fn run_struct_tuple_element_increase(xlang: bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<StructV1>(3).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<StructV2>(3).unwrap();
 
     // Serialize V1 and deserialize as V2 (extra elements should be default)
@@ -648,10 +648,10 @@ fn run_struct_tuple_element_decrease(xlang: bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<StructV1>(4).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<StructV2>(4).unwrap();
 
     // Serialize V1 and deserialize as V2 (extra elements should be dropped)
@@ -698,10 +698,10 @@ fn run_struct_nested_tuple_evolution(xlang: bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<StructV1>(5).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<StructV2>(5).unwrap();
 
     // Serialize V1 and deserialize as V2
@@ -755,10 +755,10 @@ fn run_struct_multiple_tuple_fields_evolution(xlang: 
bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<StructV1>(6).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<StructV2>(6).unwrap();
 
     // Serialize V1 and deserialize as V2
@@ -925,10 +925,10 @@ fn run_struct_complex_evolution_scenario(xlang: bool) {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory1 = Fory::builder().xlang(xlang).compatible(true).build();
     fory1.register::<DataRecordV1>(100).unwrap();
 
-    let mut fory2 = Fory::default().xlang(xlang).compatible(true);
+    let mut fory2 = Fory::builder().xlang(xlang).compatible(true).build();
     fory2.register::<DataRecordV2>(100).unwrap();
 
     // Test V1 -> V2: Old schema to new schema
@@ -1035,10 +1035,10 @@ fn test_tuple_alias() {
     }
 
     // Use separate Fory instances with the same type ID
-    let mut fory1 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
     fory1.register::<DataRecordV1>(100).unwrap();
 
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory2.register::<DataRecordV2>(100).unwrap();
 
     // Test record1 serialized by fory1, deserialized by fory2
diff --git a/rust/tests/tests/test_tuple_struct.rs 
b/rust/tests/tests/test_tuple_struct.rs
index 44bd60846..c7240dd2c 100644
--- a/rust/tests/tests/test_tuple_struct.rs
+++ b/rust/tests/tests/test_tuple_struct.rs
@@ -234,7 +234,7 @@ fn test_tuple_struct_with_tuple_field() {
 
 #[test]
 fn test_tuple_struct_xlang_mode() {
-    let mut fory = Fory::default().xlang(true);
+    let mut fory = Fory::builder().xlang(true).build();
     fory.register::<Point>(100).unwrap();
     fory.register::<Wrapper>(102).unwrap();
     fory.register::<Triple>(103).unwrap();
@@ -328,13 +328,13 @@ mod remote_v3 {
 /// Test schema evolution: remote has fewer fields than local.
 #[test]
 fn test_tuple_struct_schema_evolution_add_field() {
-    let mut fory_writer = Fory::default().compatible(true);
+    let mut fory_writer = Fory::builder().compatible(true).build();
     fory_writer.register::<remote_v1::Point>(100).unwrap();
 
     let remote_data = remote_v1::Point(1.0, 2.0);
     let bytes = fory_writer.serialize(&remote_data).unwrap();
 
-    let mut fory_reader = Fory::default().compatible(true);
+    let mut fory_reader = Fory::builder().compatible(true).build();
     fory_reader.register::<local_v2::Point>(100).unwrap();
 
     let local_data: local_v2::Point = fory_reader.deserialize(&bytes).unwrap();
@@ -347,13 +347,13 @@ fn test_tuple_struct_schema_evolution_add_field() {
 /// Test schema evolution: remote has more fields than local.
 #[test]
 fn test_tuple_struct_schema_evolution_remove_field() {
-    let mut fory_writer = Fory::default().compatible(true);
+    let mut fory_writer = Fory::builder().compatible(true).build();
     fory_writer.register::<remote_v3::Point>(100).unwrap();
 
     let remote_data = remote_v3::Point(1.0, 2.0, 3.0, 4.0);
     let bytes = fory_writer.serialize(&remote_data).unwrap();
 
-    let mut fory_reader = Fory::default().compatible(true);
+    let mut fory_reader = Fory::builder().compatible(true).build();
     fory_reader.register::<remote_v1::Point>(100).unwrap();
 
     let local_data: remote_v1::Point = 
fory_reader.deserialize(&bytes).unwrap();
@@ -388,7 +388,7 @@ mod local_mixed_v3 {
 /// Test that adding i64 (compress=true) doesn't break schema evolution
 #[test]
 fn test_tuple_struct_schema_evolution_add_i64() {
-    let mut fory_writer = Fory::default().compatible(true);
+    let mut fory_writer = Fory::builder().compatible(true).build();
     fory_writer
         .register::<remote_mixed_v1::MixedPoint>(100)
         .unwrap();
@@ -396,7 +396,7 @@ fn test_tuple_struct_schema_evolution_add_i64() {
     let remote_data = remote_mixed_v1::MixedPoint(1.0, 2.0);
     let bytes = fory_writer.serialize(&remote_data).unwrap();
 
-    let mut fory_reader = Fory::default().compatible(true);
+    let mut fory_reader = Fory::builder().compatible(true).build();
     fory_reader
         .register::<local_mixed_v2::MixedPoint>(100)
         .unwrap();
@@ -411,7 +411,7 @@ fn test_tuple_struct_schema_evolution_add_i64() {
 /// Test that adding u8 (smaller size) doesn't break schema evolution
 #[test]
 fn test_tuple_struct_schema_evolution_add_u8() {
-    let mut fory_writer = Fory::default().compatible(true);
+    let mut fory_writer = Fory::builder().compatible(true).build();
     fory_writer
         .register::<remote_mixed_v1::MixedPoint>(100)
         .unwrap();
@@ -419,7 +419,7 @@ fn test_tuple_struct_schema_evolution_add_u8() {
     let remote_data = remote_mixed_v1::MixedPoint(1.0, 2.0);
     let bytes = fory_writer.serialize(&remote_data).unwrap();
 
-    let mut fory_reader = Fory::default().compatible(true);
+    let mut fory_reader = Fory::builder().compatible(true).build();
     fory_reader
         .register::<local_mixed_v3::MixedPoint>(100)
         .unwrap();
diff --git a/rust/tests/tests/test_unsigned.rs 
b/rust/tests/tests/test_unsigned.rs
index c3a853ed6..d1f8373a9 100644
--- a/rust/tests/tests/test_unsigned.rs
+++ b/rust/tests/tests/test_unsigned.rs
@@ -45,7 +45,7 @@ fn test_unsigned_arrays() {
 
 #[test]
 fn test_unsigned_arrays_when_xlang() {
-    let fory = Fory::default().xlang(true);
+    let fory = Fory::builder().xlang(true).build();
     // u8, u16, u32, u64 arrays are now supported in xlang mode
     assert!(fory.serialize(&vec![u8::MAX]).is_ok());
     assert!(fory.serialize(&vec![u16::MAX]).is_ok());
@@ -58,7 +58,7 @@ fn test_unsigned_arrays_when_xlang() {
 
 #[test]
 fn test_binary_when_xlang() {
-    let mut fory = Fory::default().xlang(true);
+    let mut fory = Fory::builder().xlang(true).build();
     #[derive(ForyObject, Debug, PartialEq)]
     struct UnsignedData {
         binary: Vec<u8>,
@@ -78,7 +78,7 @@ fn test_binary_max_size_guardrail_for_vec_u8() {
     let original = vec![1_u8, 2, 3, 4, 5];
     let serialized = fory.serialize(&original).unwrap();
 
-    let limited_fory = Fory::default().max_binary_size(4);
+    let limited_fory = Fory::builder().max_binary_size(4).build();
     let err = limited_fory
         .deserialize::<Vec<u8>>(&serialized)
         .expect_err("expected binary size guardrail to reject the payload");
@@ -99,7 +99,7 @@ fn test_binary_max_size_guardrail_for_vec_u32() {
     let original = vec![10_u32, 20, 30];
     let serialized = fory.serialize(&original).unwrap();
 
-    let limited_fory = Fory::default().max_binary_size(8);
+    let limited_fory = Fory::builder().max_binary_size(8).build();
     let err = limited_fory
         .deserialize::<Vec<u32>>(&serialized)
         .expect_err("expected primitive array size guardrail to reject the 
payload");
@@ -173,7 +173,7 @@ fn test_unsigned_struct_compatible() {
         vec_u128: Vec<u128>,
     }
 
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<UnsignedData>(100).unwrap();
 
     let data = UnsignedData {
@@ -211,8 +211,8 @@ fn test_unsigned_struct_compatible_add_field() {
         c: u32,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<UnsignedDataV1>(101).unwrap();
     fory2.register::<UnsignedDataV2>(101).unwrap();
 
@@ -239,8 +239,8 @@ fn test_unsigned_struct_compatible_remove_field() {
         b: u16,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<UnsignedDataV1>(102).unwrap();
     fory2.register::<UnsignedDataV2>(102).unwrap();
 
@@ -341,7 +341,7 @@ fn test_unsigned_with_option_compatible() {
         opt_u128: Option<u128>,
     }
 
-    let mut fory = Fory::default().compatible(true);
+    let mut fory = Fory::builder().compatible(true).build();
     fory.register::<OptionalUnsigned>(104).unwrap();
 
     // Test with Some values
@@ -393,8 +393,8 @@ fn test_unsigned_mixed_fields_compatible() {
         new_u128: u128,
     }
 
-    let mut fory1 = Fory::default().compatible(true);
-    let mut fory2 = Fory::default().compatible(true);
+    let mut fory1 = Fory::builder().compatible(true).build();
+    let mut fory2 = Fory::builder().compatible(true).build();
     fory1.register::<MixedDataV1>(105).unwrap();
     fory2.register::<MixedDataV2>(105).unwrap();
 
diff --git a/rust/tests/tests/test_weak.rs b/rust/tests/tests/test_weak.rs
index ce3f53ea1..60174846f 100644
--- a/rust/tests/tests/test_weak.rs
+++ b/rust/tests/tests/test_weak.rs
@@ -25,7 +25,7 @@ use std::sync::Mutex;
 
 #[test]
 fn test_rc_weak_null_serialization() {
-    let fory = Fory::default().track_ref(true);
+    let fory = Fory::builder().track_ref(true).build();
 
     let weak: RcWeak<i32> = RcWeak::new();
 
@@ -37,7 +37,7 @@ fn test_rc_weak_null_serialization() {
 
 #[test]
 fn test_arc_weak_null_serialization() {
-    let fory = Fory::default().track_ref(true);
+    let fory = Fory::builder().track_ref(true).build();
 
     let weak: ArcWeak<i32> = ArcWeak::new();
 
@@ -49,7 +49,7 @@ fn test_arc_weak_null_serialization() {
 
 #[test]
 fn test_rc_weak_dead_pointer_serializes_as_null() {
-    let fory = Fory::default().track_ref(true);
+    let fory = Fory::builder().track_ref(true).build();
 
     let weak = {
         let rc = Rc::new(42i32);
@@ -69,7 +69,7 @@ fn test_rc_weak_dead_pointer_serializes_as_null() {
 
 #[test]
 fn test_arc_weak_dead_pointer_serializes_as_null() {
-    let fory = Fory::default().track_ref(true);
+    let fory = Fory::builder().track_ref(true).build();
 
     let weak = {
         let arc = Arc::new(String::from("test"));
@@ -89,7 +89,7 @@ fn test_arc_weak_dead_pointer_serializes_as_null() {
 
 #[test]
 fn test_rc_weak_in_vec_circular_reference() {
-    let fory = Fory::default().track_ref(true);
+    let fory = Fory::builder().track_ref(true).build();
 
     let data1 = Rc::new(42i32);
     let data2 = Rc::new(100i32);
@@ -107,7 +107,7 @@ fn test_rc_weak_in_vec_circular_reference() {
 
 #[test]
 fn test_arc_weak_in_vec_circular_reference() {
-    let fory = Fory::default().track_ref(true);
+    let fory = Fory::builder().track_ref(true).build();
 
     let data1 = Arc::new(String::from("hello"));
     let data2 = Arc::new(String::from("world"));
@@ -133,7 +133,7 @@ fn test_rc_weak_field_in_struct() {
         weak_ref: RcWeak<i32>,
     }
 
-    let mut fory = Fory::default().track_ref(true);
+    let mut fory = Fory::builder().track_ref(true).build();
     fory.register::<SimpleNode>(1000).unwrap();
 
     let data = Rc::new(42i32);
@@ -160,7 +160,7 @@ struct Node {
 #[test]
 fn test_node_circular_reference_with_parent_children() {
     // Register the Node type with Fory
-    let mut fory = Fory::default().track_ref(true);
+    let mut fory = Fory::builder().track_ref(true).build();
     fory.register::<Node>(2000).unwrap();
 
     // Create parent
@@ -218,7 +218,7 @@ fn test_arc_mutex_circular_reference() {
         children: Vec<Arc<Mutex<Node>>>,
     }
 
-    let mut fory = Fory::default().track_ref(true);
+    let mut fory = Fory::builder().track_ref(true).build();
     fory.register::<Node>(6000).unwrap();
 
     let parent = Arc::new(Mutex::new(Node {


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

Reply via email to