XMLSerialization.h 5.0 KB

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