private object ReadObject(Type type, XElement element) { if (type == null) { throw new ArgumentNullException("type"); } element = ApplyMessageDeserializationBehaviorIfNecessary(type, element); if (HaveCustomValueConvertor(type)) { var convertorType = reflection.GetGenericTypeOf(typeof(IValueConvertor <>), type); var convertor = serviceLocator.Resolve(convertorType); return(reflection.InvokeFromElement(convertor, element)); } if (HaveCustomSerializer(type)) { var customSerializer = customElementSerializers.First(s => s.CanSerialize(type)); return(customSerializer.FromElement(type, element)); } if (type == typeof(byte[])) { return(Convert.FromBase64String(element.Value)); } if (CanParseFromString(type)) { return(FromString(type, element.Value)); } if (ShouldTreatAsDictionary(type)) { return(ReadDictionary(type, element)); } if (typeof(IEnumerable).IsAssignableFrom(type)) { return(ReadList(type, element)); } object instance = reflection.CreateInstance(type); foreach (var prop in element.Elements()) { var property = prop; reflection.Set(instance, prop.Name.LocalName, typeFromProperty => { var propType = reflection.GetTypeFromXmlNamespace(property.Name.NamespaceName); return(ReadObject(propType ?? typeFromProperty, property)); }); } return(instance); }