Below is a copy of my post to comp.lang.c++.moderated http://groups.google.co.uk/groups?q=author:alnsn-mycop%40yandex.ru&hl=en&lr=&ie=UTF-8&selm=3eef18d6%40news.fhg.de&rnum=1
--- cut --- Thomas Hansen wrote: > BTW! > Serialization of objects in C++ or any other language for that reason > is one of the "hardest" part to keep up with your "OOP" mantras... > The reason is that all that nice "polymorphisme" and your beautifule > "inheritence tree" basically becomes "pure C" since you'll end up with > a file stuffed with "enums" and "magic numbers" anyway... > No man alive today has been able to solve this problem completely... I took some ideas from boost archive and played around with a code several days ago. The idea is to set relations between pointers to data members (or to get/set member functions) and names of serialized fields. Then, during object loading/saving it's possible to access the member using member pointer. The framework will find appropriate field in the storage by name and static_cast it automatically. So, you don't need to make those tricky casts. Realtions can be built using describe function: // Parent.hpp struct Parent : Person { Parent* partner; std::list<Person*> children; static void describe(db::type<Parent>& t) { // Looks like class definition t & db::class_("Parent") & db::derived_from<Person>() & db::field(&Parent::partner, "partner") & db::field(&Parent::children, "children"); } }; It should be registered in Parent.cpp file using static object: namespace { db::register_type<Parent,&Parent::describe> r; } Access to members is easy: template<class Class, class T> T db::get(T Class::* p, db::raw_object& obj); db::raw_object father = find_my_father(parents_database); Parent* mother = db::get(&Parent::partner, father); In addition to better static type control you can track pointers or a list of pointers at compile-time and then use it at runtime to set up the schema and to load an object with all its relations. --- cut --- -- Alexander Nasonov Remove minus and all between minus and at from my e-mail for timely response _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost