Explorar o código

Test XmlSerialization of element that requires implicit conversion.
Covers #20403.

Marcos Henrich %!s(int64=11) %!d(string=hai) anos
pai
achega
f008d4afb6

+ 43 - 0
mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTestClasses.cs

@@ -1117,5 +1117,48 @@ namespace MonoTests.System.Xml.TestClasses
 		[XmlElement ("Extra", Order=1)]
 		public string[] Extra;
 	}
+
+	public class SimpleObjectA
+	{
+		[XmlAttribute]
+		public string Text
+		{
+			get; set;
+		}
+
+		public static implicit operator SimpleObjectA (SimpleObjectB o)
+		{
+			return new SimpleObjectA { Text = o.Text };
+		}
+
+		public static implicit operator SimpleObjectB (SimpleObjectA o)
+		{
+		 return new SimpleObjectB { Text = o.Text };
+		}
+	}
+
+	public class SimpleObjectB
+	{
+		[XmlAttribute]
+		public string Text
+		{
+			get; set;
+		}
+	}
+
+	public class ObjectWithElementRequiringImplicitCast
+	{
+		public ObjectWithElementRequiringImplicitCast () { }
+		public ObjectWithElementRequiringImplicitCast (string text)
+		{
+			Object = new SimpleObjectB { Text = text };
+		}
+
+		[XmlElement(Type = typeof (SimpleObjectA))]
+		public SimpleObjectB Object
+		{
+			get; set;
+		}
+	}
 }
 

+ 16 - 0
mcs/class/System.XML/Test/System.Xml.Serialization/XmlSerializerTests.cs

@@ -3332,6 +3332,22 @@ namespace MonoTests.System.XmlSerialization
 			using (var sw = new StringWriter ())
 				ser.Serialize (sw, c);
 		}
+
+		[Test]
+		public void ClassWithImplicitlyConvertibleElement ()
+		{
+			var ser = new XmlSerializer (typeof (ObjectWithElementRequiringImplicitCast));
+
+			var obj = new ObjectWithElementRequiringImplicitCast ("test");
+
+			using (var w = new StringWriter ()) {
+				ser.Serialize (w, obj);
+				using (var r = new StringReader ( w.ToString ())) {
+					var desObj = (ObjectWithElementRequiringImplicitCast) ser.Deserialize (r);
+					Assert.AreEqual (obj.Object.Text, desObj.Object.Text);
+				}
+			}
+		}
 	}
 
 	// Test generated serialization code.