#serialization #dynamic #serde #api

serialize_fields

Dynamic field selection for struct serialization in Rust

18 releases

Uses new Rust 2024

new 0.2.17 Jan 7, 2026
0.2.16 Jan 7, 2026
0.2.13 Aug 27, 2025
0.2.11 Jun 8, 2025
0.1.0 Jun 2, 2025

#1030 in Encoding

MIT license

27KB
257 lines

SerializeFields

A Rust procedural macro that enables dynamic field selection for struct serialization. Control exactly which fields get serialized at runtime using a hierarchical field selector system.

Features

  • 🎯 Dynamic Field Selection: Choose which fields to serialize at runtime
  • 🌳 Hierarchical Selection: Use dot notation for nested structs ("user.profile.name")
  • 🔧 Type Safe: Compile-time validation of field paths
  • 🚀 Zero Runtime Cost: Only enabled fields are processed during serialization
  • 📦 Serde Integration: Works seamlessly with the serde ecosystem
  • 🔄 Collection Support: Handles Vec, Option, HashMap, and other containers
  • 🏗️ Generic Architecture: Single trait-based serialization implementation

Quick Start

use serialize_fields::{SerializeFields, SerializeFieldsTrait};
use serde::{Serialize, Deserialize};

#[derive(SerializeFields, Serialize, Deserialize)]
struct User {
    id: u32,
    name: Option<String>,
    email: Option<String>,
}

let user = User {
    id: 123,
    name: Some("Alice".to_string()),
    email: Some("alice@example.com".to_string()),
};

// Create field selector using the trait method
let mut fields = user.serialize_fields();
fields.enable_dot_hierarchy("id");
fields.enable_dot_hierarchy("name");

// Serialize with selected fields only
let json = serde_json::to_string(&SerializeFields(&user, &fields)).unwrap();
// Output: {"id":123,"name":"Alice"}

Advanced Usage

Nested Structs

#[derive(SerializeFields, Serialize, Deserialize)]
struct User {
    id: u32,
    profile: UserProfile,
}

#[derive(SerializeFields, Serialize, Deserialize)]
struct UserProfile {
    bio: Option<String>,
    avatar_url: Option<String>,
}

let mut fields = user.serialize_fields();
fields.enable_dot_hierarchy("id");
fields.enable_dot_hierarchy("profile.bio");  // Nested field selection

let json = serde_json::to_string(&SerializeFields(&user, &fields)).unwrap();
// Output: {"id":123,"profile":{"bio":"Software Engineer"}}

Dynamic Field Selection

fn serialize_user_with_fields(user: &User, requested_fields: &[&str]) -> String {
    let mut selector = user.serialize_fields();
    
    for field in requested_fields {
        selector.enable_dot_hierarchy(field);
    }
    
    serde_json::to_string(&SerializeFields(user, &selector)).unwrap()
}

// Usage: GET /users/123?fields=id,name
let fields = vec!["id", "name"];
let json = serialize_user_with_fields(&user, &fields);

Dependencies

~0.6–1.6MB
~33K SLoC