Advanced Usage ExampleΒΆ

This example demonstrates advanced features including nested objects and lists.

  1"""
  2Advanced usage example for Serilux.
  3
  4This example demonstrates:
  5- Nested Serializable objects
  6- Lists containing Serializable objects
  7- Dictionaries containing Serializable objects
  8- Validation
  9"""
 10
 11from serilux import (
 12    Serializable,
 13    register_serializable,
 14    validate_serializable_tree,
 15)
 16
 17
 18@register_serializable
 19class Address(Serializable):
 20    """An Address class."""
 21
 22    def __init__(self):
 23        super().__init__()
 24        self.street = ""
 25        self.city = ""
 26        self.state = ""
 27        self.zip_code = ""
 28        self.add_serializable_fields(["street", "city", "state", "zip_code"])
 29
 30
 31@register_serializable
 32class Person(Serializable):
 33    """A Person class with an address."""
 34
 35    def __init__(self):
 36        super().__init__()
 37        self.name = ""
 38        self.age = 0
 39        self.address = None
 40        self.add_serializable_fields(["name", "age", "address"])
 41
 42
 43@register_serializable
 44class Team(Serializable):
 45    """A Team class containing multiple people."""
 46
 47    def __init__(self):
 48        super().__init__()
 49        self.name = ""
 50        self.members = []  # List of Person objects
 51        self.roles = {}  # Dictionary mapping role to Person
 52        self.add_serializable_fields(["name", "members", "roles"])
 53
 54
 55def main():
 56    """Run the advanced usage example."""
 57    print("=== Serilux Advanced Usage Example ===\n")
 58
 59    # Create nested objects
 60    print("1. Creating nested objects...")
 61    person = Person()
 62    person.name = "Alice"
 63    person.age = 30
 64
 65    address = Address()
 66    address.street = "123 Main St"
 67    address.city = "New York"
 68    address.state = "NY"
 69    address.zip_code = "10001"
 70    person.address = address
 71
 72    print(f"   Person: {person.name}, Age: {person.age}")
 73    print(f"   Address: {person.address.street}, {person.address.city}\n")
 74
 75    # Create a team with lists and dictionaries
 76    print("2. Creating team with lists and dictionaries...")
 77    team = Team()
 78    team.name = "Engineering"
 79
 80    # Add members to list
 81    person1 = Person()
 82    person1.name = "Alice"
 83    person1.age = 30
 84
 85    person2 = Person()
 86    person2.name = "Bob"
 87    person2.age = 25
 88
 89    person3 = Person()
 90    person3.name = "Charlie"
 91    person3.age = 35
 92
 93    team.members = [person1, person2, person3]
 94
 95    # Add members to dictionary
 96    team.roles = {
 97        "lead": person1,
 98        "developer": person2,
 99        "senior": person3,
100    }
101
102    print(f"   Team: {team.name}")
103    print(f"   Members: {[p.name for p in team.members]}")
104    print(f"   Roles: {list(team.roles.keys())}\n")
105
106    # Validate before serialization
107    print("3. Validating object tree...")
108    try:
109        validate_serializable_tree(team)
110        print("   βœ“ Validation passed\n")
111    except TypeError as e:
112        print(f"   βœ— Validation failed: {e}\n")
113        return
114
115    # Serialize
116    print("4. Serializing...")
117    data = team.serialize()
118    print(f"   Serialized data keys: {list(data.keys())}\n")
119
120    # Deserialize
121    print("5. Deserializing...")
122    new_team = Team()
123    new_team.deserialize(data)
124
125    print(f"   Team: {new_team.name}")
126    print(f"   Members: {[p.name for p in new_team.members]}")
127    print(f"   Roles: {list(new_team.roles.keys())}\n")
128
129    # Verify
130    assert team.name == new_team.name
131    assert len(team.members) == len(new_team.members)
132    assert len(team.roles) == len(new_team.roles)
133    print("βœ“ Advanced serialization and deserialization successful!")
134
135
136if __name__ == "__main__":
137    main()