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