2
0

BsManagedSerializableObject.cpp 6.8 KB

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