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