Forráskód Böngészése

Bugfix: SerializableObject created from SerializableProperty will now lists the field of the actual type in the property, not just the base type
- Also updated 'bsf' version

BearishSun 7 éve
szülő
commit
0e5e9e0dd7

+ 7 - 2
Source/Scripting/MBansheeEngine/Serialization/SerializableProperty.cs

@@ -183,7 +183,11 @@ namespace BansheeEngine
             if (type != FieldType.Object)
                 throw new Exception("Attempting to retrieve object information from a field that doesn't contain an object.");
 
-            return Internal_CreateObject(mCachedPtr, this);
+            // Get the most-derived type so the serializable object lists the exact fields
+            object obj = GetValue<object>();
+            Type actualType = obj != null ? obj.GetType() : internalType;
+
+            return Internal_CreateObject(mCachedPtr, this, actualType);
         }
 
         /// <summary>
@@ -327,7 +331,8 @@ namespace BansheeEngine
         private static extern void Internal_CreateInstance(SerializableProperty instance, Type type);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern SerializableObject Internal_CreateObject(IntPtr nativeInstance, object managedInstance);
+        private static extern SerializableObject Internal_CreateObject(IntPtr nativeInstance, object managedInstance, 
+            Type actualType);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern SerializableArray Internal_CreateArray(IntPtr nativeInstance, object managedInstance);

+ 3 - 4
Source/Scripting/SBansheeEngine/Wrappers/BsScriptSerializableObject.cpp

@@ -27,11 +27,10 @@ namespace bs
 		FieldsField = metaData.scriptClass->getField("_fields");
 	}
 
-	MonoObject* ScriptSerializableObject::create(const ScriptSerializableProperty* native, MonoObject* managed)
+	MonoObject* ScriptSerializableObject::create(const ScriptSerializableProperty* native, MonoObject* managed, 
+		MonoReflectionType* reflType)
 	{
-		MonoReflectionType* internalElementType = MonoUtil::getType(native->getTypeInfo()->getMonoClass());
-
-		void* params[2] = { internalElementType, managed };
+		void* params[2] = { reflType, managed };
 		MonoObject* managedInstance = metaData.scriptClass->createInstance(params, 2);
 
 		return managedInstance;

+ 2 - 1
Source/Scripting/SBansheeEngine/Wrappers/BsScriptSerializableObject.h

@@ -18,7 +18,8 @@ namespace bs
 		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "SerializableObject")
 
 		/**	Creates a new serializable object interop object from the data in the provided property.  */
-		static MonoObject* create(const ScriptSerializableProperty* native, MonoObject* managed);
+		static MonoObject* create(const ScriptSerializableProperty* native, MonoObject* managed, 
+			MonoReflectionType* reflType);
 
 	private:
 		ScriptSerializableObject(MonoObject* instance, const SPtr<ManagedSerializableTypeInfo>& typeInfo);

+ 3 - 2
Source/Scripting/SBansheeEngine/Wrappers/BsScriptSerializableProperty.cpp

@@ -67,9 +67,10 @@ namespace bs
 		new (bs_alloc<ScriptSerializableProperty>()) ScriptSerializableProperty(instance, typeInfo);
 	}
 
-	MonoObject* ScriptSerializableProperty::internal_createObject(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance)
+	MonoObject* ScriptSerializableProperty::internal_createObject(ScriptSerializableProperty* nativeInstance, 
+		MonoObject* managedInstance, MonoReflectionType* reflType)
 	{
-		return ScriptSerializableObject::create(nativeInstance, managedInstance);
+		return ScriptSerializableObject::create(nativeInstance, managedInstance, reflType);
 	}
 
 	MonoObject* ScriptSerializableProperty::internal_createArray(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance)

+ 2 - 1
Source/Scripting/SBansheeEngine/Wrappers/BsScriptSerializableProperty.h

@@ -43,7 +43,8 @@ namespace bs
 		/************************************************************************/
 		static void internal_CreateInstance(MonoObject* instance, MonoReflectionType* reflType);
 
-		static MonoObject* internal_createObject(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance);
+		static MonoObject* internal_createObject(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance, 
+			MonoReflectionType* reflType);
 		static MonoObject* internal_createArray(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance);
 		static MonoObject* internal_createList(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance);
 		static MonoObject* internal_createDictionary(ScriptSerializableProperty* nativeInstance, MonoObject* managedInstance);

+ 1 - 1
Source/bsf

@@ -1 +1 @@
-Subproject commit 8f7fbae676e54b1d15d6120dc987804b0e84ea0c
+Subproject commit bf1c2fe0b31578128ab818df4a3f07196195e885