コード例 #1
0
        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
        }