Exemplo n.º 1
0
        private MemberMappingCollection CreateMemberMappings(Type objectType)
        {
            MemberInfo[]            members        = ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Public | BindingFlags.Instance);
            MemberMappingCollection memberMappings = new MemberMappingCollection();

            foreach (MemberInfo member in members)
            {
                string mappedName;

                JsonPropertyAttribute propertyAttribute = ReflectionUtils.GetAttribute(typeof(JsonPropertyAttribute), member, true) as JsonPropertyAttribute;
                if (propertyAttribute != null)
                {
                    mappedName = propertyAttribute.PropertyName;
                }
                else
                {
                    mappedName = member.Name;
                }

                bool          ignored       = member.IsDefined(typeof(JsonIgnoreAttribute), true);
                bool          readable      = ReflectionUtils.CanReadMemberValue(member);
                bool          writable      = ReflectionUtils.CanSetMemberValue(member);
                MemberMapping memberMapping = new MemberMapping(mappedName, member, ignored, readable, writable);

                memberMappings.Add(memberMapping);
            }

            return(memberMappings);
        }
Exemplo n.º 2
0
        private void SerializeObject(JsonWriter writer, object value)
        {
            Type objectType = value.GetType();

            TypeConverter converter = TypeDescriptor.GetConverter(objectType);

            // use the objectType's TypeConverter if it has one and can convert to a string
            if (converter != null && !(converter is ComponentConverter) && converter.GetType() != typeof(TypeConverter))
            {
                if (converter.CanConvertTo(typeof(string)))
                {
                    writer.WriteValue(converter.ConvertToInvariantString(value));
                    return;
                }
            }

            writer.SerializeStack.Add(value);

            writer.WriteStartObject();

            MemberMappingCollection memberMappings = GetMemberMappings(objectType);

            foreach (MemberMapping memberMapping in memberMappings)
            {
                if (!memberMapping.Ignored && memberMapping.Readable)
                {
                    WriteMemberInfoProperty(writer, value, memberMapping.Member, memberMapping.MappingName);
                }
            }

            writer.WriteEndObject();

            writer.SerializeStack.Remove(value);
        }
Exemplo n.º 3
0
        private void SetObjectMember(JsonReader reader, object target, Type targetType, string memberName)
        {
            Type   memberUnderlyingType;
            object obj2;

            if (!reader.Read())
            {
                throw new JsonSerializationException(string.Format("Unexpected end when setting {0}'s value.", memberName));
            }
            MemberMappingCollection memberMappings = this.GetMemberMappings(targetType);

            if (memberMappings.Contains(memberName))
            {
                MemberMapping mapping = memberMappings[memberName];
                if (!mapping.Ignored && mapping.Writable)
                {
                    memberUnderlyingType = ReflectionUtils.GetMemberUnderlyingType(mapping.Member);
                    obj2 = this.GetObject(reader, memberUnderlyingType);
                    ReflectionUtils.SetMemberValue(mapping.Member, target, obj2);
                }
            }
            else if (typeof(IDictionary).IsAssignableFrom(targetType))
            {
                memberUnderlyingType = ReflectionUtils.GetDictionaryValueType(target.GetType());
                obj2 = this.GetObject(reader, memberUnderlyingType);
                ((IDictionary)target).Add(memberName, obj2);
            }
            else if (memberName != "__type")
            {
                throw new JsonSerializationException(string.Format("Could not find member '{0}' on object of type '{1}'", memberName, targetType.GetType().Name));
            }
        }
Exemplo n.º 4
0
        private void SerializeObject(JsonWriter writer, object value)
        {
            Type          type      = value.GetType();
            TypeConverter converter = TypeDescriptor.GetConverter(type);

            if ((((converter != null) && !(converter is ComponentConverter)) && (converter.GetType() != typeof(TypeConverter))) && converter.CanConvertTo(typeof(string)))
            {
                writer.WriteValue(converter.ConvertToInvariantString(value));
            }
            else
            {
                writer.SerializeStack.Add(value);
                writer.WriteStartObject();
                MemberMappingCollection memberMappings = this.GetMemberMappings(type);
                foreach (MemberMapping mapping in memberMappings)
                {
                    if (!(mapping.Ignored || !mapping.Readable))
                    {
                        this.WriteMemberInfoProperty(writer, value, mapping.Member, mapping.MappingName);
                    }
                }
                writer.WriteEndObject();
                writer.SerializeStack.Remove(value);
            }
        }
Exemplo n.º 5
0
        private void SetObjectMember(JsonReader reader, object target, Type targetType, string memberName)
        {
            if (!reader.Read())
            {
                throw new JsonSerializationException(string.Format("Unexpected end when setting {0}'s value.", memberName));
            }

            MemberMappingCollection memberMappings = GetMemberMappings(targetType);
            Type   memberType;
            object value;

            // test if a member with memberName exists on the type
            // otherwise test if target is a dictionary and assign value with the key if it is
            if (memberMappings.Contains(memberName))
            {
                MemberMapping memberMapping = memberMappings[memberName];

                if (memberMapping.Ignored)
                {
                    return;
                }

                // ignore member if it is readonly
                if (!memberMapping.Writable)
                {
                    return;
                }

                // get the member's underlying type
                memberType = ReflectionUtils.GetMemberUnderlyingType(memberMapping.Member);

                value = GetObject(reader, memberType);

                ReflectionUtils.SetMemberValue(memberMapping.Member, target, value);
            }
            else if (typeof(IDictionary).IsAssignableFrom(targetType))
            {
                // attempt to get the IDictionary's type
                memberType = ReflectionUtils.GetDictionaryValueType(target.GetType());

                value = GetObject(reader, memberType);

                ((IDictionary)target).Add(memberName, value);
            }
            else
            {
                if (memberName != "__type")
                {
                    throw new JsonSerializationException(string.Format("Could not find member '{0}' on object of type '{1}'", memberName, targetType.GetType().Name));
                }
            }
        }
Exemplo n.º 6
0
        private MemberMappingCollection GetMemberMappings(Type objectType)
        {
            if (this._typeMemberMappings == null)
            {
                this._typeMemberMappings = new Hashtable();
            }
            if (this._typeMemberMappings.Contains(objectType))
            {
                return(this._typeMemberMappings[objectType] as MemberMappingCollection);
            }
            MemberMappingCollection mappings = this.CreateMemberMappings(objectType);

            this._typeMemberMappings[objectType] = mappings;
            return(mappings);
        }
Exemplo n.º 7
0
		private MemberMappingCollection CreateMemberMappings(Type objectType)
		{
			MemberInfo[] members = ReflectionUtils.GetFieldsAndProperties(objectType, BindingFlags.Public | BindingFlags.Instance);
			MemberMappingCollection memberMappings = new MemberMappingCollection();

			foreach (MemberInfo member in members)
			{
				string mappedName;

				JsonPropertyAttribute propertyAttribute = ReflectionUtils.GetAttribute(typeof(JsonPropertyAttribute), member, true) as JsonPropertyAttribute;
				if (propertyAttribute != null)
					mappedName = propertyAttribute.PropertyName;
				else
					mappedName = member.Name;

				bool ignored = member.IsDefined(typeof (JsonIgnoreAttribute), true);
				bool readable = ReflectionUtils.CanReadMemberValue(member);
				bool writable = ReflectionUtils.CanSetMemberValue(member);
				MemberMapping memberMapping = new MemberMapping(mappedName, member, ignored, readable, writable);

				memberMappings.Add(memberMapping);
			}

			return memberMappings;
		}