BsManagedSerializableObject.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 Allows access to an underlying managed object, or a cached version of that object that
  10. * can be serialized/deserialized.
  11. *
  12. * @note This class can be in two states:
  13. * - Linked - When the object has a link to a managed object. This is the default
  14. * state when a new instance of ManagedSerializableObject is created.
  15. * Any operations during this state will operate directly on the linked
  16. * managed object.
  17. * - Serialized - When the object has no link to the managed object but instead just
  18. * contains cached object and field data that may be used for initializing
  19. * a managed object. Any operations during this state will operate
  20. * only on the cached internal data.
  21. * You can transfer between these states by calling serialize(linked->serialized) &
  22. * deserialize (serialized->linked).
  23. *
  24. */
  25. class BS_SCR_BE_EXPORT ManagedSerializableObject : public IReflectable
  26. {
  27. private:
  28. struct ConstructPrivately {};
  29. /**
  30. * @brief Generates a hash value for field key data identifying a single field in the object.
  31. */
  32. struct BS_SCR_BE_EXPORT Hash
  33. {
  34. inline size_t operator()(const ManagedSerializableFieldKey& x) const;
  35. };
  36. /**
  37. * @brief Compares two field key objects.
  38. */
  39. struct BS_SCR_BE_EXPORT Equals
  40. {
  41. inline bool operator()(const ManagedSerializableFieldKey& a, const ManagedSerializableFieldKey& b) const;
  42. };
  43. public:
  44. ManagedSerializableObject(const ConstructPrivately& dummy, ManagedSerializableObjectInfoPtr objInfo, MonoObject* managedInstance);
  45. ManagedSerializableObject(const ConstructPrivately& dummy);
  46. /**
  47. * @brief Returns the internal managed instance of the object. This will return null if
  48. * the object is in serialized mode.
  49. */
  50. MonoObject* getManagedInstance() const { return mManagedInstance; }
  51. /**
  52. * @brief Returns the type information for the internal object.
  53. */
  54. ManagedSerializableObjectInfoPtr getObjectInfo() const { return mObjInfo; }
  55. /**
  56. * @brief Sets a new value of the specified field. Operates on
  57. * managed object if in linked state, or on cached data otherwise.
  58. *
  59. * @param fieldInfo Object describing the field to which to set the value. This field
  60. * must belong to the type this object is initialized with.
  61. * @param val Wrapper around the value to store in the field.
  62. */
  63. void setFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo, const ManagedSerializableFieldDataPtr& val);
  64. /**
  65. * @brief Returns the value of the specified field. Operates on managed object
  66. * if in linked state, or on cached data otherwise.
  67. *
  68. * @param fieldInfo Object describing the field to which to set the value. This field
  69. * must belong to the type this object is initialized with.
  70. *
  71. * @return A wrapper around the value of the field.
  72. */
  73. ManagedSerializableFieldDataPtr getFieldData(const ManagedSerializableFieldInfoPtr& fieldInfo) const;
  74. /**
  75. * @brief Serializes the internal managed object into a set of cached data that can be saved
  76. * in memory/disk and can be deserialized later. Does nothing if object is already is
  77. * serialized mode. When in serialized mode the reference to the managed instance will be lost.
  78. */
  79. void serialize();
  80. /**
  81. * @brief Deserializes a set of cached data into a managed object. This action may fail in case the cached
  82. * data contains a type that no longer exists. You may check if it completely successfully if ::getManagedInstance
  83. * returns non-null after.
  84. *
  85. * This action transfers the object into linked mode. All further operations will operate directly on the managed instance
  86. * and the cached data will be cleared. If you call this method on an already linked object the old object will be
  87. * replaced and initialized with empty data (since cached data does not exist).
  88. */
  89. void deserialize();
  90. /**
  91. * @brief Deserializes a set of cached data into an existing managed object. Caller must ensure the provided object
  92. * is of proper type.
  93. *
  94. * This action transfers the object into linked mode. All further operations will operate directly on the managed instance
  95. * and the cached data will be cleared. If you call this method on an already linked object the old object will be
  96. * replaced and initialized with empty data (since cached data does not exist).
  97. *
  98. * @param instance Existing managed instance of the same type this serializable object represents.
  99. * @param objInfo Serializable object info for the managed object type.
  100. */
  101. void deserialize(MonoObject* instance, const ManagedSerializableObjectInfoPtr& objInfo);
  102. /**
  103. * @brief Creates a managed serializable object that references an existing managed object. Created object will be in linked mode.
  104. *
  105. * @param managedInstance Constructed managed instance of the object to link with.
  106. */
  107. static ManagedSerializableObjectPtr createFromExisting(MonoObject* managedInstance);
  108. /**
  109. * @brief Creates a managed serializable object that creates and references a brand new managed object instance.
  110. *
  111. * @param type Type of the object to create.
  112. */
  113. static ManagedSerializableObjectPtr createNew(const ManagedSerializableTypeInfoObjectPtr& type);
  114. /**
  115. * @brief Creates a managed object instance.
  116. *
  117. * @param type Type of the object to create.
  118. */
  119. static MonoObject* createManagedInstance(const ManagedSerializableTypeInfoObjectPtr& type);
  120. protected:
  121. MonoObject* mManagedInstance;
  122. ManagedSerializableObjectInfoPtr mObjInfo;
  123. UnorderedMap<ManagedSerializableFieldKey, ManagedSerializableFieldDataPtr, Hash, Equals> mCachedData;
  124. /************************************************************************/
  125. /* RTTI */
  126. /************************************************************************/
  127. /**
  128. * @brief Creates an empty and uninitialized object used for serialization purposes.
  129. */
  130. static ManagedSerializableObjectPtr createEmpty();
  131. public:
  132. friend class ManagedSerializableObjectRTTI;
  133. static RTTITypeBase* getRTTIStatic();
  134. virtual RTTITypeBase* getRTTI() const override;
  135. };
  136. }