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()