XMLSerialization.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #ifndef IGL_XML_SERIALIZATION_H
  2. #define IGL_XML_SERIALIZATION_H
  3. #include <igl/xml/serialize_xml.h>
  4. namespace igl
  5. {
  6. class XMLSerialization: public XMLSerializable
  7. {
  8. private:
  9. template <typename T>
  10. struct XMLSerializationObject: public XMLSerializable
  11. {
  12. bool Binary;
  13. std::string Name;
  14. T* Object;
  15. void Serialize(std::vector<char>& buffer) const {
  16. igl::serialize(*Object,Name,buffer);
  17. }
  18. void Deserialize(const std::vector<char>& buffer) {
  19. igl::deserialize(*Object,Name,buffer);
  20. }
  21. void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const {
  22. igl::serialize_xml(*Object,Name,doc,element,Binary);
  23. }
  24. void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) {
  25. igl::deserialize_xml(*Object,Name,doc,element);
  26. }
  27. };
  28. mutable bool initialized;
  29. mutable std::vector<XMLSerializable*> objects;
  30. public:
  31. /**
  32. * Override this function to add your member variables which should be
  33. * serialized:
  34. *
  35. * this->Add(var1);
  36. * this->Add(var2);
  37. * ...
  38. */
  39. virtual void InitSerialization() = 0;
  40. /**
  41. * Following functions can be overridden to handle the specific events.
  42. * Return false to prevent the de-/serialization of an object.
  43. */
  44. virtual bool BeforeSerialization() const { return true; }
  45. virtual void AfterSerialization() const {}
  46. virtual bool BeforeDeserialization() { return true; }
  47. virtual void AfterDeserialization() {}
  48. /**
  49. * Default implementation of XMLSerializable interface
  50. */
  51. void Serialize(std::vector<char>& buffer) const
  52. {
  53. if(this->BeforeSerialization())
  54. {
  55. if(initialized == false)
  56. {
  57. objects.clear();
  58. (const_cast<XMLSerialization*>(this))->InitSerialization();
  59. initialized = true;
  60. }
  61. for(int i=0;i<objects.size();i++)
  62. objects[i]->Serialize(buffer);
  63. this->AfterSerialization();
  64. }
  65. }
  66. void Deserialize(const std::vector<char>& buffer)
  67. {
  68. if(this->BeforeDeserialization())
  69. {
  70. if(initialized == false)
  71. {
  72. objects.clear();
  73. (const_cast<XMLSerialization*>(this))->InitSerialization();
  74. initialized = true;
  75. }
  76. for(int i=0;i<objects.size();i++)
  77. objects[i]->Deserialize(buffer);
  78. this->AfterDeserialization();
  79. }
  80. }
  81. void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const
  82. {
  83. if(this->BeforeSerialization())
  84. {
  85. if(initialized == false)
  86. {
  87. objects.clear();
  88. (const_cast<XMLSerialization*>(this))->InitSerialization();
  89. initialized = true;
  90. }
  91. for(int i=0;i<objects.size();i++)
  92. objects[i]->Serialize(doc,element);
  93. this->AfterSerialization();
  94. }
  95. }
  96. void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element)
  97. {
  98. if(this->BeforeDeserialization())
  99. {
  100. if(initialized == false)
  101. {
  102. objects.clear();
  103. (const_cast<XMLSerialization*>(this))->InitSerialization();
  104. initialized = true;
  105. }
  106. for(int i=0;i<objects.size();i++)
  107. objects[i]->Deserialize(doc,element);
  108. this->AfterDeserialization();
  109. }
  110. }
  111. /**
  112. * Default constructor, destructor, assignment and copy constructor
  113. */
  114. XMLSerialization()
  115. {
  116. initialized = false;
  117. }
  118. XMLSerialization(const XMLSerialization& obj)
  119. {
  120. initialized = false;
  121. objects.clear();
  122. }
  123. ~XMLSerialization()
  124. {
  125. initialized = false;
  126. objects.clear();
  127. }
  128. XMLSerialization& operator=(const XMLSerialization& obj)
  129. {
  130. if(this != &obj)
  131. {
  132. if(initialized)
  133. {
  134. initialized = false;
  135. objects.clear();
  136. }
  137. }
  138. return *this;
  139. }
  140. /**
  141. * Use this function to add your variables which should be serialized.
  142. */
  143. template <typename T>
  144. void Add(T& obj,std::string name, bool binary = false)
  145. {
  146. XMLSerializationObject<T>* object = new XMLSerializationObject<T>();
  147. object->Binary = binary;
  148. object->Name = name;
  149. object->Object = &obj;
  150. objects.push_back(object);
  151. }
  152. };
  153. }
  154. #endif