private static void compose(object value, XmlWriter writer) { if (value == null || value is string) { writer.WriteMacElementString("string", value as string); } else if (value is int || value is long) { writer.WriteMacElementString("integer", ((int)value).ToString(System.Globalization.NumberFormatInfo.InvariantInfo)); } else if (value is IDictionary<string, object>) { var dic = (IDictionary<string, object>)value; writeDictionaryValues(dic, writer); } else if (value is IList<object>) { composeArray((IList<object>)value, writer); } else if (value is byte[]) { writer.WriteMacElementString("data", string.Format("{1}{2}{0}{1}{2}", Convert.ToBase64String((Byte[])value), writer.Settings.NewLineChars, "\t")); } else if (value is float || value is double) { writer.WriteMacElementString("real", ((double)value).ToString(System.Globalization.NumberFormatInfo.InvariantInfo)); } else if (value is DateTime) { DateTime time = (DateTime)value; string theString = XmlConvert.ToString(time, XmlDateTimeSerializationMode.Utc); writer.WriteMacElementString("date", theString);//, "yyyy-MM-ddTHH:mm:ssZ")); } else if (value is bool) { writer.WriteElementString(value.ToString().ToLower(), ""); } else { throw new Exception(String.Format("Value type '{0}' is unhandled", value.GetType().ToString())); } }