| | 1 | = Serialization Tutorial = |
| | 2 | |
| | 3 | == First Steps == |
| | 4 | |
| | 5 | In this section we introduce a simple example to show how the serialization works in practice. Two |
| | 6 | examples are given: First, we show how the inline serialization for small and bit-sensitive works. |
| | 7 | Second, we show how serialization works with virtual classes. |
| | 8 | |
| | 9 | === Inline serialization === |
| | 10 | |
| | 11 | Non-virtual inline serialization is reasonable on small or bit-sensitive objects (for example IP-Adresses, Ports etc.). |
| | 12 | To add serialization to an object it must be inherited from the Serializable class and a specification of the SERIALIZEABLE macro: |
| | 13 | {{{ |
| | 14 | #!cpp |
| | 15 | #include<serialization.h> |
| | 16 | |
| | 17 | USING_SERIALIZATION; /* use serialization namespaces */ |
| | 18 | |
| | 19 | class IPv4Address : public Serializeable { SERIALIZEABLE |
| | 20 | private: |
| | 21 | uint8_t a,b,c,d; |
| | 22 | public: |
| | 23 | IPv4Address() { |
| | 24 | a=1;b=2;c=3;d=4; |
| | 25 | } |
| | 26 | }; |
| | 27 | }}} |
| | 28 | In the next step, a serializer can be added to this class: |
| | 29 | {{{ |
| | 30 | #!cpp |
| | 31 | SERIALIZER_BEGIN( IPv4Address, DEFAULT_V, X ) |
| | 32 | X && a && b && c && d; |
| | 33 | SERIALIZER_END() |
| | 34 | }}} |
| | 35 | for convenience or personal taste, the macros can also be replaced with |
| | 36 | {{{ |
| | 37 | #!cpp |
| | 38 | sznBeginDefault( IPv4Address, X ) |
| | 39 | X && a && b && c && d; |
| | 40 | sznEnd() |
| | 41 | }}} |
| | 42 | In this case we assume that an IP-Address can be mapped bijectively -- therefore no special treatment of serialization and deserialization is needed. So, what happens here is, that a inline serializer is created for class IPv4Address. DEFAULT_V specifies that this serializer is used as default variant and X specifies the variable of the stream that is used to serialize the object. To serialize this object one can use the data_serialize methods: |
| | 43 | {{{ |
| | 44 | #!cpp |
| | 45 | IPv4Address addr; |
| | 46 | Data data = data_serialize( addr ); |
| | 47 | cout << data << endl; |
| | 48 | }}} |
| | 49 | which outputs |
| | 50 | {{{ |
| | 51 | Binary=[01020304] |
| | 52 | }}} |
| | 53 | As you can see the serialization works quite straits forward. The serialized object can now again deserialized with |
| | 54 | {{{ |
| | 55 | #!cpp |
| | 56 | IPv4Address addr2; |
| | 57 | data_deserialize( addr2, data ); |
| | 58 | }}} |
| | 59 | Be aware that this kind of serialization results in highly-optimized and inlined code. To generate serializers |
| | 60 | that are not-inlined and generated once per class, in the next section we discuss virtual serialization. |
| | 61 | |
| | 62 | === Virtual serialization === |
| | 63 | |
| | 64 | == Differentiation between serialization and deserialization == |
| | 65 | |
| | 66 | == Serialization of bits and special types == |
| | 67 | |
| | 68 | == Message specification, serialization and deserialization == |
| | 69 | |
| | 70 | |