Beispiel #1
0
        public object DeserializeInputParameter(
            System.Xml.XmlDictionaryReader xmlReader,
            Type parameterType,
            string parameterName,
            string parameterNs,
            SoapMethodParameterInfo parameterInfo = null,
            IEnumerable <Type> knownTypes         = null)
        {
            if (xmlReader.IsStartElement(parameterName, parameterNs))
            {
                xmlReader.MoveToStartElement(parameterName, parameterNs);

                if (xmlReader.IsStartElement(parameterName, parameterNs))
                {
                    switch (_serializer)
                    {
                    case SoapSerializer.XmlSerializer:
                        if (!parameterType.IsArray || (parameterInfo != null && parameterInfo.ArrayName != null && parameterInfo.ArrayItemName == null))
                        {
                            // case [XmlElement("parameter")] int parameter
                            // case int[] parameter
                            // case [XmlArray("parameter")] int[] parameter
                            return(DeserializeObject(xmlReader, parameterType, parameterName, parameterNs));
                        }
                        else
                        {
                            // case [XmlElement("parameter")] int[] parameter
                            // case [XmlArray("parameter"), XmlArrayItem(ElementName = "item")] int[] parameter
                            return(DeserializeArray(xmlReader, parameterType, parameterName, parameterNs, parameterInfo));
                        }

                    case SoapSerializer.DataContractSerializer:
                        return(DeserializeDataContract(xmlReader, parameterType, parameterName, parameterNs, knownTypes));

                    default:
                        throw new NotImplementedException();
                    }
                }
            }

            return(null);
        }
        private object DeserializeArray(System.Xml.XmlDictionaryReader xmlReader, Type parameterType, string parameterName, string parameterNs, SoapMethodParameterInfo parameterInfo)
        {
            //if (parameterInfo.ArrayItemName != null)
            {
                xmlReader.ReadStartElement(parameterName, parameterNs);
            }

            var elementType = parameterType.GetElementType();

            var localName = parameterInfo.ArrayItemName ?? elementType.Name;

            if (parameterInfo.ArrayItemName == null && elementType.Namespace.StartsWith("System"))
            {
                var compiler = new CSharpCodeProvider();
                var type     = new CodeTypeReference(elementType);
                localName = compiler.GetTypeOutput(type);
            }

            //localName = "ComplexModelInput";
            var deserializeMethod = typeof(XmlSerializerExtensions).GetGenericMethod(nameof(XmlSerializerExtensions.DeserializeArray), new[] { elementType });
            var serializer        = CachedXmlSerializer.GetXmlSerializer(elementType, localName, parameterNs);

            object result = null;

            lock (serializer)
            {
                result = deserializeMethod.Invoke(null, new object[] { serializer, localName, parameterNs, xmlReader });
            }

            //if (parameterInfo.ArrayItemName != null)
            {
                xmlReader.ReadEndElement();
            }

            return(result);
        }