Item - A Serializable thing - has children which need to be Items String is an Item Array is an Item class SerializerVisitor { public: void Enter(const char* name) { } void Exit(const char* name) { } void Visit(int32 var) { } template void Visit(const char* name, T var) { Enter(name); Visit(var); Exit(name); } template void Visit(const char* name, T var) { Enter(name); var.Visit(this); Exit(name); } }; struct Person { int32 id; string name; Array email; Array phoneNumbers; // This can do both the serializing and de-serializing // This might be good to have generated, but possibly being more explicit could be better too template void Visit(V& v) { v.Visit("id",id); v.Visit("name",name); v.Visit("email",email); v.Visit("numbers",phoneNumbers); } } If use JSON, then order of members doesn't matter Also schema can change, have members added, reordered etc, and can still work JSON doesn't handle member names changing Pretty similar for XML JSON and XML have heavy overhead in size and parsing / writing EXI seperates the schema and data - avoids much of the overheads Protocol Buffers? Looks like code generation Pickling - Python specific