XMLSerialization.h 4.8 KB

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