BsManagedSerializableObject.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsManagedSerializableObject.h"
  4. #include "BsManagedSerializableObjectRTTI.h"
  5. #include "BsManagedSerializableObjectInfo.h"
  6. #include "BsManagedSerializableField.h"
  7. #include "BsScriptAssemblyManager.h"
  8. #include "BsMonoField.h"
  9. #include "BsMonoClass.h"
  10. #include "BsMonoUtil.h"
  11. namespace BansheeEngine
  12. {
  13. inline size_t ManagedSerializableObject::Hash::operator()(const ManagedSerializableFieldKey& x) const
  14. {
  15. size_t seed = 0;
  16. hash_combine(seed, (UINT32)x.mFieldId);
  17. hash_combine(seed, (UINT32)x.mTypeId);
  18. return seed;
  19. }
  20. inline bool ManagedSerializableObject::Equals::operator()(const ManagedSerializableFieldKey& a, const ManagedSerializableFieldKey& b) const
  21. {
  22. return a.mFieldId == b.mFieldId && a.mTypeId == b.mTypeId;
  23. }
  24. ManagedSerializableObject::ManagedSerializableObject(const ConstructPrivately& dummy)
  25. :mManagedInstance(nullptr)
  26. {
  27. }
  28. ManagedSerializableObject::ManagedSerializableObject(const ConstructPrivately& dummy, ManagedSerializableObjectInfoPtr objInfo, MonoObject* managedInstance)
  29. :mObjInfo(objInfo), mManagedInstance(managedInstance)
  30. {
  31. }
  32. ManagedSerializableObjectPtr ManagedSerializableObject::createFromExisting(MonoObject* managedInstance)
  33. {
  34. if(managedInstance == nullptr)
  35. return nullptr;
  36. String elementNs;
  37. String elementTypeName;
  38. MonoUtil::getClassName(managedInstance, elementNs, elementTypeName);
  39. ManagedSerializableObjectInfoPtr objInfo;
  40. if(!ScriptAssemblyManager::instance().getSerializableObjectInfo(elementNs, elementTypeName, objInfo))
  41. return nullptr;
  42. return bs_shared_ptr_new<ManagedSerializableObject>(ConstructPrivately(), objInfo, managedInstance);
  43. }
  44. ManagedSerializableObjectPtr ManagedSerializableObject::createNew(const ManagedSerializableTypeInfoObjectPtr& type)
  45. {
  46. ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
  47. // See if this type even still exists
  48. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(type->mTypeNamespace, type->mTypeName, currentObjInfo))
  49. return nullptr;
  50. return bs_shared_ptr_new<ManagedSerializableObject>(ConstructPrivately(), currentObjInfo, createManagedInstance(type));
  51. }
  52. MonoObject* ManagedSerializableObject::createManagedInstance(const ManagedSerializableTypeInfoObjectPtr& type)
  53. {
  54. ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
  55. // See if this type even still exists
  56. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(type->mTypeNamespace, type->mTypeName, currentObjInfo))
  57. return nullptr;
  58. if (type->mValueType)
  59. return currentObjInfo->mMonoClass->createInstance(false);
  60. else
  61. return currentObjInfo->mMonoClass->createInstance();
  62. }
  63. ManagedSerializableObjectPtr ManagedSerializableObject::createEmpty()
  64. {
  65. return bs_shared_ptr_new<ManagedSerializableObject>(ConstructPrivately());
  66. }
  67. void ManagedSerializableObject::serialize()
  68. {
  69. if (mManagedInstance == nullptr)
  70. return;
  71. mCachedData.clear();
  72. ManagedSerializableObjectInfoPtr curType = mObjInfo;
  73. while (curType != nullptr)
  74. {
  75. for (auto& field : curType->mFields)
  76. {
  77. if (field.second->isSerializable())
  78. {
  79. ManagedSerializableFieldKey key(field.second->mParentTypeId, field.second->mFieldId);
  80. mCachedData[key] = getFieldData(field.second);
  81. }
  82. }
  83. curType = curType->mBaseClass;
  84. }
  85. // Serialize children
  86. for (auto& fieldEntry : mCachedData)
  87. fieldEntry.second->serialize();
  88. mManagedInstance = nullptr;
  89. }
  90. void ManagedSerializableObject::deserialize()
  91. {
  92. // See if this type even still exists
  93. ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
  94. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mObjInfo->mTypeInfo->mTypeNamespace, mObjInfo->mTypeInfo->mTypeName, currentObjInfo))
  95. {
  96. mManagedInstance = nullptr;
  97. mCachedData.clear();
  98. return;
  99. }
  100. deserialize(createManagedInstance(currentObjInfo->mTypeInfo), currentObjInfo);
  101. }
  102. void ManagedSerializableObject::deserialize(MonoObject* instance, const ManagedSerializableObjectInfoPtr& objInfo)
  103. {
  104. mManagedInstance = instance;
  105. if (mManagedInstance == nullptr)
  106. {
  107. mCachedData.clear();
  108. return;
  109. }
  110. // Deserialize children
  111. for (auto& fieldEntry : mCachedData)
  112. fieldEntry.second->deserialize();
  113. // Scan all fields and ensure the fields still exist
  114. UINT32 i = 0;
  115. ManagedSerializableObjectInfoPtr curType = mObjInfo;
  116. while (curType != nullptr)
  117. {
  118. for (auto& field : curType->mFields)
  119. {
  120. if (field.second->isSerializable())
  121. {
  122. UINT32 fieldId = field.second->mFieldId;
  123. UINT32 typeID = field.second->mParentTypeId;
  124. ManagedSerializableFieldKey key(typeID, fieldId);
  125. ManagedSerializableFieldInfoPtr matchingFieldInfo = objInfo->findMatchingField(field.second, curType->mTypeInfo);
  126. if (matchingFieldInfo != nullptr)
  127. setFieldData(matchingFieldInfo, mCachedData[key]);
  128. i++;
  129. }
  130. }
  131. curType = curType->mBaseClass;
  132. }
  133. mObjInfo = objInfo;
  134. mCachedData.clear();
  135. }
  136. void ManagedSerializableObject::setFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo, const ManagedSerializableFieldDataPtr& val)
  137. {
  138. if (mManagedInstance != nullptr)
  139. fieldInfo->mMonoField->setValue(mManagedInstance, val->getValue(fieldInfo->mTypeInfo));
  140. else
  141. {
  142. ManagedSerializableFieldKey key(fieldInfo->mParentTypeId, fieldInfo->mFieldId);
  143. mCachedData[key] = val;
  144. }
  145. }
  146. ManagedSerializableFieldDataPtr ManagedSerializableObject::getFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo) const
  147. {
  148. if (mManagedInstance != nullptr)
  149. {
  150. MonoObject* fieldValue = fieldInfo->mMonoField->getValueBoxed(mManagedInstance);
  151. return ManagedSerializableFieldData::create(fieldInfo->mTypeInfo, fieldValue);
  152. }
  153. else
  154. {
  155. ManagedSerializableFieldKey key(fieldInfo->mParentTypeId, fieldInfo->mFieldId);
  156. auto iterFind = mCachedData.find(key);
  157. if (iterFind != mCachedData.end())
  158. return iterFind->second;
  159. return nullptr;
  160. }
  161. }
  162. RTTITypeBase* ManagedSerializableObject::getRTTIStatic()
  163. {
  164. return ManagedSerializableObjectRTTI::instance();
  165. }
  166. RTTITypeBase* ManagedSerializableObject::getRTTI() const
  167. {
  168. return ManagedSerializableObject::getRTTIStatic();
  169. }
  170. }