BsScriptSerializableUtility.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include "BsScriptSerializableUtility.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoClass.h"
  4. #include "BsMonoMethod.h"
  5. #include "BsMonoUtil.h"
  6. #include "BsScriptAssemblyManager.h"
  7. #include "BsManagedSerializableField.h"
  8. #include "BsMemorySerializer.h"
  9. namespace BansheeEngine
  10. {
  11. ScriptSerializableUtility::ScriptSerializableUtility(MonoObject* instance)
  12. :ScriptObject(instance)
  13. { }
  14. void ScriptSerializableUtility::initRuntimeData()
  15. {
  16. metaData.scriptClass->addInternalCall("Internal_Clone", &ScriptSerializableUtility::internal_Clone);
  17. }
  18. MonoObject* ScriptSerializableUtility::internal_Clone(MonoObject* original)
  19. {
  20. if (original == nullptr)
  21. return nullptr;
  22. ::MonoClass* monoClass = mono_object_get_class(original);
  23. MonoClass* engineClass = MonoManager::instance().findClass(monoClass);
  24. ManagedSerializableTypeInfoPtr typeInfo = ScriptAssemblyManager::instance().getTypeInfo(engineClass);
  25. ManagedSerializableFieldDataPtr data = ManagedSerializableFieldData::create(typeInfo, original);
  26. MemorySerializer ms;
  27. // Note: This code unnecessarily encodes to binary and decodes from it. I could have added a specialized clone method that does it directly,
  28. // but didn't feel the extra code was justified.
  29. UINT32 size = 0;
  30. UINT8* encodedData = ms.encode(data.get(), size);
  31. ManagedSerializableFieldDataPtr clonedData = std::static_pointer_cast<ManagedSerializableFieldData>(ms.decode(encodedData, size));
  32. return clonedData->getValueBoxed(typeInfo);
  33. }
  34. }