BsScriptSerializableObject.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/BsScriptSerializableObject.h"
  4. #include "Wrappers/BsScriptSerializableField.h"
  5. #include "Wrappers/BsScriptSerializableProperty.h"
  6. #include "Serialization/BsScriptAssemblyManager.h"
  7. #include "BsScriptMeta.h"
  8. #include "BsMonoField.h"
  9. #include "BsMonoClass.h"
  10. #include "BsMonoManager.h"
  11. #include "BsMonoUtil.h"
  12. namespace bs
  13. {
  14. MonoField* ScriptSerializableObject::FieldsField = nullptr;
  15. ScriptSerializableObject::ScriptSerializableObject(MonoObject* instance, const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  16. :ScriptObject(instance), mTypeInfo(typeInfo)
  17. {
  18. }
  19. void ScriptSerializableObject::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_CreateInstance", (void*)&ScriptSerializableObject::internal_createInstance);
  22. FieldsField = metaData.scriptClass->getField("_fields");
  23. }
  24. MonoObject* ScriptSerializableObject::create(const ScriptSerializableProperty* native, MonoObject* managed,
  25. MonoReflectionType* reflType)
  26. {
  27. void* params[2] = { reflType, managed };
  28. MonoObject* managedInstance = metaData.scriptClass->createInstance(params, 2);
  29. return managedInstance;
  30. }
  31. void ScriptSerializableObject::internal_createInstance(MonoObject* instance, MonoReflectionType* type)
  32. {
  33. ::MonoClass* monoClass = MonoUtil::getClass(type);
  34. String elementNs;
  35. String elementTypeName;
  36. MonoUtil::getClassName(monoClass, elementNs, elementTypeName);
  37. SPtr<ManagedSerializableObjectInfo> objInfo;
  38. ScriptAssemblyManager::instance().getSerializableObjectInfo(elementNs, elementTypeName, objInfo);
  39. createInternal(instance, objInfo);
  40. }
  41. ScriptSerializableObject* ScriptSerializableObject::createInternal(MonoObject* instance, const SPtr<ManagedSerializableObjectInfo>& objInfo)
  42. {
  43. SPtr<ManagedSerializableTypeInfo> typeInfo;
  44. if(objInfo != nullptr)
  45. typeInfo = objInfo->mTypeInfo;
  46. ScriptSerializableObject* nativeInstance = new (bs_alloc<ScriptSerializableObject>()) ScriptSerializableObject(instance, typeInfo);
  47. Vector<SPtr<ManagedSerializableMemberInfo>> sortedFields;
  48. if(objInfo != nullptr)
  49. {
  50. sortedFields.resize(objInfo->mFields.size());
  51. UINT32 i = 0;
  52. for (auto& fieldPair : objInfo->mFields)
  53. {
  54. sortedFields[i] = fieldPair.second;
  55. i++;
  56. }
  57. }
  58. std::sort(sortedFields.begin(), sortedFields.end(),
  59. [&](const SPtr<ManagedSerializableMemberInfo>& x, const SPtr<ManagedSerializableMemberInfo>& y)
  60. {
  61. return x->mFieldId < y->mFieldId;
  62. });
  63. ::MonoClass* serializableFieldClass = ScriptSerializableField::getMetaData()->scriptClass->_getInternalClass();
  64. ScriptArray scriptArray(serializableFieldClass, (UINT32)sortedFields.size());
  65. UINT32 i = 0;
  66. for (auto& field : sortedFields)
  67. {
  68. MonoObject* fieldManagedInstance = ScriptSerializableField::create(instance, field);
  69. scriptArray.set(i, fieldManagedInstance);
  70. i++;
  71. }
  72. FieldsField->set(instance, scriptArray.getInternal());
  73. return nativeInstance;
  74. }
  75. }