For that you need reflection in C/C++, which doesn’t exist. You need to have some meta data describing the structure of your classes (members, inherited base classes). For the moment C/C++ compilers don’t automatically provide that information in built binaries.
I had the same idea in mind, and I used GCC XML project to get this information. It outputs XML data describing class structures. I have built a project and I’m explaining some key points in this page :
Serialization is easy, but we have to deal with complex data structure implementations (std::string, std::map for example) that play with allocated buffers. Deserialization is more complex and you need to rebuild your object with all its members, plus references to vtables … a painful implementation.
For example you can serialize like this:
// Random class initialization com::class1* aObject = new com::class1(); for (int i=0; i<10; i++){ aObject->setData(i,i); } aObject->pdata = new char[7]; for (int i=0; i<7; i++){ aObject->pdata[i] = 7-i; } // dictionary initialization cjson::dictionary aDict("./data/dictionary.xml"); // json transformation std::string aJson = aDict.toJson<com::class1>(aObject); // print encoded class cout << aJson << std::endl ;
To deserialize data it works like this:
// decode the object com::class1* aDecodedObject = aDict.fromJson<com::class1>(aJson); // modify data aDecodedObject->setData(4,22); // json transformation aJson = aDict.toJson<com::class1>(aDecodedObject); // print encoded class cout << aJson << std::endl ;
Ouptuts:
>:~/cjson$ ./main {"_index":54,"_inner": {"_ident":"test","pi":3.141593},"_name":"first","com::class0::_type":"type","com::class0::data":[0,1,2,3,4,5,6,7,8,9],"com::classb::_ref":"ref","com::classm1::_type":"typem1","com::classm1::pdata":[7,6,5,4,3,2,1]} {"_index":54,"_inner":{"_ident":"test","pi":3.141593},"_name":"first","com::class0::_type":"type","com::class0::data":[0,1,2,3,22,5,6,7,8,9],"com::classb::_ref":"ref","com::classm1::_type":"typem1","com::classm1::pdata":[7,6,5,4,3,2,1]} >:~/cjson$
Usually these implementations are compiler dependent (ABI Specification for example), and require external descriptions to work (GCCXML output), thus are not really easy to integrate to projects.