Gepard ORM (GORM) serialization / deserialization

This article describes GORM version 1.4.0 capabilities.

 


 

GORM is an easy to use micro framework to generate your serlialization code in seconds.

Using Clang library to parse your declarations, generate source code, then add it to your project.

Current features:

  • compile C++ files (handling C++11 fundemantal types)
  • visualize tag members
  • vizualize generated code

Serialization generators:

  • std::stream
  • Qt QDataStream (currently under development)
  • boost serialization (currently under development)
  • Qt XML - QXmlWriter, QXmlReader
  • Qt JSON - QJson

Planned features:

  • enum type serialization
  • more complex types depending on user requests
  • finishig missing serializators

 


 

These declaration first goal is to have a complex test suite and a fare-to-complete feature overview.

This consist typical collections of C++ fundamental types, STL containers and smart pointers.

#include <types, STL, Qt, smart pointers>

class MySerializationBase final
{
ctor
cctor
dtor

serialize/deserialize

private:
    // Fundamentals
    bool        _bool1= false;
    int         _num1 = 0;
    uint32_t    _num2 = 0;
    uint64_t    _num3 = 0;
    long        _num4 = 0;
    long long   _num5 = 0;
    float       _num6 = 0;
    double      _num7 = 0;
    std::string _text1;
    QString     _text2;
    QDate       _date1;
    QTime       _time1;
    QDateTime   _datetime1;
    // Containers
    std::vector<int>    _contNum1;
    std::list<int>      _contNum2;
    std::set<int>       _contNum3;
    std::map<int, int>  _contNum4;
    std::tuple<int, int, std::string> _contNum5;
    QVector<int>        _contNum6;
    QList<int>          _contNum7;
    QSet<int>           _contNum8;
    QMap<int, int>      _contNum9;
    // Smart pointers
    std::shared_ptr<int> _smart1;
    std::auto_ptr<int>   _smart2;
    std::unique_ptr<int> _smart3;
    QSharedPointer<int>  _smart4;
    // User objects
    MySerializationChild                _link1;
    MySerializationChild*               _link2 = nullptr;
    std::vector<MySerializationChild>   _link3;
    std::vector<MySerializationChild*>  _link4;
    QList<MySerializationChild>         _link5;
    QList<MySerializationChild*>        _link6;
    std::vector<std::shared_ptr<MySerializationChild>> _link7;
};

Within this class is a reference to MySerializationChild class, which is mainly a HEAP focused class with a lot of raw pointers. (for test purposes)

class MySerializationChild final
{
ctor
cctor
dtor

serialize/deserialize

private:
   // Fundamentals as pointers
   bool* _bool1 = nullptr;
   int* _num1 = nullptr;
   uint32_t* _num2 = nullptr;
   uint64_t* _num3 = nullptr;
   long* _num4 = nullptr;
   long long* _num5 = nullptr;
   float* _num6 = nullptr;
   double* _num7 = nullptr;
   std::string* _text1 = nullptr;
   QString* _text2 = nullptr;
   // TODO char* _text3;
   QDate* _date1 = nullptr;
   QTime* _time1 = nullptr;
   QDateTime* _datetime1 = nullptr;
};

 


 

The goal is to generate a code which creates an XML output and of course, on the other hand it loads that file and produce our object files.

Now, to save time, electricity, keyboard abrasion please download this Tutorial Skeleton: Click here.

Step-by-step tutorial with Gepard ORM,

  1. Open Gepard ORM, click on New / Load existing
  2. Create GORM project by Qt's project file
  3. For parse Qt dependent classes, you need to add some include folder
    QT_PATH/QT_VERSION/mingw|msvc/include
    and
    QT_PATH/QT_VERSION/mingw|msvc/include/QtCore
  4. Add myserializationbase.h and myserializationchild.h to Source files
  5. Click Serialization/Deserialization, select XML serialization format
  6. Click >>
  7. Click on structs/class fields to be confident in compile success
  8. Click Save, Click Create output
  9. Back to Qr Creator, compile tutorial and run ;)

That's should done.

The following files now created in generated_gorm folder:

  • gorm_myserializationbase.cpp
  • gorm_myserializationchild.cpp

Examine the source code, modify and use it on your will.

 


 

GORM generated c++ code: (snippet)

#include"../myserializationbase.h"

void MySerializationBase::serialize(QXmlStreamWriter& xml)
{
    xml.writeStartElement("MySerializationBase");
    xml.writeStartElement("Bool1");
    xml.writeCharacters(QString::number(_bool1));
    xml.writeEndElement();
    xml.writeStartElement("Num1");
    xml.writeCharacters(QString::number(_num1));
    xml.writeEndElement();
    xml.writeStartElement("Num2");
    xml.writeCharacters(QString::number(_num2));
    xml.writeEndElement();
    xml.writeStartElement("Num3");
    xml.writeCharacters(QString::number(_num3));
    xml.writeEndElement();
    xml.writeStartElement("Num4");
    xml.writeCharacters(QString::number(_num4));
    xml.writeEndElement();
    xml.writeStartElement("Num5");
    xml.writeCharacters(QString::number(_num5));
    xml.writeEndElement();
    xml.writeStartElement("Num6");
    xml.writeCharacters(QString::number(_num6, 10, 7));
    xml.writeEndElement();
    xml.writeStartElement("Num7");
    xml.writeCharacters(QString::number(_num7));
    xml.writeEndElement();
    xml.writeStartElement("Text1");
    xml.writeCharacters(QString::fromStdString(_text1));
    xml.writeEndElement();
    xml.writeStartElement("Text2");
    xml.writeCharacters(_text2);
    xml.writeEndElement();
    xml.writeStartElement("Date1");
    xml.writeCharacters(_date1.toString("yyyy-MM-dd"));
    xml.writeEndElement();
    xml.writeStartElement("Time1");
    xml.writeCharacters(_time1.toString("HH:mm:ss"));
    xml.writeEndElement();
    xml.writeStartElement("Datetime1");
    xml.writeCharacters(_datetime1.toString("yyyy-MM-dd HH:mm:ss"));
    xml.writeEndElement();
    xml.writeStartElement("ContNum1List");
    for (std::vector<int>::const_iterator it = _contNum1.begin() ; it != _contNum1.end() ; ++it){
        xml.writeStartElement("ContNum1");
        xml.writeCharacters(QString::number((*it)));
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum2List");
    for (std::list<int>::const_iterator it = _contNum2.begin() ; it != _contNum2.end() ; ++it){
        xml.writeStartElement("ContNum2");
        xml.writeCharacters(QString::number((*it)));
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum3List");
    for (std::set<int>::const_iterator it = _contNum3.begin() ; it != _contNum3.end() ; ++it){
        xml.writeStartElement("ContNum3");
        xml.writeCharacters(QString::number((*it)));
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum4KeyValueList");
    for (std::map<int, int>::const_iterator it = _contNum4.begin() ; it != _contNum4.end() ; ++it){
        xml.writeStartElement("Content");
        xml.writeStartElement("Key");
        xml.writeCharacters(QString::number((*it).first));
        xml.writeEndElement();
        xml.writeStartElement("Value");
        xml.writeCharacters(QString::number((*it).second));
        xml.writeEndElement();
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum5Tuple");
    xml.writeStartElement("Field_0");
    xml.writeCharacters(QString::number(std::get<0>(_contNum5)));
    xml.writeEndElement();
    xml.writeStartElement("Field_1");
    xml.writeCharacters(QString::number(std::get<1>(_contNum5)));
    xml.writeEndElement();
    xml.writeStartElement("Field_2");
    xml.writeCharacters(QString::fromStdString(std::get<2>(_contNum5)));
    xml.writeEndElement();
    xml.writeEndElement();
    xml.writeStartElement("ContNum6List");
    for (QVector<int>::const_iterator it = _contNum6.begin() ; it != _contNum6.end() ; ++it){
        xml.writeStartElement("ContNum6");
        xml.writeCharacters(QString::number((*it)));
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum7List");
    for (QList<int>::const_iterator it = _contNum7.begin() ; it != _contNum7.end() ; ++it){
        xml.writeStartElement("ContNum7");
        xml.writeCharacters(QString::number((*it)));
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum8List");
    for (QSet<int>::const_iterator it = _contNum8.begin() ; it != _contNum8.end() ; ++it){
        xml.writeStartElement("ContNum8");
        xml.writeCharacters(QString::number((*it)));
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("ContNum9KeyValueList");
    for (QMap<int, int>::const_iterator it = _contNum9.begin() ; it != _contNum9.end() ; ++it){
        xml.writeStartElement("Content");
        xml.writeStartElement("Key");
        xml.writeCharacters(QString::number(it.key()));
        xml.writeEndElement();
        xml.writeStartElement("Value");
        xml.writeCharacters(QString::number(it.value()));
        xml.writeEndElement();
        xml.writeEndElement();
    }
    xml.writeEndElement();
    xml.writeStartElement("Smart1");
    xml.writeCharacters(QString::number((*_smart1)));
    xml.writeEndElement();
    xml.writeStartElement("Smart2");
    xml.writeCharacters(QString::number((*_smart2)));
    xml.writeEndElement();
    xml.writeStartElement("Smart3");
    xml.writeCharacters(QString::number((*_smart3)));
    xml.writeEndElement();
    xml.writeStartElement("Smart4");
    xml.writeCharacters(QString::number((*_smart4)));
    xml.writeEndElement();
    xml.writeStartElement("Link1");
    _link1.serialize(xml);
    xml.writeEndElement();
    xml.writeStartElement("Link2");
    _link2->serialize(xml);
    xml.writeEndElement();
    xml.writeStartElement("Link3List");
    for (std::vector<MySerializationChild>::iterator it = _link3.begin() ; it != _link3.end() ; ++it){
        (*it).serialize(xml);
    }
    xml.writeEndElement();
    xml.writeStartElement("Link4List");
    for (std::vector<MySerializationChild *>::const_iterator it = _link4.begin() ; it != _link4.end() ; ++it){
        (*it)->serialize(xml);
    }
    xml.writeEndElement();
    xml.writeStartElement("Link5List");
    for (QList<class MySerializationChild>::iterator it = _link5.begin() ; it != _link5.end() ; ++it){
        (*it).serialize(xml);
    }
    xml.writeEndElement();
    xml.writeStartElement("Link6List");
    for (QList<class MySerializationChild *>::const_iterator it = _link6.begin() ; it != _link6.end() ; ++it){
        (*it)->serialize(xml);
    }
    xml.writeEndElement();
    xml.writeStartElement("Link7List");
    for (std::vector<std::shared_ptr<MySerializationChild> >::const_iterator it = _link7.begin() ; it != _link7.end() ; ++it){
        (*(*it)).serialize(xml);
    }
    xml.writeEndElement();
    xml.writeEndElement();
}
void MySerializationBase::deserialize(QXmlStreamReader& xml)
{
    Q_ASSERT(xml.isStartElement() && xml.name() == "MySerializationBase");
    while (xml.readNextStartElement()){
        if (xml.name() == "Bool1"){
            _bool1 = xml.readElementText().toInt();
        }
        else if (xml.name() == "Num1"){
            _num1 = xml.readElementText().toInt();
        }
        else if (xml.name() == "Num2"){
            _num2 = xml.readElementText().toUInt();
        }
        else if (xml.name() == "Num3"){
            _num3 = xml.readElementText().toULongLong();
        }
        else if (xml.name() == "Num4"){
            _num4 = xml.readElementText().toULong();
        }
        else if (xml.name() == "Num5"){
            _num5 = xml.readElementText().toULongLong();
        }
        else if (xml.name() == "Num6"){
            _num6 = xml.readElementText().toFloat();
        }
        else if (xml.name() == "Num7"){
            _num7 = xml.readElementText().toDouble();
        }
        else if (xml.name() == "Text1"){
            _text1 = xml.readElementText().toStdString();
        }
        else if (xml.name() == "Text2"){
            _text2 = xml.readElementText();
        }
        else if (xml.name() == "Date1"){
            _date1 = QDate::fromString(xml.readElementText(),"yyyy-MM-dd");
        }
        else if (xml.name() == "Time1"){
            _time1 = QTime::fromString(xml.readElementText(),"HH:mm:ss");
        }
        else if (xml.name() == "Datetime1"){
            _datetime1 = QDateTime::fromString(xml.readElementText(),"yyyy-MM-dd HH:mm:ss");
        }
        else if (xml.name() == "ContNum1List"){
            while (xml.readNextStartElement()){
                _contNum1.push_back(xml.readElementText().toInt());
            }
        }
        else if (xml.name() == "ContNum2List"){
            while (xml.readNextStartElement()){
                _contNum2.push_back(xml.readElementText().toInt());
            }
        }
        else if (xml.name() == "ContNum3List"){
            while (xml.readNextStartElement()){
                _contNum3.insert(xml.readElementText().toInt());
            }
        }
        else if (xml.name() == "ContNum4KeyValueList"){
            while (xml.readNextStartElement()){
                QString key,value;
                {
                    while (xml.readNextStartElement()){
                        if (xml.name() == "Key"){
                            key = xml.readElementText();
                        } else if (xml.name() == "Value"){
                            value = xml.readElementText();
                        } else {
                            xml.skipCurrentElement();
                        }
                    }
                    _contNum4.insert(std::pair<int, int>(key.toInt(),value.toInt()));
                }
            }
        }
        else if (xml.name() == "ContNum5Tuple"){
            QStringList items;
            {
                while (xml.readNextStartElement()){
                    if (xml.name() == "Field_0"){
                        items.append(xml.readElementText());
                    } else if (xml.name() == "Field_1"){
                        items.append(xml.readElementText());
                    } else if (xml.name() == "Field_2"){
                        items.append(xml.readElementText());
                    } else xml.skipCurrentElement();
                }
            }
            _contNum5 = std::make_tuple(items.at(0).toInt(),items.at(1).toInt(),items.at(2).toStdString());
        }
        else if (xml.name() == "ContNum6List"){
            while (xml.readNextStartElement()){
                _contNum6.append(xml.readElementText().toInt());
            }
        }
        else if (xml.name() == "ContNum7List"){
            while (xml.readNextStartElement()){
                _contNum7.append(xml.readElementText().toInt());
            }
        }
        else if (xml.name() == "ContNum8List"){
            while (xml.readNextStartElement()){
                _contNum8.insert(xml.readElementText().toInt());
            }
        }
        else if (xml.name() == "ContNum9KeyValueList"){
            while (xml.readNextStartElement()){
                QString key,value;
                {
                    while (xml.readNextStartElement()){
                        if (xml.name() == "Key"){
                            key = xml.readElementText();
                        } else if (xml.name() == "Value"){
                            value = xml.readElementText();
                        } else {
                            xml.skipCurrentElement();
                        }
                    }
                    _contNum9.insert(key.toInt(),value.toInt());
                }
            }
        }
        else if (xml.name() == "Smart1"){
            _smart1 = std::make_shared<int>(((xml.readElementText().toInt())));
        }
        else if (xml.name() == "Smart2"){
            _smart2 = std::auto_ptr<int>(new int((xml.readElementText().toInt())));
        }
        else if (xml.name() == "Smart3"){
            _smart3 = std::move(std::unique_ptr<int>(new int(xml.readElementText().toInt())));
        }
        else if (xml.name() == "Smart4"){
            _smart4 = QSharedPointer<int>::create(((xml.readElementText().toInt())));
        }
        else if (xml.name() == "Link1"){
            xml.readNextStartElement();
            _link1.deserialize(xml);
            xml.skipCurrentElement();}
        else if (xml.name() == "Link2"){
            xml.readNextStartElement();
            _link2  = new MySerializationChild();
            _link2->deserialize(xml);
            xml.skipCurrentElement();}
        else if (xml.name() == "Link3List"){
            while (xml.readNextStartElement()){
                MySerializationChild myField ;
                myField.deserialize(xml);
                _link3.push_back(myField);
            }
        }
        else if (xml.name() == "Link4List"){
            while (xml.readNextStartElement()){
                MySerializationChild * myField  = new MySerializationChild();
                myField->deserialize(xml);
                _link4.push_back(myField);
            }
        }
        else if (xml.name() == "Link5List"){
            while (xml.readNextStartElement()){
                MySerializationChild myField ;
                myField.deserialize(xml);
                _link5.append(myField);
            }
        }
        else if (xml.name() == "Link6List"){
            while (xml.readNextStartElement()){
                MySerializationChild * myField  = new MySerializationChild();
                myField->deserialize(xml);
                _link6.append(myField);
            }
        }
        else if (xml.name() == "Link7List"){
            while (xml.readNextStartElement()){
                std::shared_ptr<MySerializationChild> myField = std::make_shared<MySerializationChild>(((MySerializationChild())));
                myField->deserialize(xml);
                _link7.push_back(myField);
            }
        }
        else xml.skipCurrentElement();
    }
}

 


 

The parsed XML output:

<?xml version="1.0" encoding="UTF-8"?>
<MySerializationBase>
    <Bool1>1</Bool1>
    <Num1>325674</Num1>
    <Num2>6457346</Num2>
    <Num3>41231231231</Num3>
    <Num4>512312312</Num4>
    <Num5>61242342342</Num5>
    <Num6>83.8860703</Num6>
    <Num7>1.21232e+25</Num7>
    <Text1>the quick brown fox jumps over the lazy dog.THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.</Text1>
    <Text2>THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.the quick brown fox jumps over the lazy dog.</Text2>
    <Date1>2016-04-18</Date1>
    <Time1>03:12:34</Time1>
    <Datetime1>1974-04-18 03:12:23</Datetime1>
    <ContNum1List>
        <ContNum1>1</ContNum1>
        <ContNum1>1</ContNum1>
        <ContNum1>3</ContNum1>
        <ContNum1>5</ContNum1>
        <ContNum1>7</ContNum1>
        <ContNum1>8</ContNum1>
        <ContNum1>10</ContNum1>
    </ContNum1List>
    <ContNum2List>
        <ContNum2>1</ContNum2>
        <ContNum2>2</ContNum2>
        <ContNum2>3</ContNum2>
        <ContNum2>3</ContNum2>
        <ContNum2>7</ContNum2>
        <ContNum2>8</ContNum2>
        <ContNum2>10</ContNum2>
    </ContNum2List>
    <ContNum3List>
        <ContNum3>1</ContNum3>
        <ContNum3>2</ContNum3>
        <ContNum3>3</ContNum3>
        <ContNum3>5</ContNum3>
        <ContNum3>7</ContNum3>
        <ContNum3>8</ContNum3>
        <ContNum3>10</ContNum3>
    </ContNum3List>
    <ContNum4KeyValueList>
        <Content>
            <Key>1</Key>
            <Value>2</Value>
        </Content>
        <Content>
            <Key>3</Key>
            <Value>5</Value>
        </Content>
        <Content>
            <Key>7</Key>
            <Value>8</Value>
        </Content>
        <Content>
            <Key>10</Key>
            <Value>12</Value>
        </Content>
    </ContNum4KeyValueList>
    <ContNum5Tuple>
        <Field_0>11</Field_0>
        <Field_1>22</Field_1>
        <Field_2>33 and some text</Field_2>
    </ContNum5Tuple>
    <ContNum6List>
        <ContNum6>1</ContNum6>
        <ContNum6>1</ContNum6>
        <ContNum6>3</ContNum6>
        <ContNum6>5</ContNum6>
        <ContNum6>7</ContNum6>
        <ContNum6>8</ContNum6>
        <ContNum6>10</ContNum6>
    </ContNum6List>
    <ContNum7List>
        <ContNum7>1</ContNum7>
        <ContNum7>1</ContNum7>
        <ContNum7>3</ContNum7>
        <ContNum7>5</ContNum7>
        <ContNum7>7</ContNum7>
        <ContNum7>8</ContNum7>
        <ContNum7>10</ContNum7>
    </ContNum7List>
    <ContNum8List>
        <ContNum8>7</ContNum8>
        <ContNum8>5</ContNum8>
        <ContNum8>3</ContNum8>
        <ContNum8>2</ContNum8>
        <ContNum8>1</ContNum8>
        <ContNum8>10</ContNum8>
        <ContNum8>8</ContNum8>
    </ContNum8List>
    <ContNum9KeyValueList>
        <Content>
            <Key>1</Key>
            <Value>2</Value>
        </Content>
        <Content>
            <Key>3</Key>
            <Value>5</Value>
        </Content>
        <Content>
            <Key>7</Key>
            <Value>8</Value>
        </Content>
        <Content>
            <Key>10</Key>
            <Value>12</Value>
        </Content>
    </ContNum9KeyValueList>
    <Smart1>46324</Smart1>
    <Smart2>54632</Smart2>
    <Smart3>552345</Smart3>
    <Smart4>14234</Smart4>
    <Link1>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link1>
    <Link2>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link2>
    <Link3List>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link3List>
    <Link4List>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link4List>
    <Link5List>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link5List>
    <Link6List>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link6List>
    <Link7List>
        <MySerializationChild>
            <Bool1>1</Bool1>
            <Num1>234543</Num1>
            <Num2>3454</Num2>
            <Num3>23454355</Num3>
            <Num4>245435</Num4>
            <Num5>345435445</Num5>
            <Num6>4545.3417969</Num6>
            <Num7>234324.2343000</Num7>
            <Text1>More fancy text for a nice XML line</Text1>
            <Text2>more and more----- ok it's enough</Text2>
            <Date1>2016-02-06</Date1>
            <Time1>12:13:14</Time1>
            <Datetime1>2016-02-06 12:13:14</Datetime1>
        </MySerializationChild>
    </Link7List>
</MySerializationBase>

 

Thanks for using.

Headline: 
C++ serialization code generator (binary stream, XML, Json)
Date modified: 
Monday, December 26, 2016 - 17:45
Date published: 
Keywords: 
C++, example, serialize, tutorial, code generator
Author: