diff options
author | Marek Safar <marek.safar@gmail.com> | 2016-10-14 00:58:18 +0300 |
---|---|---|
committer | Marek Safar <marek.safar@gmail.com> | 2016-10-14 10:10:17 +0300 |
commit | d19e5c42a527800e92fd980a718c5b2afabb2a53 (patch) | |
tree | 5b21f4c027b65020f76ad141e3855e622744d1e3 /mcs/class/System.XML | |
parent | 398675d21a046cefeb8a36898bb4cdbd639d1601 (diff) |
[System.Xml] Update supported time formats for mobile version of XML deserializer. Fixes #42843
Diffstat (limited to 'mcs/class/System.XML')
3 files changed, 41 insertions, 1 deletions
diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs index a7343e01820..e27f99a0fb7 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlCustomFormatter.cs @@ -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); diff --git a/mcs/class/System.XML/Test/System.Xml.Serialization/DeserializeTests.cs b/mcs/class/System.XML/Test/System.Xml.Serialization/DeserializeTests.cs index ec13691da1c..1393c354207 100644 --- a/mcs/class/System.XML/Test/System.Xml.Serialization/DeserializeTests.cs +++ b/mcs/class/System.XML/Test/System.Xml.Serialization/DeserializeTests.cs @@ -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 { diff --git a/mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTestClasses.cs b/mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTestClasses.cs index 116bbe323ad..4adcc11b20d 100644 --- a/mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTestClasses.cs +++ b/mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTestClasses.cs @@ -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; |