BsManagedSerializableObject.cpp 6.8 KB

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