using System.Collections.Generic;
using System.Xml.Serialization;
using System.Diagnostics;
public abstract class Parameter
public string Value { get; set; }
public class Parameter1 : Parameter
public class Parameter2 : Parameter
[XmlElement("Parameter1", typeof(Parameter1))]
[XmlElement("Parameter2", typeof(Parameter2))]
public Parameter[] Parameters { get; set; }
public string Value { get; set; }
[XmlElement("Parameter1", typeof(Parameter))]
[XmlElement("Parameter2", typeof(Parameter))]
[XmlChoiceIdentifier("ParametersElementName")]
public Parameter[] Parameters { get; set; }
public ParametersChoiceType[] ParametersElementName { get; set; }
[XmlType(IncludeInSchema = false)]
public enum ParametersChoiceType
public string Value { get; set; }
[XmlType(IncludeInSchema = false)]
public enum ParametersChoiceType
[XmlElement("Parameter1", typeof(Parameter))]
[XmlElement("Parameter2", typeof(Parameter))]
[XmlChoiceIdentifier("ParametersElementName")]
public Parameter[] Parameters { get; set; }
public ParametersChoiceType[] ParametersElementName
return Parameters.Select(p => ParametersChoiceType.Parameter1).ToArray();
<Parameter1>3</Parameter1>
<Parameter2>4</Parameter2>
public static void Test()
ConsoleAndDebug.WriteLine("Original XML:" );
ConsoleAndDebug.WriteLine(xml);
ConsoleAndDebug.WriteLine("" );
Test<Option1.RootObject>(xml, true);
Test<Option2.RootObject>(xml, true);
Test<Option3.RootObject>(xml, false);
static void Test<TRootObject>(string xml, bool shouldBeEqual) where TRootObject : class, new()
ConsoleAndDebug.WriteLine("Deserializing " + typeof(TRootObject).FullName + ": " );
var root = xml.LoadFromXML<TRootObject>();
var xml2 = root.GetXml(true);
ConsoleAndDebug.WriteLine("Re-serialized XML:" );
ConsoleAndDebug.WriteLine(xml2);
if (!XNode.DeepEquals(XElement.Parse(xml), XElement.Parse(xml2)))
throw new InvalidOperationException("!XNode.DeepEquals(XElement.Parse(xml), XElement.Parse(xml2))");
ConsoleAndDebug.WriteLine("Original and re-serialized XML are identical." );
ConsoleAndDebug.WriteLine("" );
public static void Main()
public static class XmlSerializationHelper
public static T LoadFromXML<T>(this string xmlString)
using (StringReader reader = new StringReader(xmlString))
return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
public static string GetXml<T>(this T obj, bool omitStandardNamespaces = false)
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
ns = new XmlSerializerNamespaces();
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings() { Indent = true, IndentChars = " " };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
new XmlSerializer(obj.GetType()).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
public static class ConsoleAndDebug
public static void WriteLine(object s)