Improve date serialization compatibility with third party web services
authorLluis Sanchez <lluis@xamarin.com>
Tue, 5 Jun 2012 10:31:20 +0000 (12:31 +0200)
committerLluis Sanchez <lluis@xamarin.com>
Tue, 5 Jun 2012 10:35:52 +0000 (12:35 +0200)
Make XmlCustomFormatter.cs more liberal about the date formats it accepts.
Many third party web services do not format date exactly at 'yyyy-mm-dd'.
The Microsoft implementation is more liberal about accepting other formats
and so the current Mono implementation breaks projects that consume third
party web services when they are ported to Mono.
Based on a patch by Aaron Roydhouse.

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 44158f5dd5d5c329996593847cf6aa537a668047..dca5ac50d476444915e872aefbabc4c5fd4341a8 100644 (file)
@@ -272,11 +272,11 @@ namespace System.Xml.Serialization {
                                case "char": return (char)XmlConvert.ToInt32 (value);
 #if NET_2_0
                                case "dateTime": return XmlConvert.ToDateTime (value, XmlDateTimeSerializationMode.RoundtripKind);
-                               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.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);
@@ -375,11 +375,11 @@ namespace System.Xml.Serialization {
                                case "char": return "(char)Int32.Parse (" + value + ", CultureInfo.InvariantCulture)";
 #if NET_2_0
                                case "dateTime": return "XmlConvert.ToDateTime (" + value + ", XmlDateTimeSerializationMode.RoundtripKind)";
-                               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.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)";
index 84721b905bb0b2ecc19eff3539cc8f3303bbb2dc..90f16f0899c9b544e613ac44511adf9da60922f3 100644 (file)
@@ -1545,5 +1545,13 @@ namespace MonoTests.System.XmlSerialization
                        } catch (InvalidOperationException) {
                        }
                }
+
+               [Test]
+               public void NotExactDateParse ()
+               {
+                       XmlSerializer xs = new XmlSerializer (typeof (NotExactDateParseClass));
+                       NotExactDateParseClass o = (NotExactDateParseClass) xs.Deserialize (new StringReader ("<NotExactDateParseClass xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><SomeDate xsi:type=\"xsd:date\">2012-02-05-09:00</SomeDate></NotExactDateParseClass>"));
+                       Assert.AreEqual (new DateTime (2012,2,5), o.SomeDate);
+               }
        }
 }
index 8d6af186a7f563161a031678dc9c65b3da2caa68..955a8e3f7cb12f20d34d8afeb3ecd968cd0ddab0 100644 (file)
@@ -1047,5 +1047,11 @@ namespace MonoTests.System.Xml.TestClasses
                [XmlElementAttribute ("MyDateNullable", DataType = "date", IsNullable = true)]
                public DateTime? MyDateNullable;
        }
+
+       public class NotExactDateParseClass
+       {
+               [XmlElementAttribute (DataType = "date")]
+               public DateTime SomeDate;
+       }
 }