BsManagedSerializableObject.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsIReflectable.h"
  4. #include "BsManagedSerializableField.h"
  5. #include <mono/jit/jit.h>
  6. namespace BansheeEngine
  7. {
  8. /**
  9. * @brief TODO
  10. *
  11. * @note This class can be in two states:
  12. * - Linked - When the object has a link to a managed object. This is the default
  13. * state when a new instance of ManagedSerializableObject is created.
  14. * Any operations during this state will operate directly on the linked
  15. * managed object.
  16. * - Serialized - When the object has no link to the managed object but instead just
  17. * contains cached object and field data that may be used for initializing
  18. * a managed object. Any operations during this state will operate
  19. * only on the cached internal data.
  20. * You can transfer between these states by calling serialize(linked->serialized) &
  21. * deserialize(serialized->linked).
  22. */
  23. class BS_SCR_BE_EXPORT ManagedSerializableObject : public IReflectable
  24. {
  25. private:
  26. struct ConstructPrivately {};
  27. struct BS_SCR_BE_EXPORT Hash
  28. {
  29. inline size_t operator()(const ManagedSerializableFieldKey& x) const;
  30. };
  31. struct BS_SCR_BE_EXPORT Equals
  32. {
  33. inline bool operator()(const ManagedSerializableFieldKey& a, const ManagedSerializableFieldKey& b) const;
  34. };
  35. public:
  36. ManagedSerializableObject(const ConstructPrivately& dummy, ManagedSerializableObjectInfoPtr objInfo, MonoObject* managedInstance);
  37. ManagedSerializableObject(const ConstructPrivately& dummy);
  38. MonoObject* getManagedInstance() const { return mManagedInstance; }
  39. ManagedSerializableObjectInfoPtr getObjectInfo() const { return mObjInfo; }
  40. void setFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo, const ManagedSerializableFieldDataPtr& val);
  41. ManagedSerializableFieldDataPtr getFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo) const;
  42. void serialize();
  43. void deserialize();
  44. static ManagedSerializableObjectPtr createFromExisting(MonoObject* managedInstance);
  45. static ManagedSerializableObjectPtr createNew(const ManagedSerializableTypeInfoObjectPtr& type);
  46. static MonoObject* createManagedInstance(const ManagedSerializableTypeInfoObjectPtr& type);
  47. protected:
  48. MonoObject* mManagedInstance;
  49. ManagedSerializableObjectInfoPtr mObjInfo;
  50. UnorderedMap<ManagedSerializableFieldKey, ManagedSerializableFieldDataPtr, Hash, Equals> mCachedData;
  51. /************************************************************************/
  52. /* RTTI */
  53. /************************************************************************/
  54. static ManagedSerializableObjectPtr createEmpty();
  55. public:
  56. friend class ManagedSerializableObjectRTTI;
  57. static RTTITypeBase* getRTTIStatic();
  58. virtual RTTITypeBase* getRTTI() const;
  59. };
  60. }