示例#1
0
            // 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();
            }
示例#2
0
        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);
        }