BsManagedSerializableObject.cpp 5.8 KB

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