else
{
if (memberValue == null)
- return (XmlTypeMapElementInfo) _elementInfo[0];
- foreach (XmlTypeMapElementInfo elem in _elementInfo)
- if (elem.TypeData.Type.IsInstanceOfType (memberValue)) return elem;
+ return (XmlTypeMapElementInfo) _elementInfo [0];
+ else
+ {
+ XmlTypeMapElementInfo bestTypeElem = null;
+ // Select the most-specific type for the given memberValue
+ foreach (XmlTypeMapElementInfo elem in _elementInfo)
+ {
+ if (elem.TypeData.Type.IsInstanceOfType (memberValue))
+ {
+ if (bestTypeElem == null || elem.TypeData.Type.IsSubclassOf (bestTypeElem.TypeData.Type))
+ {
+ bestTypeElem = elem;
+ }
+ }
+ }
+ return bestTypeElem;
+ }
}
return null;
}
#endregion //GenericsSeralizationTests
+ #region XmlInclude on abstract class tests (Bug #18558)
+ [Test]
+ public void TestSerializeIntermediateType ()
+ {
+ string expectedXml = "<ContainerTypeForTest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><XmlIntermediateType intermediate=\"false\"/></ContainerTypeForTest>";
+ var obj = new ContainerTypeForTest();
+ obj.MemberToUseInclude = new IntermediateTypeForTest ();
+ Serialize (obj);
+ Assert.AreEqual (Infoset (expectedXml), WriterText, "Serialized Output : " + WriterText);
+ }
+ [Test]
+ public void TestSerializeSecondType ()
+ {
+ string expectedXml = "<ContainerTypeForTest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><XmlSecondType intermediate=\"false\"/></ContainerTypeForTest>";
+ var obj = new ContainerTypeForTest();
+ obj.MemberToUseInclude = new SecondDerivedTypeForTest ();
+ Serialize (obj);
+ Assert.AreEqual (Infoset (expectedXml), WriterText, "Serialized Output : " + WriterText);
+ }
+ #endregion
public class XmlArrayOnInt
{
[XmlArray]
generationThreshold.SetValue (null, generationThresholdOld);
generatorFallback.SetValue (null, generatorFallbackOld);
}
+
+#region XmlInclude on abstract class test classes
+
+ [XmlType]
+ public class ContainerTypeForTest
+ {
+ [XmlElement ("XmlFirstType", typeof (FirstDerivedTypeForTest))]
+ [XmlElement ("XmlIntermediateType", typeof (IntermediateTypeForTest))]
+ [XmlElement ("XmlSecondType", typeof (SecondDerivedTypeForTest))]
+ public AbstractTypeForTest MemberToUseInclude { get; set; }
+ }
+
+ [XmlInclude (typeof (FirstDerivedTypeForTest))]
+ [XmlInclude (typeof (IntermediateTypeForTest))]
+ [XmlInclude (typeof (SecondDerivedTypeForTest))]
+ public abstract class AbstractTypeForTest
+ {
+ }
+
+ public class IntermediateTypeForTest : AbstractTypeForTest
+ {
+ [XmlAttribute (AttributeName = "intermediate")]
+ public bool IntermediateMember { get; set; }
+ }
+
+ public class FirstDerivedTypeForTest : AbstractTypeForTest
+ {
+ public string FirstMember { get; set; }
+ }
+
+ public class SecondDerivedTypeForTest : IntermediateTypeForTest
+ {
+ public string SecondMember { get; set; }
+ }
+#endregion
+
}
}