/// <summary>
 /// Helper method to be used within the <see cref="SoapSerializeValue"/> method to write a <c>null</c> value
 /// into a SOAP serialization.
 /// </summary>
 /// <param name="writer">XML writer which is positioned at the starting tag of the XML element enclosing the value.</param>
 protected void SoapWriteNull(XmlWriter writer)
 {
     SoapHelper.WriteNull(writer);
 }
        /// <summary>
        /// Serializes the given <paramref name="value"/> as contents of the current element in the
        /// given XML <paramref name="writer"/> in the formatting rules given by this data type.
        /// </summary>
        /// <param name="value">Value to serialize. The value must be of this data type.</param>
        /// <param name="writer">XML writer where the value will be serialized to. The value will be serialized as
        /// contents of the writer's current element.
        /// The writer's position is the start of the parent element, the result should go. The caller will write the end
        /// element tag.</param>
        public void SoapSerializeValue(object value, XmlWriter writer)
        {
            if (value == null)
            {
                SoapHelper.WriteNull(writer);
                return;
            }
            switch (_upnpTypeName)
            {
            case "ui1":
            case "ui2":
            case "ui4":
            case "ui8":
            case "i1":
            case "i2":
            case "i4":
            case "i8":
            case "int":
                writer.WriteString(value.ToString());
                break;

            case "r4":
            case "r8":
            case "number":
            case "float":
                writer.WriteString(((Double)value).ToString("E", CultureInfo.InvariantCulture));
                break;

            case "fixed.14.4":
                writer.WriteString(((Double)value).ToString("0.##############E+0", CultureInfo.InvariantCulture));
                break;

            case "char":
            case "string":
            case "uuid":
                writer.WriteString(value.ToString());
                break;

            case "date":
                writer.WriteString(((DateTime)value).ToString("yyyy-MM-dd"));
                break;

            case "dateTime":
                writer.WriteString(((DateTime)value).ToString("s"));
                break;

            case "dateTime.tz":
                writer.WriteString(((DateTime)value).ToUniversalTime().ToString("u"));
                break;

            case "time":
                writer.WriteString(((DateTime)value).ToString("T"));
                break;

            case "time.tz":
                writer.WriteString(((DateTime)value).ToUniversalTime().ToString("hh:mm:ss"));
                break;

            case "boolean":
                writer.WriteValue((bool)value);
                break;

            case "bin.base64":
                writer.WriteValue(value);
                break;

            case "bin.hex":
                writer.WriteString(EncodingUtils.ToHexString((byte[])value));
                break;

            case "uri":
                writer.WriteString(((Uri)value).AbsoluteUri);
                break;

            default:
                throw new NotImplementedException(string.Format("UPnP standard data type '{0}' is not implemented", _upnpTypeName));
            }
        }