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; }
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(); } } }
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(); }
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(); }