private void WriteArrayContent(XmlWriter writer, object array, ArrayMapping mapping, MemberMapping member, int nestingLevel, string ns) { Dictionary <string, Type> elementTypes = mapping.ElementTypes; foreach (object item in (IEnumerable)array) { string text = null; bool flag = false; if (member != null && member.XmlAttributes.XmlArrayItems.Count > nestingLevel) { XmlArrayItemAttribute xmlArrayItemAttribute = member.XmlAttributes.XmlArrayItems[nestingLevel]; text = xmlArrayItemAttribute.ElementName; flag = xmlArrayItemAttribute.IsNullable; } else { Type serializationType = base.GetSerializationType(item); TypeMapping typeMapping = TypeMapper.GetTypeMapping(serializationType); if (typeMapping != null) { text = typeMapping.Name; ns = typeMapping.Namespace; } else { foreach (KeyValuePair <string, Type> item2 in elementTypes) { if (item2.Value == serializationType) { text = item2.Key; break; } } } } if (text == null) { throw new Exception("No array element name."); } if (item != null) { this.WriteObject(writer, item, text, ns, member, nestingLevel + 1); } else if (flag) { this.WriteNilElement(writer, text, ns); } } }
private static ArrayMapping ImportArrayMapping(Type type) { ArrayMapping arrayMapping = new ArrayMapping(type); arrayMapping.ElementTypes = new Dictionary <string, Type>(); if (type.IsArray) { Type type2 = arrayMapping.ItemType = type.GetElementType(); arrayMapping.ElementTypes.Add(type2.Name, type2); } else { TypeMapper.GetCollectionElementTypes(type, arrayMapping); } return(arrayMapping); }
private object ReadArrayContent(object array, ArrayMapping mapping, MemberMapping member, int nestingLevel) { IList list = (IList)array; if (this.m_reader.IsEmptyElement) { this.m_reader.Skip(); } else { this.m_reader.ReadStartElement(); this.m_reader.MoveToContent(); while (this.m_reader.NodeType != XmlNodeType.EndElement && this.m_reader.NodeType != 0) { if (this.m_reader.NodeType == XmlNodeType.Element) { string localName = this.m_reader.LocalName; string namespaceURI = this.m_reader.NamespaceURI; Type type = null; bool flag = false; if (member != null && member.XmlAttributes.XmlArrayItems.Count > nestingLevel) { if (localName == member.XmlAttributes.XmlArrayItems[nestingLevel].ElementName) { XmlArrayItemAttribute xmlArrayItemAttribute = member.XmlAttributes.XmlArrayItems[nestingLevel]; type = xmlArrayItemAttribute.Type; flag = xmlArrayItemAttribute.IsNullable; } } else { XmlElementAttributes xmlElementAttributes = null; if (base.XmlOverrides != null) { XmlAttributes xmlAttributes = base.XmlOverrides[mapping.ItemType]; if (xmlAttributes != null && xmlAttributes.XmlElements != null) { xmlElementAttributes = xmlAttributes.XmlElements; } } if (xmlElementAttributes == null) { mapping.ElementTypes.TryGetValue(localName, out type); } else { foreach (XmlElementAttribute item in xmlElementAttributes) { if (localName == item.ElementName) { type = item.Type; break; } } } } if (type != null) { object value; if (flag && this.m_reader.GetAttribute("nil", "http://www.w3.org/2001/XMLSchema-instance") == "true") { this.m_reader.Skip(); value = null; } else { value = this.ReadObject(type, member, nestingLevel + 1); } list.Add(value); } else { this.m_reader.Skip(); } } else { this.m_reader.Skip(); } this.m_reader.MoveToContent(); } this.m_reader.ReadEndElement(); } return(array); }
private void WriteArray(XmlWriter writer, object component, object array, string name, string ns, MemberMapping member, ArrayMapping mapping, int nestingLevel) { if (this.ShouldSerializeArray(array)) { this.WriteStartElement(writer, component, name, ns, member); this.WriteArrayContent(writer, array, mapping, member, nestingLevel, ns); writer.WriteEndElement(); } }