object DeserializeByMap(QName name, Type type, XmlReader reader) { SerializationMap map = null; // List<T> and T[] have the same QName, use type to find map work better. if (name.Name.StartsWith("ArrayOf", StringComparison.Ordinal) || resolved_qnames.ContainsKey(name)) { map = types.FindUserMap(type); } else { map = types.FindUserMap(name); // use type when the name is "resolved" one. Otherwise use name (there are cases that type cannot be resolved by type). } if (map == null && (name.Name.StartsWith("ArrayOf", StringComparison.Ordinal) || name.Namespace == KnownTypeCollection.MSArraysNamespace || name.Namespace.StartsWith(KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal))) { var it = GetTypeFromNamePair(name.Name, name.Namespace); types.Add(it); map = types.FindUserMap(name); } if (map == null) { throw new SerializationException(String.Format("Unknown type {0} is used for DataContract with reference of name {1}. Any derived types of a data contract or a data member should be added to KnownTypes.", type, name)); } return(map.DeserializeObject(reader, this)); }
object DeserializeByMap(QName name, Type type, XmlReader reader) { SerializationMap map = types.FindUserMap(name); if (map == null && (name.Namespace == KnownTypeCollection.MSArraysNamespace || name.Namespace.StartsWith(KnownTypeCollection.DefaultClrNamespaceBase, StringComparison.Ordinal))) { var it = GetTypeFromNamePair(name.Name, name.Namespace); types.TryRegister(it); map = types.FindUserMap(name); } if (map == null) { throw new SerializationException(String.Format("Unknown type {0} is used for DataContract with reference of name {1}. Any derived types of a data contract or a data member should be added to KnownTypes.", type, name)); } return(map.DeserializeObject(reader, this)); }