title: Rust Serialization Guide sidebar_position: 0 id: rust_serialization_index license: | Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Apache Foryβ’ is a blazing fast multi-language serialization framework powered by JIT compilation and zero-copy techniques, providing up to ultra-fast performance while maintaining ease of use and safety.
The Rust implementation provides versatile and high-performance serialization with automatic memory management and compile-time type safety.
Rc/Arc and weak pointersBox<dyn Trait>, Rc<dyn Trait>, and Arc<dyn Trait>| Crate | Description | Version |
|---|---|---|
fory | High-level API with derive macros | |
fory-core | Core serialization engine | |
fory-derive | Procedural macros |
Add Apache Foryβ’ to your Cargo.toml:
[dependencies] fory = "0.13"
use fory::{Fory, Error, Reader}; use fory::ForyObject; #[derive(ForyObject, Debug, PartialEq)] struct User { name: String, age: i32, email: String, } fn main() -> Result<(), Error> { let mut fory = Fory::default(); fory.register::<User>(1)?; let user = User { name: "Alice".to_string(), age: 30, email: "alice@example.com".to_string(), }; // Serialize let bytes = fory.serialize(&user)?; // Deserialize let decoded: User = fory.deserialize(&bytes)?; assert_eq!(user, decoded); // Serialize to specified buffer let mut buf: Vec<u8> = vec![]; fory.serialize_to(&mut buf, &user)?; // Deserialize from specified buffer let mut reader = Reader::new(&buf); let decoded: User = fory.deserialize_from(&mut reader)?; assert_eq!(user, decoded); Ok(()) }
Apache Foryβ’ Rust is fully thread-safe: Fory implements both Send and Sync, so one configured instance can be shared across threads for concurrent work. The internal read/write context pools are lazily initialized with thread-safe primitives, letting worker threads reuse buffers without coordination.
use fory::{Fory, Error}; use fory::ForyObject; use std::sync::Arc; use std::thread; #[derive(ForyObject, Clone, Copy, Debug, PartialEq)] struct Item { value: i32, } fn main() -> Result<(), Error> { let mut fory = Fory::default(); fory.register::<Item>(1000)?; let fory = Arc::new(fory); let handles: Vec<_> = (0..8) .map(|i| { let shared = Arc::clone(&fory); thread::spawn(move || { let item = Item { value: i }; shared.serialize(&item) }) }) .collect(); for handle in handles { let bytes = handle.join().unwrap()?; let item: Item = fory.deserialize(&bytes)?; assert!(item.value >= 0); } Ok(()) }
Tip: Perform registrations (such as fory.register::<T>(id)) before spawning threads so every worker sees the same metadata. Once configured, wrapping the instance in Arc is enough to fan out serialization and deserialization tasks safely.
The Rust implementation consists of three main crates:
fory/ # High-level API βββ src/lib.rs # Public API exports fory-core/ # Core serialization engine βββ src/ β βββ fory.rs # Main serialization entry point β βββ buffer.rs # Binary buffer management β βββ serializer/ # Type-specific serializers β βββ resolver/ # Type resolution and metadata β βββ meta/ # Meta string compression β βββ row/ # Row format implementation β βββ types.rs # Type definitions fory-derive/ # Procedural macros βββ src/ β βββ object/ # ForyObject macro β βββ fory_row.rs # ForyRow macro