/// <summary> /// This method returns a series of values that will not be serialized for a field or a property. When the value of the member matches those values, it will not be serialized. If all values can be serialized, null should be returned. The value can be set via <see cref="System.ComponentModel.DefaultValueAttribute"/>. /// </summary> /// <param name="member">The <see cref="MemberInfo"/> of the field or property.</param> /// <returns>The values which are not serialized for <paramref name="member"/>.</returns> public override IEnumerable GetNonSerializedValues(MemberInfo member) { var a = AttributeHelper.GetAttribute <System.ComponentModel.DefaultValueAttribute> (member, true); var n = AttributeHelper.GetAttributes <JsonNonSerializedValueAttribute> (member, true); if (a == null && n.Length == 0) { return(null); } var v = new List <object> (); if (a != null) { v.Add(a.Value); } foreach (var item in n) { v.Add(item.Value); } return(v); }
/// <summary> /// This method returns possible names for corresponding types of a field or a property. This enables polymorphic serialization and deserialization for abstract classes, interfaces, or object types, with predetermined concrete types. If polymorphic serialization is not used, null or an empty <see cref="SerializedNames"/> could be returned. The names can be set via <see cref="JsonFieldAttribute"/>. /// </summary> /// <param name="member">The <see cref="MemberInfo"/> of the field or property.</param> /// <returns>The dictionary contains types and their corresponding names.</returns> /// <exception cref="InvalidCastException">The <see cref="JsonFieldAttribute.DataType"/> type does not derive from the member type.</exception> public override SerializedNames GetSerializedNames(MemberInfo member) { var tn = new SerializedNames(); var jf = AttributeHelper.GetAttributes <JsonFieldAttribute> (member, true); var f = member as FieldInfo; var p = member as PropertyInfo; var t = p != null ? p.PropertyType : f.FieldType; foreach (var item in jf) { if (String.IsNullOrEmpty(item.Name)) { continue; } if (item.DataType == null) { tn.DefaultName = item.Name; } else { if (t.IsAssignableFrom(item.DataType) == false) { throw new InvalidCastException("The override type (" + item.DataType.FullName + ") does not derive from the member type (" + t.FullName + ")"); } tn.Add(item.DataType, item.Name); } } #if NET_40_OR_GREATER if (UseDataContractAttributes && jf.Length == 0) { var m = AttributeHelper.GetAttribute <DataMemberAttribute> (member, true); if (m != null && String.IsNullOrEmpty(m.Name) == false) { tn.DefaultName = m.Name; } } #endif if (UseXmlSerializationAttributes) { var ar = AttributeHelper.GetAttribute <XmlArrayAttribute> (member, true); if (ar != null) { tn.DefaultName = ar.ElementName; } foreach (var item in AttributeHelper.GetAttributes <XmlElementAttribute> (member, true)) { if (String.IsNullOrEmpty(item.ElementName)) { continue; } if (item.DataType == null) { tn.DefaultName = item.ElementName; } else { if (t.IsAssignableFrom(item.Type) == false) { throw new InvalidCastException("The override type (" + item.Type.FullName + ") does not derive from the member type (" + t.FullName + ")"); } tn.Add(item.Type, item.ElementName); } } var an = AttributeHelper.GetAttribute <XmlAttributeAttribute> (member, true); if (an != null) { tn.DefaultName = an.AttributeName; } } return(tn); }