2
0

BsManagedSerializableObject.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. // See if this type even still exists
  91. ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
  92. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mObjInfo->mTypeInfo->mTypeNamespace, mObjInfo->mTypeInfo->mTypeName, currentObjInfo))
  93. {
  94. mManagedInstance = nullptr;
  95. mCachedData.clear();
  96. return;
  97. }
  98. deserialize(createManagedInstance(currentObjInfo->mTypeInfo), currentObjInfo);
  99. }
  100. void ManagedSerializableObject::deserialize(MonoObject* instance, const ManagedSerializableObjectInfoPtr& objInfo)
  101. {
  102. mManagedInstance = instance;
  103. if (mManagedInstance == nullptr)
  104. {
  105. mCachedData.clear();
  106. return;
  107. }
  108. // Deserialize children
  109. for (auto& fieldEntry : mCachedData)
  110. fieldEntry.second->deserialize();
  111. // Scan all fields and ensure the fields still exist
  112. UINT32 i = 0;
  113. ManagedSerializableObjectInfoPtr curType = mObjInfo;
  114. while (curType != nullptr)
  115. {
  116. for (auto& field : curType->mFields)
  117. {
  118. if (field.second->isSerializable())
  119. {
  120. UINT32 fieldId = field.second->mFieldId;
  121. UINT32 typeID = field.second->mParentTypeId;
  122. ManagedSerializableFieldKey key(typeID, fieldId);
  123. ManagedSerializableFieldInfoPtr matchingFieldInfo = objInfo->findMatchingField(field.second, curType->mTypeInfo);
  124. if (matchingFieldInfo != nullptr)
  125. setFieldData(matchingFieldInfo, mCachedData[key]);
  126. i++;
  127. }
  128. }
  129. curType = curType->mBaseClass;
  130. }
  131. mObjInfo = objInfo;
  132. mCachedData.clear();
  133. }
  134. void ManagedSerializableObject::setFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo, const ManagedSerializableFieldDataPtr& val)
  135. {
  136. if (mManagedInstance != nullptr)
  137. fieldInfo->mMonoField->setValue(mManagedInstance, val->getValue(fieldInfo->mTypeInfo));
  138. else
  139. {
  140. ManagedSerializableFieldKey key(fieldInfo->mParentTypeId, fieldInfo->mFieldId);
  141. mCachedData[key] = val;
  142. }
  143. }
  144. ManagedSerializableFieldDataPtr ManagedSerializableObject::getFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo) const
  145. {
  146. if (mManagedInstance != nullptr)
  147. {
  148. MonoObject* fieldValue = fieldInfo->mMonoField->getValueBoxed(mManagedInstance);
  149. return ManagedSerializableFieldData::create(fieldInfo->mTypeInfo, fieldValue);
  150. }
  151. else
  152. {
  153. ManagedSerializableFieldKey key(fieldInfo->mParentTypeId, fieldInfo->mFieldId);
  154. auto iterFind = mCachedData.find(key);
  155. if (iterFind != mCachedData.end())
  156. return iterFind->second;
  157. return nullptr;
  158. }
  159. }
  160. RTTITypeBase* ManagedSerializableObject::getRTTIStatic()
  161. {
  162. return ManagedSerializableObjectRTTI::instance();
  163. }
  164. RTTITypeBase* ManagedSerializableObject::getRTTI() const
  165. {
  166. return ManagedSerializableObject::getRTTIStatic();
  167. }
  168. }