Search code examples
c#.net.net-4.0xmlserializer

How to serialize property of type Object with XmlSerializer


I have a property:

public object Tag

but it can contain finite number of types, unfortunately without base type (except object type). But when I serialize the object with this property, it doesn't get serialized. Is there a way to instruct XmlSerializer with possible types?


Solution

  • I don't recommend this, but yes, you can use [XmlElement] etc to tell it about multiple candidate types for a member:

    public class Test
    {
        private static void Main()
        {
            var ser = new XmlSerializer(typeof (Test));
            var obj = new Test {Value = "abc"};
            ser.Serialize(Console.Out, obj);
            obj = new Test { Value = 123 };
            ser.Serialize(Console.Out, obj);
            obj = new Test { Value = 456.7F };
            ser.Serialize(Console.Out, obj);
        }
    
        [XmlElement("a", Type = typeof(int))]
        [XmlElement("b", Type = typeof(string))]
        [XmlElement("c", Type = typeof(float))]
        public object Value { get; set; }
    }
    

    The important bits of the output (ignoring all the xmlns / <?xml> etc) are:

    <Test>
      <b>abc</b>
    </Test>
    
    <Test>
      <a>123</a>
    </Test>
    
    <Test>
      <c>456.7</c>
    </Test>