public object ReadXml(XmlReader reader, XmlSerializationContext context) { if (context.Member.MappingType != XmlMappingType.Element) { throw new XmlSerializationException(string.Format("XML mapping of \"{0}\" must be Element.", context.ValueType)); } var contract = context.Contract.ToObjectContract(); var target = CreateTarget(contract); var propertyInfos = XmlPropertyInfo.GetInfo(contract, reader.NameTable, context); if (reader.MoveToFirstAttribute()) { do { ReadProperty(reader, target, propertyInfos, XmlMappingType.Attribute, context); }while (reader.MoveToNextAttribute()); reader.MoveToElement(); } if (!reader.IsEmptyElement) { if (contract.InnerTextProperty != null) { var value = context.Deserialize(reader, contract.InnerTextProperty); SetValue(target, contract.InnerTextProperty, value); } else { reader.ReadStartElement(); while (reader.NodeType != XmlNodeType.EndElement) { if (reader.NodeType == XmlNodeType.Element) { ReadProperty(reader, target, propertyInfos, XmlMappingType.Element, context); } else { reader.Read(); } } reader.Read(); } } else { reader.Read(); } SetDefaultProperties(contract, target, propertyInfos); return(GetResult(target)); }