| 9 |   | === Inline serialization === | 
          
          
            |   | 7 | === Basic serialization === | 
          
          
            |   | 8 |  | 
          
          
            |   | 9 | We will introduce Serialization using the !PingPong sample provided by Ariba. You will find the following code in {{{PingPongMessage.h}: | 
          
          
            |   | 10 |  | 
          
          
            |   | 11 | {{{ | 
          
          
            |   | 12 | #!cpp | 
          
          
            |   | 13 | #ifndef PINGPONGMESSAGES_H_ | 
          
          
            |   | 14 | #define PINGPONGMESSAGES_H_ | 
          
          
            |   | 15 |  | 
          
          
            |   | 16 | #include <string> | 
          
          
            |   | 17 | #include "ariba/ariba.h" | 
          
          
            |   | 18 |  | 
          
          
            |   | 19 | using namespace ariba; | 
          
          
            |   | 20 | using std::string; | 
          
          
            |   | 21 |  | 
          
          
            |   | 22 | namespace ariba { | 
          
          
            |   | 23 | namespace application { | 
          
          
            |   | 24 | namespace pingpong { | 
          
          
            |   | 25 |  | 
          
          
            |   | 26 | using_serialization; | 
          
          
            |   | 27 |  | 
          
          
            |   | 28 | class PingPongMessage : public Message { | 
          
          
            |   | 29 |         VSERIALIZEABLE; | 
          
          
            |   | 30 | public: | 
          
          
            |   | 31 |         PingPongMessage(); | 
          
          
            |   | 32 |         PingPongMessage( uint8_t _id, string name = string("<ping>") ); | 
          
          
            |   | 33 |         virtual ~PingPongMessage(); | 
          
          
            |   | 34 |  | 
          
          
            |   | 35 |         string info(); | 
          
          
            |   | 36 |         uint8_t getid(); | 
          
          
            |   | 37 |  | 
          
          
            |   | 38 |         inline string getName() const { | 
          
          
            |   | 39 |                 return name; | 
          
          
            |   | 40 |         } | 
          
          
            |   | 41 | private: | 
          
          
            |   | 42 |         uint8_t id; | 
          
          
            |   | 43 |         string name; | 
          
          
            |   | 44 | }; | 
          
          
            |   | 45 |  | 
          
          
            |   | 46 | }}} // namespace ariba, appplication , pingpong | 
          
          
            |   | 47 |  | 
          
          
            |   | 48 | sznBeginDefault( ariba::application::pingpong::PingPongMessage, X ) { | 
          
          
            |   | 49 |         X && id && T(name); | 
          
          
            |   | 50 | } sznEnd(); | 
          
          
            |   | 51 |  | 
          
          
            |   | 52 | #endif /* PINGPONGMESSAGES_H_ */ | 
          
          
            |   | 53 | }}} | 
          
          
            |   | 54 |  | 
          
          
            |   | 55 | The message format for communication between Ariba !PingPong instances is defined in the class {{{PingPongMessage}}}. It inherits from the {{{Message}}} class and uses the macro {{{VSERIALIZEABLE;}}} to declare this class as being able to serialize and deserialize itself. Note, that each such class must provide a default constructor that takes no arguments. The !PingPongMessage defines two properties {{{id}}} and {{{name}}} that it wants to communicate to a remote instance.  | 
          
          
            |   | 56 |  | 
          
          
            |   | 57 | To define the actual serialization code, use the following code as template: | 
          
          
            |   | 58 |  | 
          
          
            |   | 59 | {{{ | 
          
          
            |   | 60 | #!cpp | 
          
          
            |   | 61 | sznBeginDefault( CLASSNAME, X ) { | 
          
          
            |   | 62 |         X && SERIALIZATION-VARIABLE-1 && SERIALIZATION_VARIABLE-2 && ...; | 
          
          
            |   | 63 | } sznEnd(); | 
          
          
            |   | 64 | }}} | 
          
          
            |   | 65 |  | 
          
          
            |   | 66 | As you can see above, CLASSNAME is in the case of the !PingPong sample the complate namespace with the class name {{{ariba::application::pingpong::PingPongMessage}}}. Furthermore the variables that are meant for serialization are combined to the {{{X}}} using the {{{&&}}} operator. This operator is invoked both when serializing and when deserializing. Therefore, this is the only special code handling required. | 
          
          
            |   | 67 |  | 
          
          
            |   | 68 | In your {*.cpp} class you  require a further macro. In case of the !PingPong sample this is simply: | 
          
          
            |   | 69 | {{{ | 
          
          
            |   | 70 | #!cpp | 
          
          
            |   | 71 | vsznDefault(PingPongMessage); | 
          
          
            |   | 72 | }}} | 
          
          
            |   | 73 |  | 
          
          
            |   | 74 |  |