using System.Xml.Serialization;
public static void Main()
public static void XmlElement()
Console.WriteLine("Root1 string[] property with XmlTextAttribute");
var ser = new XmlSerializer(typeof(Root1));
var sb = new StringBuilder();
var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true });
ser.Serialize(writer, new Root1 { Ids = ["1", "2", "3"] }, new XmlSerializerNamespaces([new XmlQualifiedName("", "")]));
Console.WriteLine($"[FAIL] serialize is missing whitespace separators: {sb}");
Root1 root1 = (Root1)ser.Deserialize(new StringReader("<Root1>1 2 3</Root1>"))!;
Console.WriteLine($"[FAIL] deserialize returns only 1 squashed element instead of 3 separated: {JsonSerializer.Serialize(root1.Ids)}\n");
public static void ShadowProperty()
Console.WriteLine("Root2 workaround with shadow property for splitting and joining:");
var ser = new XmlSerializer(typeof(Root2));
var sb = new StringBuilder();
var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true });
ser.Serialize(writer, new Root2 { Ids = [1, 2, 3] }, new XmlSerializerNamespaces([new XmlQualifiedName("", "")]));
Console.WriteLine($"[OK] Root2 serialize as whitespace separated list: {sb}");
var xml = "<Root2>1 2 3</Root2>";
var stream = new StringReader(xml);
var root2 = ser.Deserialize(stream) as Root2;
Console.WriteLine($"[OK] Root2 deserialize has 3 elements: {JsonSerializer.Serialize(root2.Ids)}\n");
public static void XmlAttribute()
Console.WriteLine("Root3 alternative serialization using xml attribute:");
var ser = new XmlSerializer(typeof(Root3));
var sb = new StringBuilder();
var writer = XmlWriter.Create(sb, new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true });
ser.Serialize(writer, new Root3 { Ids = ["1", "2", "3"] }, new XmlSerializerNamespaces([new XmlQualifiedName("", "")]));
Console.WriteLine($"[OK] serialize: {sb}");
var root3 = ser.Deserialize(new StringReader("""<Root3 Ids="1 2 3" />""")) as Root3;
Console.WriteLine($"[OK] deserialize: {JsonSerializer.Serialize(root3.Ids)}\n");
public partial class Root2
public partial class Root2
get => Value.Split(" ").Where(v => !string.IsNullOrWhiteSpace(v)).Select(int.Parse).ToArray();
set => Value = string.Join(" ", value);