4

I would like to implement a Serialization Class which takes in an object and converts it into a binary stream and stored in a file. Later, the object should be reconstructed from a file.

Though this functionality is provided by BinaryFormatter in C#, I would like to design my own Serialization class from scratch.

Can someone point to some resources ?

Thanks in advance

KodeWarrior
  • 3,538
  • 3
  • 26
  • 40
  • Are you wanting to support things like versioning? – Vaughn Cato Sep 19 '12 at 16:49
  • 1
    You can't. There's no introspection (a.k.a. reflection) in C++. This facility allows creation of universal serializer objects. Without it, you have to add serialization code to each class that you want to be serialized. – n. m. could be an AI Sep 19 '12 at 16:51
  • 5
    You can refer to the boost serialization library for an example of an advanced serialization system for C++. – Vaughn Cato Sep 19 '12 at 16:56
  • 7
    Not very binary, but there's a big discussion: http://stackoverflow.com/questions/1809670/how-to-implement-serialization-in-c/10332336#10332336 Essentially, there is no straightforward way. Either you use the template magic and write some class layout yourself and the C++ compiler aunrolls your templates to Save/Load or you use the code generator which write the Save/Load code for each of your classes. – Viktor Latypov Sep 19 '12 at 17:01
  • C#, being built on dotnet, has excellent facilities for reflection and code annotations which makes all sorts of (de)serialisation tasks vastly more simple. Trying to do this is a generalised way in C++ will be nightmarishly complex. – Rook Sep 19 '12 at 17:30
  • @KodeWarrior You might want to have a look at Stephan Beal's [s11n library](http://s11n.net/). – πάντα ῥεῖ Sep 19 '12 at 17:42

4 Answers4

5

I would like to give you a negative answer. It is less useful but it still may be.

I have been using boost serialization for several years and it was one of the greatest strategic mistakes of my company. It produces very large output, it is very slow, it propagates a whole bunch of dependencies making everything impossibly slow to compile, and then it is hard to get out because you have existing serialized formats. Further, it behaves differently on different compilers, thus upgrade from VS2005 to 2010 actually caused us to write a compatibility layer, which is also hard coz the code is very hard to understand.

Pavel Radzivilovsky
  • 18,794
  • 5
  • 57
  • 67
3

Here are 2 solutions for C++ serialization:

I personally only have experience with the 1st one and actually only used text based serializers, but i know that it's easy to define binary serializers for use with s11n.

πάντα ῥεῖ
  • 1
  • 13
  • 116
  • 190
2

I have been using boost::serialization library for a while now and I think it is very good. You just need to create the serialization code like this:

class X {
  private:
    std::string value_;
  public:
    template void serialize(Archive &ar, const unsigned int version) {
       ar & value_;
     };
 }

No need to create the de-serialization code ( that's why they used the & operator ). But if you prefer you can still use the << and >> operators.

Also it's possible to write the serialization method for a class with no modification ( ex.: if you need to serialize an object that comes from a library ). In this case, you should do something like:

namespace boost { namespace serialization {
       template
       void serialize(Archive &ar, X &x const unsigned int version) {
                    ar & x.getValue();
       };
    }}
Filipe Felisbino
  • 2,712
  • 25
  • 26
0

The C++ Middleware Writer may be of interest. It has performance advantages over the serialization library in Boost. It also automates the creation of serialization functions.

isaac
  • 31
  • 1