[System.Xml] Update supported time formats for mobile version of XML deserializer...
authorMarek Safar <marek.safar@gmail.com>
Thu, 13 Oct 2016 21:58:18 +0000 (23:58 +0200)
committerMarek Safar <marek.safar@gmail.com>
Fri, 14 Oct 2016 07:10:17 +0000 (09:10 +0200)
mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs
mcs/class/System.XML/Test/System.Xml.Serialization/DeserializeTests.cs
mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTestClasses.cs

index a7343e0182087700e47107335d8613fc6d891a01..e27f99a0fb7e3bf66a545cf486b281a115e2be1e 100644 (file)
@@ -243,6 +243,33 @@ namespace System.Xml.Serialization {
                        }
                }
 
+               static string[] allTimeFormats = new string[] {
+                       "HH:mm:ss.fffffffzzzzzz",
+                       "HH:mm:ss",
+                       "HH:mm:ss.f",
+                       "HH:mm:ss.ff",
+                       "HH:mm:ss.fff",
+                       "HH:mm:ss.ffff",
+                       "HH:mm:ss.fffff",
+                       "HH:mm:ss.ffffff",
+                       "HH:mm:ss.fffffff",
+                       "HH:mm:ssZ",
+                       "HH:mm:ss.fZ",
+                       "HH:mm:ss.ffZ",
+                       "HH:mm:ss.fffZ",
+                       "HH:mm:ss.ffffZ",
+                       "HH:mm:ss.fffffZ",
+                       "HH:mm:ss.ffffffZ",
+                       "HH:mm:ss.fffffffZ",
+                       "HH:mm:sszzzzzz",
+                       "HH:mm:ss.fzzzzzz",
+                       "HH:mm:ss.ffzzzzzz",
+                       "HH:mm:ss.fffzzzzzz",
+                       "HH:mm:ss.ffffzzzzzz",
+                       "HH:mm:ss.fffffzzzzzz",
+                       "HH:mm:ss.ffffffzzzzzz",
+               };
+
                internal static object FromXmlString (TypeData type, string value)
                {
                        if (value == null) return null;
@@ -254,7 +281,7 @@ namespace System.Xml.Serialization {
                                case "char": return (char)XmlConvert.ToInt32 (value);
                                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);
+                               case "time": return DateTime.ParseExact(value, allTimeFormats, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite | DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.RoundtripKind);
                                case "decimal": return XmlConvert.ToDecimal (value);
                                case "double": return XmlConvert.ToDouble (value);
                                case "short": return XmlConvert.ToInt16 (value);
index ec13691da1c6f391354da03759db0b487818446c..1393c354207eeb7596880a9dd9755adcddf337bb 100644 (file)
@@ -1555,6 +1555,13 @@ namespace MonoTests.System.XmlSerialization
                        Assert.AreEqual (new DateTime (2012,2,5,9,0,0,DateTimeKind.Utc), o.SomeDate.ToUniversalTime ());
                }
 
+               [Test]
+               public void TimeWithUtc ()
+               {
+                       XmlSerializer xs = new XmlSerializer (typeof (UtcTimeClass));
+                       var o = (UtcTimeClass) xs.Deserialize (new StringReader ("<UtcTimeClass xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><DateTimeValue>12:34:56.0Z</DateTimeValue></UtcTimeClass>"));
+                       Assert.AreEqual (new DateTime (1,1,1,12,34,56,DateTimeKind.Utc), o.DateTimeValue);
+               }
 
                public class Foo
                {
index 116bbe323ad312f2fcfb8779cb5a1027ba7b69c3..4adcc11b20d8032cfb427bb0490a8a093fc7eace 100644 (file)
@@ -1071,6 +1071,12 @@ namespace MonoTests.System.Xml.TestClasses
                public DateTime SomeDate;
        }
 
+       public class UtcTimeClass
+       {
+               [XmlElementAttribute (DataType = "time")]
+               public DateTime DateTimeValue;
+       }
+
        public class Bug8468BaseClass
        {
                public string Base;