public static bool GuessIfUnityWillSerialize([NotNull] System.Reflection.MemberInfo memberInfo, [CanBeNull] object value) { #if DONT_USE_ODIN_SERIALIZER if (memberInfo.IsStatic()) { return(false); } var declaringType = memberInfo.DeclaringType; if (!(memberInfo is System.Reflection.FieldInfo)) { return(false); } if (!declaringType.IsSerializable) { return(false); } if (declaringType.IsGenericType) { if (declaringType.IsGenericTypeDefinition) { return(false); } return(declaringType.GetGenericTypeDefinition() == Types.List); } return(declaringType.IsSerializable && memberInfo is System.Reflection.FieldInfo); #else var fieldType = memberInfo.DeclaringType; // Generic types are not supported, even with the SerializeReference attribute - with the exceptin of List<>. if (fieldType.IsGenericType) { return(fieldType.GetGenericTypeDefinition() == Types.List); } #if UNITY_2019_3_OR_NEWER // With SerializeReference attribute Unity can serialize interface values if value does not derive from UnityEngine.Object if (memberInfo.GetCustomAttributes(typeof(SerializeReference), false).Length > 0) { return(value == null || !Types.UnityObject.IsAssignableFrom(value.GetType())); } #endif if (fieldType.IsAbstract) { return(false); } if (fieldType == Types.SystemObject) { return(false); } return(UnitySerializationUtility.GuessIfUnityWillSerialize(memberInfo)); #endif }