using System.Xml.Serialization;
using System.Text.Json.Serialization;
public static void Main()
var fooWithBar = new Foo() { Bar = new Bar() };
Console.WriteLine(SerializeToXml(fooWithBar));
var fooWithPub = new Foo() { Bar = new Pub() };
Console.WriteLine(SerializeToXml(fooWithPub));
Console.WriteLine("----");
Console.WriteLine(JsonSerializer.Serialize(fooWithBar));
Console.WriteLine(JsonSerializer.Serialize(fooWithPub));
public static string SerializeToXml<T>(T tValue)
using var ms = new MemoryStream();
using var xmlWriter = XmlWriter.Create(ms, new()
Encoding = Encoding.UTF8,
XmlSerializer xmlSerializer = new(typeof(T));
xmlSerializer.Serialize(xmlWriter, tValue);
return Encoding.UTF8.GetString(ms.ToArray());
[XmlElement("Bar", typeof(Bar))]
[XmlElement("Pub", typeof(Pub))]
public BaseBar Bar { get; set; }
[JsonDerivedType(typeof(Bar), typeDiscriminator: nameof(Bar))]
[JsonDerivedType(typeof(Pub), typeDiscriminator: nameof(Pub))]
public abstract class BaseBar
public abstract string Text { get; set; }
public class Bar : BaseBar
public override string Text { get; set; } = "I am a Bar";
public class Pub : BaseBar
public override string Text { get; set; } = "I am a Pub";