XMLSerialization.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /* ---------------------------------------------------------------------------
  2. // XMLSerialization.h
  3. // Author: Christian Schüller on 19/11/13.
  4. ------------------------------------------------------------------------------
  5. Inherit from this class to have the easiest way to serialize your user defined class.
  6. 1) Pass the default name of your class to the base constructor.
  7. 2) Override InitSerialization() and add your variables to serialize like:
  8. xmlSerializer->Add(var1,"name1");
  9. xmlSerializer->Add(var2,"name2");
  10. Workaround for Visual Studio run time debugger inspection problem.
  11. Copy and implement all the functions, splitting into a source and header file.
  12. Restrictions on Native C++ Expressions (Anonymous Namespaces):
  13. http://msdn.microsoft.com/en-us/library/0888kc6a%28VS.80%29.aspx
  14. ----------------------------------------------------------------------------*/
  15. #ifndef XML_SERIALIZATION_H
  16. #define XML_SERIALIZATION_H
  17. #include <igl/xml/XMLSerializer.h>
  18. namespace igl
  19. {
  20. namespace
  21. {
  22. class XMLSerializer;
  23. class XMLSerialization : public igl::XMLSerializable
  24. {
  25. public:
  26. XMLSerializer* xmlSerializer;
  27. /**
  28. * Default implementation of XMLSerializable interface
  29. */
  30. virtual void Init();
  31. virtual bool Serialize(tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* element);
  32. virtual bool Deserialize(tinyxml2::XMLDocument* doc, const tinyxml2::XMLElement* element);
  33. /**
  34. * Default constructor, destructor, assignment and copy constructor
  35. */
  36. XMLSerialization(const std::string& name);
  37. ~XMLSerialization();
  38. XMLSerialization(const XMLSerialization& obj);
  39. XMLSerialization& operator=(const XMLSerialization& obj);
  40. /**
  41. * Function which must be overriden in the subclass if you dont use
  42. * heap allocations (new) to create new instances.
  43. * It will get called if the assignment operator or copy constructor
  44. * is involved to update the references to the new copied data structures
  45. *
  46. * Add in this fucntion all the variables you wanna serialize like:
  47. * xmlSerializer->Add(var1);
  48. * xmlSerializer->Add(varw);
  49. * ...
  50. */
  51. virtual void InitSerialization();
  52. /**
  53. * Following functions can be overwritten to handle the specific events.
  54. * Return false to prevent serialization of object.
  55. */
  56. virtual bool BeforeSerialization();
  57. virtual void AfterSerialization();
  58. virtual bool BeforeDeserialization();
  59. virtual void AfterDeserialization();
  60. private:
  61. void initXMLSerializer();
  62. };
  63. // Implementation
  64. void XMLSerialization::Init()
  65. {
  66. }
  67. bool XMLSerialization::Serialize(tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* element)
  68. {
  69. bool serialized = false;
  70. if(this->BeforeSerialization())
  71. {
  72. if(xmlSerializer == NULL)
  73. {
  74. xmlSerializer = new XMLSerializer(Name);
  75. this->InitSerialization();
  76. }
  77. serialized = xmlSerializer->SaveGroupToXMLElement(doc,element,Name);
  78. this->AfterSerialization();
  79. }
  80. return serialized;
  81. }
  82. bool XMLSerialization::Deserialize(tinyxml2::XMLDocument* doc, const tinyxml2::XMLElement* element)
  83. {
  84. bool serialized = false;
  85. if(this->BeforeDeserialization())
  86. {
  87. if(xmlSerializer == NULL)
  88. {
  89. xmlSerializer = new XMLSerializer(Name);
  90. this->InitSerialization();
  91. }
  92. serialized = xmlSerializer->LoadGroupFromXMLElement(Name,doc,element);
  93. this->AfterDeserialization();
  94. }
  95. return serialized;
  96. }
  97. void XMLSerialization::InitSerialization()
  98. {
  99. std::cout << "You have to override InitSerialization()" << "\n";
  100. //assert(false);
  101. }
  102. XMLSerialization::XMLSerialization(const std::string& name)
  103. {
  104. Name = name;
  105. xmlSerializer = NULL;
  106. }
  107. XMLSerialization::~XMLSerialization()
  108. {
  109. if(xmlSerializer != NULL)
  110. delete xmlSerializer;
  111. xmlSerializer = NULL;
  112. }
  113. XMLSerialization::XMLSerialization(const XMLSerialization& obj)
  114. {
  115. Name = obj.Name;
  116. xmlSerializer = NULL;
  117. }
  118. XMLSerialization& XMLSerialization::operator=(const XMLSerialization& obj)
  119. {
  120. if(this != &obj)
  121. {
  122. Name = obj.Name;
  123. if(xmlSerializer != NULL)
  124. {
  125. delete obj.xmlSerializer;
  126. xmlSerializer = NULL;
  127. }
  128. }
  129. return *this;
  130. }
  131. bool XMLSerialization::BeforeSerialization()
  132. {
  133. return true;
  134. }
  135. void XMLSerialization::AfterSerialization()
  136. {
  137. }
  138. bool XMLSerialization::BeforeDeserialization()
  139. {
  140. return true;
  141. }
  142. void XMLSerialization::AfterDeserialization()
  143. {
  144. }
  145. }
  146. }
  147. #endif