atd 0.0.1

ATD: Position-based Binary Serialization Format.
Documentation
  • Coverage
  • 50%
    1 out of 2 items documented1 out of 1 items with examples
  • Size
  • Source code size: 22.52 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 1.34 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 22s Average build duration of successful builds.
  • all releases: 22s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • Homepage
  • ahriroot/atd
    0 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • ahriroot

ATD (Ahriknow Transfer Data): Position-based Binary Serialization Format

atd is a multi-language binary serialization format and library implementation. It provides fast, compact binary serialization and deserialization across different programming languages.

Key Features

  • Multi-language support: Consistent implementation across Rust, Zig, Go, Python, Javascript and other languages
  • Fast binary serialization for structs/classes in supported languages
  • Supports Option<T>, Vec<T>, HashMap<K,V>, BTreeMap<K,V>, and nested custom types
  • Fields are identified by tags, not field names or order, enabling flexible schema evolution
  • Missing or extra fields in deserialization are handled gracefully if Default is implemented

Usage Rules

  1. Tags are required for any field you want to serialize/deserialze. Use the #[atd(n)] attribute.
  2. Tags must be unique within the same struct. Duplicate tags will cause a compile-time error.
  3. Fields without tags are ignored during serialization.
  4. Default values: Any field without a tag or missing in the deserialized data must implement Default.
  5. Field names and order do not matter on the serialization or deserialization side. Only the tag and type must match.

Example

use atd::{Deserialize, DeserializeAtd, Serialize, SerializeAtd};
use std::collections::{BTreeMap, HashMap};

#[derive(Debug, PartialEq, Serialize, Deserialize)]
enum UserRole {
    #[atd(1)]
    Admin,
    #[atd(2)]
    User,
    #[atd(3)]
    Guest,
    #[atd(4)]
    Other(
        #[atd(1)] i64,
        #[atd(2)] String,
        #[atd(3)] BTreeMap<String, bool>,
    ),
    #[atd(5)]
    Custom {
        #[atd(1)]
        index: i64,
        #[atd(2)]
        description: String,
        #[atd(3)]
        permissions: BTreeMap<String, bool>,
    },
}

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Address {
    #[atd(1)]
    street: String,

    #[atd(2)]
    city: String,

    #[atd(3)]
    zipcode: u32,
}

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct User {
    #[atd(1)]
    id: u64,

    #[atd(2)]
    name: String,

    #[atd(3)]
    age: u8,

    #[atd(4)]
    is_active: bool,

    #[atd(5)]
    balance: f64,

    #[atd(6)]
    scores: Vec<i32>,

    #[atd(7)]
    metadata: HashMap<String, String>,

    #[atd(8)]
    tags: Vec<String>,

    #[atd(9)]
    height: f32,

    #[atd(10)]
    rating: Option<f32>,

    #[atd(11)]
    phone: Option<String>,

    #[atd(12)]
    permissions: HashMap<String, bool>,

    #[atd(13)]
    data: Vec<u8>,

    #[atd(14)]
    address: Address, // Nested struct

    #[atd(15)]
    roles: Vec<UserRole>, // Enum
}

fn main() {
    let user = User {
        id: 1,
        name: "Ahriknow".to_string(),
        age: 28,
        is_active: true,
        balance: 100000000.00,
        scores: vec![100, 90, 80],
        metadata: {
            let mut metadata = HashMap::new();
            metadata.insert("team".to_string(), "backend".to_string());
            metadata
        },
        tags: vec!["rust".to_string(), "developer".to_string()],
        height: 172.5,
        rating: Some(4.8),
        phone: None,
        permissions: {
            let mut permissions = HashMap::new();
            permissions.insert("read".to_string(), true);
            permissions.insert("write".to_string(), false);
            permissions
        },
        data: vec![1, 2, 3],
        address: Address {
            street: "xxx".to_string(),
            city: "Changchun".to_string(),
            zipcode: 123456,
        },
        roles: vec![
            UserRole::Admin,
            UserRole::Other(1, "other".to_string(), {
                let mut map = BTreeMap::new();
                map.insert("write".to_string(), true);
                map.insert("read".to_string(), true);
                map.insert("delete".to_string(), false);
                map
            }),
            UserRole::Custom {
                index: 2,
                description: "custom".to_string(),
                permissions: {
                    let mut map = BTreeMap::new();
                    map.insert("write".to_string(), false);
                    map.insert("read".to_string(), true);
                    map.insert("delete".to_string(), false);
                    map
                },
            },
        ],
    };

    println!("{:#?}", user);

    let serialized = user.to_atd();
    let deserialized = User::from_atd(&serialized);
    assert_eq!(user, deserialized);

    println!("✅ Serialization and deserialization successful!");
}

Supported Field Types

  • Primitive types: i8, i16, i32, i64, i128, u8, u16, u32, u64, u128, f32, f64, bool
  • String
  • Option<T> (nested support)
  • Vec<T> (nested support)
  • HashMap<K,V> and BTreeMap<K,V>
  • Nested custom types that implement Serialize and Deserialize