示例#1
0
        public static MemberSerialization GetObjectMemberSerialization(
            Type objectType,
            bool ignoreSerializableAttribute)
        {
            JsonObjectAttribute cachedAttribute = JsonTypeReflector.GetCachedAttribute <JsonObjectAttribute>((object)objectType);

            if (cachedAttribute != null)
            {
                return(cachedAttribute.MemberSerialization);
            }
            if (JsonTypeReflector.GetDataContractAttribute(objectType) != null)
            {
                return(MemberSerialization.OptIn);
            }
            return(!ignoreSerializableAttribute && JsonTypeReflector.GetCachedAttribute <SerializableAttribute>((object)objectType) != null ? MemberSerialization.Fields : MemberSerialization.OptOut);
        }
示例#2
0
        public static T GetAttribute <T>(object provider) where T : Attribute
        {
            Type type = provider as Type;

            if (type != null)
            {
                return(JsonTypeReflector.GetAttribute <T>(type));
            }
            MemberInfo memberInfo = provider as MemberInfo;

            if (memberInfo != null)
            {
                return(JsonTypeReflector.GetAttribute <T>(memberInfo));
            }
            return(ReflectionUtils.GetAttribute <T>(provider, true));
        }
示例#3
0
        private static Type GetAssociateMetadataTypeFromAttribute(Type type)
        {
            Type metadataTypeAttributeType = JsonTypeReflector.GetMetadataTypeAttributeType();

            if (metadataTypeAttributeType == null)
            {
                return(null);
            }
            object obj = type.GetCustomAttributes(metadataTypeAttributeType, true).SingleOrDefault <object>();

            if (obj == null)
            {
                return(null);
            }
            return((new LateBoundMetadataTypeAttribute(obj)).MetadataClassType);
        }
示例#4
0
        public static JsonConverter GetJsonConverter(ICustomAttributeProvider attributeProvider, Type targetConvertedType)
        {
            Type jsonConverterType = JsonTypeReflector.GetJsonConverterType(attributeProvider);

            if (jsonConverterType == null)
            {
                return(null);
            }
            JsonConverter jsonConverter = JsonConverterAttribute.CreateJsonConverterInstance(jsonConverterType);

            if (!jsonConverter.CanConvert(targetConvertedType))
            {
                throw new JsonSerializationException("JsonConverter {0} on {1} is not compatible with member type {2}.".FormatWith(CultureInfo.InvariantCulture, new object[] { jsonConverter.GetType().Name, attributeProvider, targetConvertedType.Name }));
            }
            return(jsonConverter);
        }
        public static MemberSerialization GetObjectMemberSerialization(Type objectType)
        {
            JsonObjectAttribute jsonObjectAttribute = JsonTypeReflector.GetJsonObjectAttribute(objectType);

            if (jsonObjectAttribute != null)
            {
                return(jsonObjectAttribute.MemberSerialization);
            }
            DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType);

            if (dataContractAttribute != null)
            {
                return(MemberSerialization.OptIn);
            }
            return(MemberSerialization.OptOut);
        }
        /// <summary>
        /// Determines which contract type is created for the given type.
        /// </summary>
        /// <param name="objectType">Type of the object.</param>
        /// <returns>A <see cref="JsonContract"/> for the given type.</returns>
        protected virtual JsonContract CreateContract(Type objectType)
        {
            Type t = ReflectionUtils.EnsureNotNullableType(objectType);

            if (JsonConvert.IsJsonPrimitiveType(t))
            {
                return(CreatePrimitiveContract(t));
            }

            if (JsonTypeReflector.GetJsonObjectAttribute(t) != null)
            {
                return(CreateObjectContract(t));
            }

            if (JsonTypeReflector.GetJsonArrayAttribute(t) != null)
            {
                return(CreateArrayContract(t));
            }

            if (t == typeof(JToken) || t.IsSubclassOf(typeof(JToken)))
            {
                return(CreateLinqContract(t));
            }

            if (CollectionUtils.IsDictionaryType(t))
            {
                return(CreateDictionaryContract(t));
            }

            if (typeof(IEnumerable).IsAssignableFrom(t))
            {
                return(CreateArrayContract(t));
            }

            if (CanConvertToString(t))
            {
                return(CreateStringContract(t));
            }

#if !((UNITY_WINRT && !UNITY_EDITOR) || (UNITY_WP8 || UNITY_WP_8_1))
            if (typeof(ISerializable).IsAssignableFrom(t))
            {
                return(CreateISerializableContract(t));
            }
#endif
            return(CreateObjectContract(t));
        }
        internal JsonContainerContract(Type underlyingType)
        {
            Class6.yDnXvgqzyB5jw();
            base(underlyingType);
            JsonContainerAttribute cachedAttribute = JsonTypeReflector.GetCachedAttribute <JsonContainerAttribute>(underlyingType);

            if (cachedAttribute != null)
            {
                if (cachedAttribute.ItemConverterType != null)
                {
                    this.ItemConverter = JsonTypeReflector.CreateJsonConverterInstance(cachedAttribute.ItemConverterType, cachedAttribute.ItemConverterParameters);
                }
                this.ItemIsReference           = cachedAttribute._itemIsReference;
                this.ItemReferenceLoopHandling = cachedAttribute._itemReferenceLoopHandling;
                this.ItemTypeNameHandling      = cachedAttribute._itemTypeNameHandling;
            }
        }
示例#8
0
        private JsonContract CreateContract(Type objectType)
        {
            if (JsonTypeReflector.GetJsonObjectAttribute(objectType) != null)
            {
                return(CreateObjectContract(objectType));
            }
            if (CollectionUtils.IsDictionaryType(objectType))
            {
                return(CreateDictionaryContract(objectType));
            }
            if (typeof(IEnumerable).IsAssignableFrom(objectType))
            {
                return(CreateArrayContract(objectType));
            }

            return(CreateObjectContract(objectType));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonContainerContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        internal JsonContainerContract(Type underlyingType)
            : base(underlyingType)
        {
            JsonContainerAttribute jsonContainerAttribute = JsonTypeReflector.GetJsonContainerAttribute(underlyingType);

            if (jsonContainerAttribute != null)
            {
                if (jsonContainerAttribute.ItemConverterType != null)
                {
                    ItemConverter = JsonConverterAttribute.CreateJsonConverterInstance(jsonContainerAttribute.ItemConverterType);
                }

                ItemIsReference           = jsonContainerAttribute._itemIsReference;
                ItemReferenceLoopHandling = jsonContainerAttribute._itemReferenceLoopHandling;
                ItemTypeNameHandling      = jsonContainerAttribute._itemTypeNameHandling;
            }
        }
示例#10
0
        private void InitializeContract(JsonContract contract)
        {
            JsonContainerAttribute containerAttribute = JsonTypeReflector.GetJsonContainerAttribute(contract.NonNullableUnderlyingType);

            if (containerAttribute != null)
            {
                contract.IsReference = containerAttribute._isReference;
            }
            contract.Converter         = this.ResolveContractConverter(contract.NonNullableUnderlyingType);
            contract.InternalConverter = JsonSerializer.GetMatchingConverter(DefaultContractResolver.BuiltInConverters, contract.NonNullableUnderlyingType);
            if (ReflectionUtils.HasDefaultConstructor(contract.CreatedType, true) || TypeExtensions.IsValueType(contract.CreatedType))
            {
                contract.DefaultCreator          = this.GetDefaultCreator(contract.CreatedType);
                contract.DefaultCreatorNonPublic = !TypeExtensions.IsValueType(contract.CreatedType) && ReflectionUtils.GetDefaultConstructor(contract.CreatedType) == null;
            }
            this.ResolveCallbackMethods(contract, contract.NonNullableUnderlyingType);
        }
        /// <summary>
        /// Gets the serializable members for the type.
        /// </summary>
        /// <param name="objectType">The type to get serializable members for.</param>
        /// <returns>The serializable members for the type.</returns>
        protected virtual List <MemberInfo> GetSerializableMembers(Type objectType)
        {
            DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType);

            List <MemberInfo> defaultMembers = ReflectionUtils.GetFieldsAndProperties(objectType, DefaultMembersSearchFlags)
                                               .Where(m => !ReflectionUtils.IsIndexedProperty(m)).ToList();
            List <MemberInfo> allMembers = ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)
                                           .Where(m => !ReflectionUtils.IsIndexedProperty(m)).ToList();

            List <MemberInfo> serializableMembers = new List <MemberInfo>();

            foreach (MemberInfo member in allMembers)
            {
                // exclude members that are compiler generated if set
                if (SerializeCompilerGeneratedMembers || !member.IsDefined(typeof(CompilerGeneratedAttribute), true))
                {
                    if (defaultMembers.Contains(member))
                    {
                        // add all members that are found by default member search
                        serializableMembers.Add(member);
                    }
                    else
                    {
                        // add members that are explicitly marked with JsonProperty/DataMember attribute
                        if (JsonTypeReflector.GetAttribute <JsonPropertyAttribute>(member) != null)
                        {
                            serializableMembers.Add(member);
                        }
                        else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute <DataMemberAttribute>(member) != null)
                        {
                            serializableMembers.Add(member);
                        }
                    }
                }
            }

            Type match;

            // don't include EntityKey on entities objects... this is a bit hacky
            if (objectType.AssignableToTypeName("System.Data.Objects.DataClasses.EntityObject", out match))
            {
                serializableMembers = serializableMembers.Where(ShouldSerializeEntityMember).ToList();
            }

            return(serializableMembers);
        }
示例#12
0
        protected virtual JsonObjectContract CreateObjectContract(Type objectType)
        {
            JsonObjectContract jsonObjectContract = new JsonObjectContract(objectType);

            this.InitializeContract(jsonObjectContract);
            bool ignoreSerializableAttribute = this.IgnoreSerializableAttribute;

            jsonObjectContract.MemberSerialization = JsonTypeReflector.GetObjectMemberSerialization(jsonObjectContract.NonNullableUnderlyingType, ignoreSerializableAttribute);
            jsonObjectContract.Properties.AddRange(this.CreateProperties(jsonObjectContract.NonNullableUnderlyingType, jsonObjectContract.MemberSerialization));
            JsonObjectAttribute jsonObjectAttribute = JsonTypeReflector.GetJsonObjectAttribute(jsonObjectContract.NonNullableUnderlyingType);

            if (jsonObjectAttribute != null)
            {
                jsonObjectContract.ItemRequired = jsonObjectAttribute._itemRequired;
            }
            ConstructorInfo attributeConstructor = this.GetAttributeConstructor(jsonObjectContract.NonNullableUnderlyingType);

            if (attributeConstructor != null)
            {
                jsonObjectContract.OverrideConstructor = attributeConstructor;
                jsonObjectContract.ConstructorParameters.AddRange(this.CreateConstructorParameters(attributeConstructor, jsonObjectContract.Properties));
            }
            else if (jsonObjectContract.MemberSerialization == MemberSerialization.Fields)
            {
                if (JsonTypeReflector.FullyTrusted)
                {
                    jsonObjectContract.DefaultCreator = new Func <object>(jsonObjectContract.GetUninitializedObject);
                }
            }
            else if (jsonObjectContract.DefaultCreator == null || jsonObjectContract.DefaultCreatorNonPublic)
            {
                ConstructorInfo parametrizedConstructor = this.GetParametrizedConstructor(jsonObjectContract.NonNullableUnderlyingType);
                if (parametrizedConstructor != null)
                {
                    jsonObjectContract.ParametrizedConstructor = parametrizedConstructor;
                    jsonObjectContract.ConstructorParameters.AddRange(this.CreateConstructorParameters(parametrizedConstructor, jsonObjectContract.Properties));
                }
            }
            MemberInfo extensionDataMemberForType = this.GetExtensionDataMemberForType(jsonObjectContract.NonNullableUnderlyingType);

            if (extensionDataMemberForType != null)
            {
                DefaultContractResolver.SetExtensionDataDelegates(jsonObjectContract, extensionDataMemberForType);
            }
            return(jsonObjectContract);
        }
示例#13
0
        /// <summary>
        /// Initializes a new instance of the <see cref="T:Newtonsoft.Json.Serialization.JsonContainerContract" /> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        internal JsonContainerContract(Type underlyingType)
            : base(underlyingType)
        {
            JsonContainerAttribute cachedAttribute = JsonTypeReflector.GetCachedAttribute <JsonContainerAttribute>((object)underlyingType);

            if (cachedAttribute == null)
            {
                return;
            }
            if (cachedAttribute.ItemConverterType != null)
            {
                this.ItemConverter = JsonTypeReflector.CreateJsonConverterInstance(cachedAttribute.ItemConverterType, cachedAttribute.ItemConverterParameters);
            }
            this.ItemIsReference           = cachedAttribute._itemIsReference;
            this.ItemReferenceLoopHandling = cachedAttribute._itemReferenceLoopHandling;
            this.ItemTypeNameHandling      = cachedAttribute._itemTypeNameHandling;
        }
        /// <summary>
        /// Determines which contract type is created for the given type.
        /// </summary>
        /// <param name="objectType">Type of the object.</param>
        /// <returns>A <see cref="JsonContract"/> for the given type.</returns>
        protected virtual JsonContract CreateContract(Type objectType)
        {
            if (JsonConvert.IsJsonPrimitiveType(objectType))
            {
                return(CreatePrimitiveContract(objectType));
            }

            if (JsonTypeReflector.GetJsonObjectAttribute(objectType) != null)
            {
                return(CreateObjectContract(objectType));
            }

            if (JsonTypeReflector.GetJsonArrayAttribute(objectType) != null)
            {
                return(CreateArrayContract(objectType));
            }

            if (objectType.IsSubclassOf(typeof(JToken)))
            {
                return(CreateLinqContract(objectType));
            }

            if (CollectionUtils.IsDictionaryType(objectType))
            {
                return(CreateDictionaryContract(objectType));
            }

            if (typeof(IEnumerable).IsAssignableFrom(objectType))
            {
                return(CreateArrayContract(objectType));
            }

            if (CanConvertToString(objectType))
            {
                return(CreateStringContract(objectType));
            }

#if !SILVERLIGHT && !PocketPC
            if (typeof(ISerializable).IsAssignableFrom(objectType))
            {
                return(CreateISerializableContract(objectType));
            }
#endif

            return(CreateObjectContract(objectType));
        }
示例#15
0
        protected virtual JsonContract CreateContract(Type objectType)
        {
            Type type = ReflectionUtils.EnsureNotNullableType(objectType);

            if (JsonConvert.IsJsonPrimitiveType(type))
            {
                return((JsonContract)this.CreatePrimitiveContract(objectType));
            }
            if (JsonTypeReflector.GetJsonObjectAttribute(type) != null)
            {
                return((JsonContract)this.CreateObjectContract(objectType));
            }
            if (JsonTypeReflector.GetJsonArrayAttribute(type) != null)
            {
                return((JsonContract)this.CreateArrayContract(objectType));
            }
            if (JsonTypeReflector.GetJsonDictionaryAttribute(type) != null)
            {
                return((JsonContract)this.CreateDictionaryContract(objectType));
            }
            if (type == typeof(JToken) || type.IsSubclassOf(typeof(JToken)))
            {
                return((JsonContract)this.CreateLinqContract(objectType));
            }
            if (CollectionUtils.IsDictionaryType(type))
            {
                return((JsonContract)this.CreateDictionaryContract(objectType));
            }
            if (typeof(IEnumerable).IsAssignableFrom(type))
            {
                return((JsonContract)this.CreateArrayContract(objectType));
            }
            if (DefaultContractResolver.CanConvertToString(type))
            {
                return((JsonContract)this.CreateStringContract(objectType));
            }
            if (!this.IgnoreSerializableInterface && typeof(ISerializable).IsAssignableFrom(type))
            {
                return((JsonContract)this.CreateISerializableContract(objectType));
            }
            else
            {
                return((JsonContract)this.CreateObjectContract(objectType));
            }
        }
示例#16
0
        private static Type GetAssociateMetadataTypeFromAttribute(Type type)
        {
            Type metadataTypeAttributeType = JsonTypeReflector.GetMetadataTypeAttributeType();

            if (metadataTypeAttributeType == null)
            {
                return(null);
            }
            object obj = type.GetCustomAttributes(metadataTypeAttributeType, true).SingleOrDefault <object>();

            if (obj == null)
            {
                return(null);
            }
            IMetadataTypeAttribute metadataTypeAttribute = JsonTypeReflector.DynamicCodeGeneration ? DynamicWrapper.CreateWrapper <IMetadataTypeAttribute>(obj) : new LateBoundMetadataTypeAttribute(obj);

            return(metadataTypeAttribute.MetadataClassType);
        }
        /// <summary>
        /// Creates a <see cref="JsonObjectContract"/> for the given type.
        /// </summary>
        /// <param name="objectType">Type of the object.</param>
        /// <returns>A <see cref="JsonObjectContract"/> for the given type.</returns>
        protected virtual JsonObjectContract CreateObjectContract(Type objectType)
        {
            JsonObjectContract contract = new JsonObjectContract(objectType);

            InitializeContract(contract);

            bool ignoreSerializableAttribute;

#if !(SILVERLIGHT || NETFX_CORE || PORTABLE)
            ignoreSerializableAttribute = IgnoreSerializableAttribute;
#else
            ignoreSerializableAttribute = true;
#endif

            contract.MemberSerialization = JsonTypeReflector.GetObjectMemberSerialization(contract.NonNullableUnderlyingType, ignoreSerializableAttribute);
            contract.Properties.AddRange(CreateProperties(contract.NonNullableUnderlyingType, contract.MemberSerialization));

            JsonObjectAttribute attribute = JsonTypeReflector.GetJsonObjectAttribute(contract.NonNullableUnderlyingType);
            if (attribute != null)
            {
                contract.ItemRequired = attribute._itemRequired;
            }

            // check if a JsonConstructorAttribute has been defined and use that
            if (contract.NonNullableUnderlyingType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Any(c => c.IsDefined(typeof(JsonConstructorAttribute), true)))
            {
                ConstructorInfo constructor = GetAttributeConstructor(contract.NonNullableUnderlyingType);
                if (constructor != null)
                {
                    contract.OverrideConstructor = constructor;
                    contract.ConstructorParameters.AddRange(CreateConstructorParameters(constructor, contract.Properties));
                }
            }
            else if (contract.DefaultCreator == null || contract.DefaultCreatorNonPublic)
            {
                ConstructorInfo constructor = GetParametrizedConstructor(contract.NonNullableUnderlyingType);
                if (constructor != null)
                {
                    contract.ParametrizedConstructor = constructor;
                    contract.ConstructorParameters.AddRange(CreateConstructorParameters(constructor, contract.Properties));
                }
            }
            return(contract);
        }
示例#18
0
        public static T GetAttribute <T>(ICustomAttributeProvider provider)
            where T : Attribute
        {
            Type type  = provider as Type;
            Type type1 = type;

            if (type != null)
            {
                return(JsonTypeReflector.GetAttribute <T>(type1));
            }
            MemberInfo memberInfo  = provider as MemberInfo;
            MemberInfo memberInfo1 = memberInfo;

            if (memberInfo != null)
            {
                return(JsonTypeReflector.GetAttribute <T>(memberInfo1));
            }
            return(ReflectionUtils.GetAttribute <T>(provider, true));
        }
        /// <summary>
        /// Creates a <see cref="JsonObjectContract"/> for the given type.
        /// </summary>
        /// <param name="objectType">Type of the object.</param>
        /// <returns>A <see cref="JsonObjectContract"/> for the given type.</returns>
        protected virtual JsonObjectContract CreateObjectContract(Type objectType)
        {
            JsonObjectContract contract = new JsonObjectContract(objectType);

            InitializeContract(contract);

            contract.MemberSerialization = JsonTypeReflector.GetObjectMemberSerialization(objectType);
            contract.Properties.AddRange(CreateProperties(contract.UnderlyingType, contract.MemberSerialization));
            if (objectType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Any(c => c.IsDefined(typeof(JsonConstructorAttribute), true)))
            {
                contract.OverrideConstructor = GetAttributeConstructor(objectType);
            }
            else if (contract.DefaultCreator == null || contract.DefaultCreatorNonPublic)
            {
                contract.ParametrizedConstructor = GetParametrizedConstructor(objectType);
            }

            return(contract);
        }
示例#20
0
        protected virtual List <MemberInfo> GetSerializableMembers(Type objectType)
        {
            Type type;
            DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType);
            List <MemberInfo>     list = (
                from m in ReflectionUtils.GetFieldsAndProperties(objectType, this.DefaultMembersSearchFlags)
                where !ReflectionUtils.IsIndexedProperty(m)
                select m).ToList <MemberInfo>();
            List <MemberInfo> memberInfos = (
                from m in ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
                where !ReflectionUtils.IsIndexedProperty(m)
                select m).ToList <MemberInfo>();
            List <MemberInfo> memberInfos1 = new List <MemberInfo>();

            foreach (MemberInfo memberInfo in memberInfos)
            {
                if (!this.SerializeCompilerGeneratedMembers && memberInfo.IsDefined(typeof(CompilerGeneratedAttribute), true))
                {
                    continue;
                }
                if (list.Contains(memberInfo))
                {
                    memberInfos1.Add(memberInfo);
                }
                else if (JsonTypeReflector.GetAttribute <JsonPropertyAttribute>((ICustomAttributeProvider)memberInfo) == null)
                {
                    if (dataContractAttribute == null || JsonTypeReflector.GetAttribute <DataMemberAttribute>((ICustomAttributeProvider)memberInfo) == null)
                    {
                        continue;
                    }
                    memberInfos1.Add(memberInfo);
                }
                else
                {
                    memberInfos1.Add(memberInfo);
                }
            }
            if (objectType.AssignableToTypeName("System.Data.Objects.DataClasses.EntityObject", out type))
            {
                memberInfos1 = memberInfos1.Where <MemberInfo>(new Func <MemberInfo, bool>(this.ShouldSerializeEntityMember)).ToList <MemberInfo>();
            }
            return(memberInfos1);
        }
示例#21
0
        /// <summary>
        /// Gets the serializable members for the type.
        /// </summary>
        /// <param name="objectType">The type to get serializable members for.</param>
        /// <returns>The serializable members for the type.</returns>
        protected virtual List <MemberInfo> GetSerializableMembers(Type objectType)
        {
#if !PocketPC && !NET20
            DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType);
#endif

            List <MemberInfo> defaultMembers = ReflectionUtils.GetFieldsAndProperties(objectType, DefaultMembersSearchFlags);
            List <MemberInfo> allMembers     = ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

            List <MemberInfo> serializableMembers = new List <MemberInfo>();
            foreach (MemberInfo member in allMembers)
            {
                if (defaultMembers.Contains(member))
                {
                    serializableMembers.Add(member);
                }
                else
                {
                    if (JsonTypeReflector.GetAttribute <JsonPropertyAttribute>(member) != null)
                    {
                        serializableMembers.Add(member);
                    }
#if !PocketPC && !NET20
                    else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute <DataMemberAttribute>(member) != null)
                    {
                        serializableMembers.Add(member);
                    }
#endif
                }
            }

#if !PocketPC && !SILVERLIGHT && !NET20
            Type match;
            // don't include EntityKey on entities objects... this is a bit hacky
            if (objectType.AssignableToTypeName("System.Data.Objects.DataClasses.EntityObject", out match))
            {
                serializableMembers = serializableMembers.Where(ShouldSerializeEntityMember).ToList();
            }
#endif

            return(serializableMembers);
        }
示例#22
0
        protected virtual JsonObjectContract CreateObjectContract(Type objectType)
        {
            JsonObjectContract jsonObjectContract = new JsonObjectContract(objectType);

            this.InitializeContract((JsonContract)jsonObjectContract);
            bool serializableAttribute = this.IgnoreSerializableAttribute;

            jsonObjectContract.MemberSerialization = JsonTypeReflector.GetObjectMemberSerialization(jsonObjectContract.NonNullableUnderlyingType, serializableAttribute);
            CollectionUtils.AddRange <JsonProperty>((IList <JsonProperty>)jsonObjectContract.Properties, (IEnumerable <JsonProperty>) this.CreateProperties(jsonObjectContract.NonNullableUnderlyingType, jsonObjectContract.MemberSerialization));
            JsonObjectAttribute jsonObjectAttribute = JsonTypeReflector.GetJsonObjectAttribute(jsonObjectContract.NonNullableUnderlyingType);

            if (jsonObjectAttribute != null)
            {
                jsonObjectContract.ItemRequired = jsonObjectAttribute._itemRequired;
            }
            if (Enumerable.Any <ConstructorInfo>((IEnumerable <ConstructorInfo>)jsonObjectContract.NonNullableUnderlyingType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic), (Func <ConstructorInfo, bool>)(c => c.IsDefined(typeof(JsonConstructorAttribute), true))))
            {
                ConstructorInfo attributeConstructor = this.GetAttributeConstructor(jsonObjectContract.NonNullableUnderlyingType);
                if (attributeConstructor != null)
                {
                    jsonObjectContract.OverrideConstructor = attributeConstructor;
                    CollectionUtils.AddRange <JsonProperty>((IList <JsonProperty>)jsonObjectContract.ConstructorParameters, (IEnumerable <JsonProperty>) this.CreateConstructorParameters(attributeConstructor, jsonObjectContract.Properties));
                }
            }
            else if (jsonObjectContract.MemberSerialization == MemberSerialization.Fields)
            {
                if (JsonTypeReflector.FullyTrusted)
                {
                    jsonObjectContract.DefaultCreator = new Func <object>(jsonObjectContract.GetUninitializedObject);
                }
            }
            else if (jsonObjectContract.DefaultCreator == null || jsonObjectContract.DefaultCreatorNonPublic)
            {
                ConstructorInfo parametrizedConstructor = this.GetParametrizedConstructor(jsonObjectContract.NonNullableUnderlyingType);
                if (parametrizedConstructor != null)
                {
                    jsonObjectContract.ParametrizedConstructor = parametrizedConstructor;
                    CollectionUtils.AddRange <JsonProperty>((IList <JsonProperty>)jsonObjectContract.ConstructorParameters, (IEnumerable <JsonProperty>) this.CreateConstructorParameters(parametrizedConstructor, jsonObjectContract.Properties));
                }
            }
            return(jsonObjectContract);
        }
示例#23
0
        public static T GetAttribute <T>(ICustomAttributeProvider attributeProvider) where T : Attribute
        {
            object obj  = (object)attributeProvider;
            Type   type = obj as Type;

            if (type != null)
            {
                return(JsonTypeReflector.GetAttribute <T>(type));
            }
            MemberInfo memberInfo = obj as MemberInfo;

            if (memberInfo != null)
            {
                return(JsonTypeReflector.GetAttribute <T>(memberInfo));
            }
            else
            {
                return(ReflectionUtils.GetAttribute <T>(attributeProvider, true));
            }
        }
示例#24
0
        private static T GetAttribute <T>(MemberInfo memberInfo)
            where T : Attribute
        {
            T    attribute;
            Type associatedMetadataType = JsonTypeReflector.GetAssociatedMetadataType(memberInfo.DeclaringType);

            if (associatedMetadataType != null)
            {
                MemberInfo memberInfoFromType = ReflectionUtils.GetMemberInfoFromType(associatedMetadataType, memberInfo);
                if (memberInfoFromType != null)
                {
                    attribute = ReflectionUtils.GetAttribute <T>(memberInfoFromType, true);
                    if (attribute != null)
                    {
                        return(attribute);
                    }
                }
            }
            attribute = ReflectionUtils.GetAttribute <T>(memberInfo, true);
            if (attribute != null)
            {
                return(attribute);
            }
            if (memberInfo.DeclaringType != null)
            {
                Type[] interfaces = memberInfo.DeclaringType.GetInterfaces();
                for (int i = 0; i < (int)interfaces.Length; i++)
                {
                    MemberInfo memberInfoFromType1 = ReflectionUtils.GetMemberInfoFromType(interfaces[i], memberInfo);
                    if (memberInfoFromType1 != null)
                    {
                        attribute = ReflectionUtils.GetAttribute <T>(memberInfoFromType1, true);
                        if (attribute != null)
                        {
                            return(attribute);
                        }
                    }
                }
            }
            return(default(T));
        }
示例#25
0
        protected virtual List <MemberInfo> GetSerializableMembers(Type objectType)
        {
            bool serializableAttribute = this.IgnoreSerializableAttribute;
            MemberSerialization memberSerialization = JsonTypeReflector.GetObjectMemberSerialization(objectType, serializableAttribute);
            List <MemberInfo>   list1 = Enumerable.ToList <MemberInfo>(Enumerable.Where <MemberInfo>((IEnumerable <MemberInfo>)ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), (Func <MemberInfo, bool>)(m => !ReflectionUtils.IsIndexedProperty(m))));
            List <MemberInfo>   list2 = new List <MemberInfo>();

            if (memberSerialization != MemberSerialization.Fields)
            {
                List <MemberInfo> list3 = Enumerable.ToList <MemberInfo>(Enumerable.Where <MemberInfo>((IEnumerable <MemberInfo>)ReflectionUtils.GetFieldsAndProperties(objectType, this.DefaultMembersSearchFlags), (Func <MemberInfo, bool>)(m => !ReflectionUtils.IsIndexedProperty(m))));
                foreach (MemberInfo memberInfo in list1)
                {
                    if (this.SerializeCompilerGeneratedMembers || !memberInfo.IsDefined(typeof(CompilerGeneratedAttribute), true))
                    {
                        if (list3.Contains(memberInfo))
                        {
                            list2.Add(memberInfo);
                        }
                        else if (JsonTypeReflector.GetAttribute <JsonPropertyAttribute>(ReflectionUtils.GetCustomAttributeProvider((object)memberInfo)) != null)
                        {
                            list2.Add(memberInfo);
                        }
                        else if (memberSerialization == MemberSerialization.Fields && TypeExtensions.MemberType(memberInfo) == MemberTypes.Field)
                        {
                            list2.Add(memberInfo);
                        }
                    }
                }
            }
            else
            {
                foreach (MemberInfo memberInfo in list1)
                {
                    if (TypeExtensions.MemberType(memberInfo) == MemberTypes.Field)
                    {
                        list2.Add(memberInfo);
                    }
                }
            }
            return(list2);
        }
示例#26
0
        private static T GetAttribute <T>(MemberInfo memberInfo) where T : Attribute
        {
            Type associatedMetadataType = JsonTypeReflector.GetAssociatedMetadataType(memberInfo.DeclaringType);

            if (associatedMetadataType != null)
            {
                MemberInfo memberInfoFromType = ReflectionUtils.GetMemberInfoFromType(associatedMetadataType, memberInfo);
                if (memberInfoFromType != null)
                {
                    T attribute = ReflectionUtils.GetAttribute <T>((object)memberInfoFromType, true);
                    if ((object)attribute != null)
                    {
                        return(attribute);
                    }
                }
            }
            T attribute1 = ReflectionUtils.GetAttribute <T>((object)memberInfo, true);

            if ((object)attribute1 != null)
            {
                return(attribute1);
            }
            if (memberInfo.DeclaringType != null)
            {
                foreach (Type targetType in memberInfo.DeclaringType.GetInterfaces())
                {
                    MemberInfo memberInfoFromType = ReflectionUtils.GetMemberInfoFromType(targetType, memberInfo);
                    if (memberInfoFromType != null)
                    {
                        T attribute2 = ReflectionUtils.GetAttribute <T>((object)memberInfoFromType, true);
                        if ((object)attribute2 != null)
                        {
                            return(attribute2);
                        }
                    }
                }
            }
            return(default(T));
        }
示例#27
0
        private void InitializeContract(JsonContract contract)
        {
            JsonContainerAttribute containerAttribute = JsonTypeReflector.GetJsonContainerAttribute(contract.UnderlyingType);

            if (containerAttribute != null)
            {
                contract.IsReference = containerAttribute._isReference;
            }

            contract.Converter = ResolveContractConverter(contract.UnderlyingType);

            // then see whether object is compadible with any of the built in converters
            contract.InternalConverter = JsonSerializer.GetMatchingConverter(BuiltInConverters, contract.UnderlyingType);

            if (ReflectionUtils.HasDefaultConstructor(contract.CreatedType, true) || contract.CreatedType.IsValueType)
            {
                contract.DefaultCreator          = GetDefaultCreator(contract.CreatedType);
                contract.DefaultCreatorNonPublic = (!contract.CreatedType.IsValueType && ReflectionUtils.GetDefaultConstructor(contract.CreatedType) == null);
            }

            ResolveCallbackMethods(contract, contract.UnderlyingType);
        }
示例#28
0
        private JsonMemberMappingCollection CreateMemberMappings(Type objectType)
        {
            MemberSerialization memberSerialization = JsonTypeReflector.GetObjectMemberSerialization(objectType);

            List <MemberInfo> members = GetSerializableMembers(objectType);

            if (members == null)
            {
                throw new JsonSerializationException("Null collection of seralizable members returned.");
            }

            JsonMemberMappingCollection memberMappings = new JsonMemberMappingCollection();

            foreach (MemberInfo member in members)
            {
                JsonMemberMapping memberMapping = CreateMemberMapping(memberSerialization, member);

                memberMappings.AddMapping(memberMapping);
            }

            return(memberMappings);
        }
        private static T GetAttribute <T>(MemberInfo memberInfo) where T : Attribute
        {
            Type associatedMetadataType = JsonTypeReflector.GetAssociatedMetadataType(memberInfo.get_DeclaringType());
            T    attribute;

            if (associatedMetadataType != null)
            {
                MemberInfo memberInfoFromType = ReflectionUtils.GetMemberInfoFromType(associatedMetadataType, memberInfo);
                if (memberInfoFromType != null)
                {
                    attribute = ReflectionUtils.GetAttribute <T>(memberInfoFromType, true);
                    if (attribute != null)
                    {
                        return(attribute);
                    }
                }
            }
            attribute = ReflectionUtils.GetAttribute <T>(memberInfo, true);
            if (attribute != null)
            {
                return(attribute);
            }
            Type[] interfaces = memberInfo.get_DeclaringType().GetInterfaces();
            for (int i = 0; i < interfaces.Length; i++)
            {
                Type       targetType          = interfaces[i];
                MemberInfo memberInfoFromType2 = ReflectionUtils.GetMemberInfoFromType(targetType, memberInfo);
                if (memberInfoFromType2 != null)
                {
                    attribute = ReflectionUtils.GetAttribute <T>(memberInfoFromType2, true);
                    if (attribute != null)
                    {
                        return(attribute);
                    }
                }
            }
            return((T)((object)null));
        }
        protected virtual List <MemberInfo> GetSerializableMembers(Type objectType)
        {
            DataContractAttribute dataContractAttribute = JsonTypeReflector.GetDataContractAttribute(objectType);
            List <MemberInfo>     list = (from m in ReflectionUtils.GetFieldsAndProperties(objectType, this.DefaultMembersSearchFlags)
                                          where !ReflectionUtils.IsIndexedProperty(m)
                                          select m).ToList <MemberInfo>();
            List <MemberInfo> list2 = (from m in ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)
                                       where !ReflectionUtils.IsIndexedProperty(m)
                                       select m).ToList <MemberInfo>();
            List <MemberInfo> list3 = new List <MemberInfo>();

            foreach (MemberInfo memberInfo in list2)
            {
                if (this.SerializeCompilerGeneratedMembers || !memberInfo.IsDefined(typeof(CompilerGeneratedAttribute), true))
                {
                    if (list.Contains(memberInfo))
                    {
                        list3.Add(memberInfo);
                    }
                    else if (JsonTypeReflector.GetAttribute <JsonPropertyAttribute>(memberInfo) != null)
                    {
                        list3.Add(memberInfo);
                    }
                    else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute <DataMemberAttribute>(memberInfo) != null)
                    {
                        list3.Add(memberInfo);
                    }
                }
            }
            Type type;

            if (objectType.AssignableToTypeName("System.Data.Objects.DataClasses.EntityObject", out type))
            {
                list3 = list3.Where(new Func <MemberInfo, bool>(this.ShouldSerializeEntityMember)).ToList <MemberInfo>();
            }
            return(list3);
        }