X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.XML%2FSystem.Xml.Serialization%2FXmlCustomFormatter.cs;h=dca5ac50d476444915e872aefbabc4c5fd4341a8;hb=f0d2ee46f839cc3cebcdaa674b3a31d9a3e22863;hp=40b1c70bd414f27421b0eb14af63d7f60f7a7172;hpb=9869ae24b88761ab261c4311e24f7383b4af3f02;p=mono.git diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs index 40b1c70bd41..dca5ac50d47 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs @@ -42,7 +42,7 @@ namespace System.Xml.Serialization { internal static string FromByteArrayBase64 (byte[] value) { - return Convert.ToBase64String(value); + return value == null ? String.Empty : Convert.ToBase64String(value); } internal static string FromByteArrayHex (byte[] value) @@ -66,7 +66,11 @@ namespace System.Xml.Serialization { internal static string FromDateTime (DateTime value) { +#if NET_2_0 + return XmlConvert.ToString (value, XmlDateTimeSerializationMode.RoundtripKind); +#else return XmlConvert.ToString (value, "yyyy-MM-ddTHH:mm:ss.fffffffzzz"); +#endif } internal static string FromTime (DateTime value) @@ -161,7 +165,11 @@ namespace System.Xml.Serialization { internal static DateTime ToDateTime (string value) { +#if NET_2_0 + return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind); +#else return XmlConvert.ToDateTime (value); +#endif } internal static DateTime ToTime (string value) @@ -225,9 +233,15 @@ namespace System.Xml.Serialization { case "boolean": return XmlConvert.ToString ((bool)value); case "unsignedByte": return XmlConvert.ToString ((byte)value); case "char": return XmlConvert.ToString ((int)(char)value); +#if NET_2_0 + case "dateTime": return XmlConvert.ToString ((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind); + case "date": return ((DateTime)value).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); + case "time": return ((DateTime)value).ToString("HH:mm:ss.FFFFFFF", CultureInfo.InvariantCulture); +#else case "dateTime": return XmlConvert.ToString ((DateTime)value); case "date": return ((DateTime)value).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); case "time": return ((DateTime)value).ToString("HH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture); +#endif case "decimal": return XmlConvert.ToString ((decimal)value); case "double": return XmlConvert.ToString ((double)value); case "short": return XmlConvert.ToString ((Int16)value); @@ -240,8 +254,9 @@ namespace System.Xml.Serialization { case "unsignedLong": return XmlConvert.ToString ((UInt64)value); case "guid": return XmlConvert.ToString ((Guid)value); case "base64": - case "base64Binary": return Convert.ToBase64String ((byte[])value); - case "duration": return XmlConvert.ToString ((TimeSpan) value); + case "base64Binary": return value == null ? String.Empty : Convert.ToBase64String ((byte[])value); + case "hexBinary": return value == null ? String.Empty : XmlConvert.ToBinHexString ((byte[]) value); + case "duration": return (string) value; default: return value is IFormattable ? ((IFormattable) value).ToString (null, CultureInfo.InvariantCulture) : value.ToString (); } } @@ -255,9 +270,15 @@ namespace System.Xml.Serialization { case "boolean": return XmlConvert.ToBoolean (value); case "unsignedByte": return XmlConvert.ToByte (value); case "char": return (char)XmlConvert.ToInt32 (value); +#if NET_2_0 + case "dateTime": return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind); + case "date": return XmlConvert.ToDateTime (value).Date; + case "time": return DateTime.ParseExact (value, "HH:mm:ss.FFFFFFF", null); +#else case "dateTime": return XmlConvert.ToDateTime (value); - case "date": return DateTime.ParseExact (value, "yyyy-MM-dd", null); + case "date": return XmlConvert.ToDateTime (value).Date; case "time": return DateTime.ParseExact (value, "HH:mm:ss.fffffffzzz", null); +#endif case "decimal": return XmlConvert.ToDecimal (value); case "double": return XmlConvert.ToDouble (value); case "short": return XmlConvert.ToInt16 (value); @@ -271,10 +292,11 @@ namespace System.Xml.Serialization { case "guid": return XmlConvert.ToGuid (value); case "base64": case "base64Binary": return Convert.FromBase64String (value); - case "duration": return XmlConvert.ToTimeSpan (value); + case "hexBinary": return XmlConvert.FromBinHexString (value); + case "duration": return value; default: if (type.Type != null) - return Convert.ChangeType (value, type.Type); + return Convert.ChangeType (value, type.Type, null); else return value; } @@ -282,14 +304,30 @@ namespace System.Xml.Serialization { internal static string GenerateToXmlString (TypeData type, string value) { + if (type.NullableOverride) + return "(" + value + " != null ? " + GenerateToXmlStringCore (type, value) + " : null)"; + else + return GenerateToXmlStringCore (type, value); + } + + static string GenerateToXmlStringCore (TypeData type, string value) + { + if (type.NullableOverride) + value = value + ".Value"; switch (type.XmlType) { case "boolean": return "(" + value + "?\"true\":\"false\")"; case "unsignedByte": return value + ".ToString(CultureInfo.InvariantCulture)"; case "char": return "((int)(" + value + ")).ToString(CultureInfo.InvariantCulture)"; +#if NET_2_0 + case "dateTime": return "XmlConvert.ToString (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)"; + case "date": return value + ".ToString(\"yyyy-MM-dd\", CultureInfo.InvariantCulture)"; + case "time": return value + ".ToString(\"HH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)"; +#else case "dateTime": return value + ".ToString(\"yyyy-MM-ddTHH:mm:ss.fffffffzzz\", CultureInfo.InvariantCulture)"; case "date": return value + ".ToString(\"yyyy-MM-dd\", CultureInfo.InvariantCulture)"; case "time": return value + ".ToString(\"HH:mm:ss.fffffffzzz\", CultureInfo.InvariantCulture)"; +#endif case "decimal": return "XmlConvert.ToString (" + value + ")"; case "double": return "XmlConvert.ToString (" + value + ")"; case "short": return value + ".ToString(CultureInfo.InvariantCulture)"; @@ -302,8 +340,9 @@ namespace System.Xml.Serialization { case "unsignedLong": return value + ".ToString(CultureInfo.InvariantCulture)"; case "guid": return "XmlConvert.ToString (" + value + ")"; case "base64": - case "base64Binary": return "Convert.ToBase64String (" + value + ")"; - case "duration": return "XmlConvert.ToString (" + value + ")"; + case "base64Binary": return value + " == null ? String.Empty : Convert.ToBase64String (" + value + ")"; + case "hexBinary": return value + " == null ? String.Empty : ToBinHexString (" + value + ")"; + case "duration": return value; case "NMTOKEN": case "Name": case "NCName": @@ -320,15 +359,29 @@ namespace System.Xml.Serialization { } internal static string GenerateFromXmlString (TypeData type, string value) + { + if (type.NullableOverride) + return String.Concat ("(", value, " != null ? (", type.CSharpName, "?)", GenerateFromXmlStringCore (type, value), " : null)"); + else + return GenerateFromXmlStringCore (type, value); + } + + static string GenerateFromXmlStringCore (TypeData type, string value) { switch (type.XmlType) { case "boolean": return "XmlConvert.ToBoolean (" + value + ")"; case "unsignedByte": return "byte.Parse (" + value + ", CultureInfo.InvariantCulture)"; case "char": return "(char)Int32.Parse (" + value + ", CultureInfo.InvariantCulture)"; +#if NET_2_0 + case "dateTime": return "XmlConvert.ToDateTime (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)"; + case "date": return "XmlConvert.ToDateTime (" + value + ").Date"; + case "time": return "DateTime.ParseExact (" + value + ", \"HH:mm:ss.FFFFFFF\", CultureInfo.InvariantCulture)"; +#else case "dateTime": return "XmlConvert.ToDateTime (" + value + ")"; - case "date": return "DateTime.ParseExact (" + value + ", \"yyyy-MM-dd\", CultureInfo.InvariantCulture)"; + case "date": return "XmlConvert.ToDateTime (" + value + ").Date"; case "time": return "DateTime.ParseExact (" + value + ", \"HH:mm:ss.fffffffzzz\", CultureInfo.InvariantCulture)"; +#endif case "decimal": return "Decimal.Parse (" + value + ", CultureInfo.InvariantCulture)"; case "double": return "XmlConvert.ToDouble (" + value + ")"; case "short": return "Int16.Parse (" + value + ", CultureInfo.InvariantCulture)"; @@ -342,7 +395,8 @@ namespace System.Xml.Serialization { case "guid": return "XmlConvert.ToGuid (" + value + ")"; case "base64:": case "base64Binary": return "Convert.FromBase64String (" + value + ")"; - case "duration": return "XmlConvert.ToTimeSpan (" + value + ")"; + case "hexBinary": return "FromBinHexString (" + value + ")"; + case "duration": return value; default: return value; } }