Beispiel #1
0
        private void SerializeSimpleObject(
            object currentObject,
            long currentObjectId)
        {
            Type currentType = currentObject.GetType();

            // Value type have to be serialized "on the fly" so
            // SerializeComponent calls SerializeObject when
            // a field of another object is a struct. A node with the field
            // name has already be written so WriteStartElement must not be called
            // again. Fields that are structs are passed to SerializeObject
            // with a id = 0
            if (currentObjectId > 0)
            {
                Element element = _mapper.GetXmlElement(currentType);
                _xmlWriter.WriteStartElement(element.Prefix, element.LocalName, element.NamespaceURI);
                Id(currentObjectId);
            }

            if (currentType == typeof(TimeSpan))
            {
                _xmlWriter.WriteString(SoapTypeMapper.GetXsdValue(currentObject));
            }
            else if (currentType == typeof(string))
            {
                _xmlWriter.WriteString(currentObject.ToString());
            }
            else
            {
                MemberInfo[] memberInfos = FormatterServices.GetSerializableMembers(currentType, _context);
                object[]     objectData  = FormatterServices.GetObjectData(currentObject, memberInfos);

#if FIXED
                for (int i = 0; i < memberInfos.Length; i++)
                {
                    FieldInfo          fieldInfo = (FieldInfo)memberInfos[i];
                    SoapFieldAttribute at        = (SoapFieldAttribute)InternalRemotingServices.GetCachedSoapAttribute(fieldInfo);
                    _xmlWriter.WriteStartElement(XmlConvert.EncodeLocalName(at.XmlElementName));
                    SerializeComponent(
                        objectData[i],
                        IsEncodingNeeded(objectData[i], fieldInfo.FieldType));
                    _xmlWriter.WriteEndElement();
                }
#endif
            }
            if (currentObjectId > 0)
            {
                _xmlWriter.WriteFullEndElement();
            }
        }
		public object Deserialize(Stream inStream, ISoapMessage soapMessage) 
		{
			ArrayList headers = null;
			xmlReader = new XmlTextReader(inStream);
			xmlReader.WhitespaceHandling = WhitespaceHandling.None;
			mapper = new SoapTypeMapper(_binder);

			try
			{
				// SOAP-ENV:Envelope
				xmlReader.MoveToContent();
				xmlReader.ReadStartElement ();
				xmlReader.MoveToContent();
				
				// Read headers
				while (!(xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Body" && xmlReader.NamespaceURI == SoapTypeMapper.SoapEnvelopeNamespace))
				{
					if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Header" && xmlReader.NamespaceURI == SoapTypeMapper.SoapEnvelopeNamespace)
					{
						if (headers == null) headers = new ArrayList ();
						DeserializeHeaders (headers);
					}
					else
						xmlReader.Skip ();
					xmlReader.MoveToContent();
				}
				
				// SOAP-ENV:Body
				xmlReader.ReadStartElement();
				xmlReader.MoveToContent();

				// The root object
				if (soapMessage != null)
				{
					if (DeserializeMessage (soapMessage)) {
						_topObjectId = NextAvailableId;
						RegisterObject (_topObjectId, soapMessage, null, 0, null, null);
					}
					xmlReader.MoveToContent();
					
					if (headers != null)
						soapMessage.Headers = (Header[]) headers.ToArray (typeof(Header));
				}
				
				while (xmlReader.NodeType != XmlNodeType.EndElement)
					Deserialize();
					
				// SOAP-ENV:Body
				xmlReader.ReadEndElement ();
				xmlReader.MoveToContent();

				// SOAP-ENV:Envelope
				xmlReader.ReadEndElement ();
			}
			finally 
			{
				if(xmlReader != null) xmlReader.Close();
			}

			return TopObject;
		}
Beispiel #3
0
        void Deserialize_inner(Stream inStream, ISoapMessage soapMessage)
        {
            ArrayList headers = null;

            xmlReader = new XmlTextReader(inStream);
            xmlReader.WhitespaceHandling = WhitespaceHandling.None;
            mapper = new SoapTypeMapper(_binder);

            try
            {
                // SOAP-ENV:Envelope
                xmlReader.MoveToContent();
                xmlReader.ReadStartElement();
                xmlReader.MoveToContent();

                // Read headers
                while (!(xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Body" && xmlReader.NamespaceURI == SoapTypeMapper.SoapEnvelopeNamespace))
                {
                    if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.LocalName == "Header" && xmlReader.NamespaceURI == SoapTypeMapper.SoapEnvelopeNamespace)
                    {
                        if (headers == null)
                        {
                            headers = new ArrayList();
                        }
                        DeserializeHeaders(headers);
                    }
                    else
                    {
                        xmlReader.Skip();
                    }
                    xmlReader.MoveToContent();
                }

                // SOAP-ENV:Body
                xmlReader.ReadStartElement();
                xmlReader.MoveToContent();

                // The root object
                if (soapMessage != null)
                {
                    if (DeserializeMessage(soapMessage))
                    {
                        _topObjectId = NextAvailableId;
                        RegisterObject(_topObjectId, soapMessage, null, 0, null, null);
                    }
                    xmlReader.MoveToContent();

                    if (headers != null)
                    {
                        soapMessage.Headers = (Header[])headers.ToArray(typeof(Header));
                    }
                }

                while (xmlReader.NodeType != XmlNodeType.EndElement)
                {
                    Deserialize();
                }

                // SOAP-ENV:Body
                xmlReader.ReadEndElement();
                xmlReader.MoveToContent();

                // SOAP-ENV:Envelope
                xmlReader.ReadEndElement();
            }
            finally
            {
                if (xmlReader != null)
                {
                    xmlReader.Close();
                }
            }
        }
Beispiel #4
0
        void Serialize_inner(object objGraph, Header[] headers, FormatterTypeStyle typeFormat, FormatterAssemblyStyle assemblyFormat)
        {
            _typeFormat     = typeFormat;
            _assemblyFormat = assemblyFormat;
            // Create the XmlDocument with the
            // Envelope and Body elements
            _mapper = new SoapTypeMapper(_xmlWriter, assemblyFormat, typeFormat);

            // The root element
            _xmlWriter.WriteStartElement(
                SoapTypeMapper.SoapEnvelopePrefix,
                "Envelope",
                SoapTypeMapper.SoapEnvelopeNamespace);

            // adding namespaces
            _xmlWriter.WriteAttributeString(
                "xmlns",
                "xsi",
                "http://www.w3.org/2000/xmlns/",
                "http://www.w3.org/2001/XMLSchema-instance");

            _xmlWriter.WriteAttributeString(
                "xmlns",
                "xsd",
                "http://www.w3.org/2000/xmlns/",
                XmlSchema.Namespace);

            _xmlWriter.WriteAttributeString(
                "xmlns",
                SoapTypeMapper.SoapEncodingPrefix,
                "http://www.w3.org/2000/xmlns/",
                SoapTypeMapper.SoapEncodingNamespace);

            _xmlWriter.WriteAttributeString(
                "xmlns",
                SoapTypeMapper.SoapEnvelopePrefix,
                "http://www.w3.org/2000/xmlns/",
                SoapTypeMapper.SoapEnvelopeNamespace);

            _xmlWriter.WriteAttributeString(
                "xmlns",
                "clr",
                "http://www.w3.org/2000/xmlns/",
                SoapServices.XmlNsForClrType);

            _xmlWriter.WriteAttributeString(
                SoapTypeMapper.SoapEnvelopePrefix,
                "encodingStyle",
                SoapTypeMapper.SoapEnvelopeNamespace,
                "http://schemas.xmlsoap.org/soap/encoding/");

            ISoapMessage msg = objGraph as ISoapMessage;

            if (msg != null)
            {
                headers = msg.Headers;
            }

            if (headers != null && headers.Length > 0)
            {
                _xmlWriter.WriteStartElement(SoapTypeMapper.SoapEnvelopePrefix, "Header", SoapTypeMapper.SoapEnvelopeNamespace);
                foreach (Header h in headers)
                {
                    SerializeHeader(h);
                }

                WriteObjectQueue();
                _xmlWriter.WriteEndElement();
            }

            // The body element
            _xmlWriter.WriteStartElement(
                SoapTypeMapper.SoapEnvelopePrefix,
                "Body",
                SoapTypeMapper.SoapEnvelopeNamespace);


            bool firstTime = false;

            if (msg != null)
            {
                SerializeMessage(msg);
            }
            else
            {
                _objectQueue.Enqueue(new EnqueuedObject(objGraph, idGen.GetId(objGraph, out firstTime)));
            }

            WriteObjectQueue();

            _xmlWriter.WriteFullEndElement();             // the body element
            _xmlWriter.WriteFullEndElement();             // the envelope element
            _xmlWriter.Flush();
        }
Beispiel #5
0
		void Serialize_inner (object objGraph, Header[] headers, FormatterTypeStyle typeFormat, FormatterAssemblyStyle assemblyFormat)
		{
			_typeFormat = typeFormat;
			_assemblyFormat = assemblyFormat;
			// Create the XmlDocument with the 
			// Envelope and Body elements
			_mapper = new SoapTypeMapper(_xmlWriter, assemblyFormat, typeFormat);

			// The root element
			_xmlWriter.WriteStartElement(
				SoapTypeMapper.SoapEnvelopePrefix, 
				"Envelope",
				SoapTypeMapper.SoapEnvelopeNamespace);

			// adding namespaces
			_xmlWriter.WriteAttributeString(
				"xmlns",
				"xsi",
				"http://www.w3.org/2000/xmlns/",
				"http://www.w3.org/2001/XMLSchema-instance");

			_xmlWriter.WriteAttributeString(
				"xmlns",
				"xsd",
				"http://www.w3.org/2000/xmlns/",
				XmlSchema.Namespace);

			_xmlWriter.WriteAttributeString(
				"xmlns",
				SoapTypeMapper.SoapEncodingPrefix,
				"http://www.w3.org/2000/xmlns/",
				SoapTypeMapper.SoapEncodingNamespace);

			_xmlWriter.WriteAttributeString(
				"xmlns",
				SoapTypeMapper.SoapEnvelopePrefix,
				"http://www.w3.org/2000/xmlns/",
				SoapTypeMapper.SoapEnvelopeNamespace);

			_xmlWriter.WriteAttributeString(
				"xmlns",
				"clr",
				"http://www.w3.org/2000/xmlns/",
				SoapServices.XmlNsForClrType);

			_xmlWriter.WriteAttributeString(
				SoapTypeMapper.SoapEnvelopePrefix,
				"encodingStyle",
				SoapTypeMapper.SoapEnvelopeNamespace,
				"http://schemas.xmlsoap.org/soap/encoding/");
						
			ISoapMessage msg = objGraph as ISoapMessage;
			if (msg != null)
				headers = msg.Headers;
			
			if (headers != null && headers.Length > 0)
			{
				_xmlWriter.WriteStartElement (SoapTypeMapper.SoapEnvelopePrefix, "Header", SoapTypeMapper.SoapEnvelopeNamespace);
				foreach (Header h in headers)
					SerializeHeader (h);
					
				WriteObjectQueue ();
				_xmlWriter.WriteEndElement ();
			}
				
			// The body element
			_xmlWriter.WriteStartElement(
				SoapTypeMapper.SoapEnvelopePrefix,
				"Body",
				SoapTypeMapper.SoapEnvelopeNamespace);


			bool firstTime = false;

			if (msg != null)
				SerializeMessage(msg);
			else
				_objectQueue.Enqueue(new EnqueuedObject( objGraph, idGen.GetId(objGraph, out firstTime)));

			WriteObjectQueue ();

			_xmlWriter.WriteFullEndElement(); // the body element
			_xmlWriter.WriteFullEndElement(); // the envelope element
			_xmlWriter.Flush();
		}