// Collection member public SerializableMember( XmlNodeType nodeType, XmlNameDeclaration memberName, Int32 order, MemberInfo member, Boolean wrapCollection = true, IEnumerable <XmlArrayItemAttribute> arrayItems = null) { this.MemberName = memberName; this.NodeType = nodeType; this.Order = order; if (member is PropertyInfo) { CreateAccessors((PropertyInfo)member); } else if (member is FieldInfo) { CreateAccessors((FieldInfo)member); } else { throw new ArgumentException("Member type not supported.", "member"); } this.isCollection = true; this.wrapCollection = wrapCollection; this.serializer = this.wrapCollection || arrayItems != null? XmlCollectionSerializer.ForType(this.MemberType, arrayItems : arrayItems) : XmlCollectionSerializer.ForType(this.MemberType, elementName: this.MemberName); this.SelectInitializer(); }
private static SerializableMember Handle <TMember>(TMember member, Type memberType, Boolean includeByDefault) where TMember : MemberInfo { var xmlAttribute = Attribute.GetCustomAttributes(member, inherit: false) .Where(attr => XmlObjectSerializer <T> .SupportedAttributeTypes.Contains(attr.GetType()) || XmlObjectSerializer <T> .UnsupportedAttributeTypes.Contains(attr.GetType())) .SingleOrDefault(); SerializableMember result; if (xmlAttribute == null) { if (includeByDefault) { result = new SerializableMember(XmlNodeType.Element, new XmlNameDeclaration(member.Name), -1, member); } else { // Skip result = null; } } else if (xmlAttribute is XmlElementAttribute) { var elem = (XmlElementAttribute)xmlAttribute; if (XmlCollectionSerializer.IsCollection(memberType) && !typeof(IXmlSerializable).IsAssignableFrom(memberType)) { result = new SerializableMember( XmlNodeType.Element, new XmlNameDeclaration( elem.ElementName.EmptyAsNull() ?? member.Name, elem.Namespace.EmptyAsNull() ), elem.Order, member, // If an XmlElement is specified on a collection type the members of the collection are serialized without a containing element. wrapCollection: false ); } else { result = new SerializableMember( XmlNodeType.Element, new XmlNameDeclaration( elem.ElementName.EmptyAsNull() ?? member.Name, elem.Namespace.EmptyAsNull() ), elem.Order, member ); } } else if (xmlAttribute is XmlAnyElementAttribute) { var elem = (XmlAnyElementAttribute)xmlAttribute; result = new SerializableMember( XmlNodeType.Element, elem.Order, member ); } else if (xmlAttribute is XmlArrayAttribute) { if (!XmlCollectionSerializer.IsCollection(memberType)) { throw new InvalidOperationException( String.Format( "The XmlArrayAttribute was used on a member of type '{0}' which does not implement ICollection<>.", memberType.FullName ) ); } var array = (XmlArrayAttribute)xmlAttribute; var arrayItems = member.GetCustomAttributes <XmlArrayItemAttribute>().EmptyAsNull(); result = new SerializableMember( XmlNodeType.Element, new XmlNameDeclaration( array.ElementName.EmptyAsNull() ?? member.Name, array.Namespace.EmptyAsNull() ), array.Order, member, arrayItems: arrayItems ); } else if (xmlAttribute is XmlAttributeAttribute) { var attr = (XmlAttributeAttribute)xmlAttribute; // Attribute children do not inherit the namespace of their parent. result = new SerializableMember( XmlNodeType.Attribute, new XmlNameDeclaration( attr.AttributeName.EmptyAsNull() ?? member.Name, attr.Namespace.EmptyAsNull() ), -1, member ); } else if (xmlAttribute is XmlAnyAttributeAttribute) { result = new SerializableMember( XmlNodeType.Attribute, -1, member ); } else if (xmlAttribute is XmlTextAttribute) { // var txt = (XmlTextAttribute)xmlAttribute; // TODO: support DataType/Type/TypeId parameters result = new SerializableMember(XmlNodeType.Text, null, -1, member); } else if (xmlAttribute is XmlIgnoreAttribute) { // Skip result = null; } else { throw new NotSupportedException( String.Format( "The XML serialization attribute '{0}' is not yet supported", xmlAttribute.GetType().Name ) ); } return(result); }