From f76dc3d64b23f7654e4f6b89fd25973649f05975 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sat, 10 Oct 2026 23:57:15 +0200 Subject: [PATCH] XML Serialization in C#: retarget to .NET 10 and run the article's examples from Program.cs Both projects move from net5.0 to net10.0. Test packages: Microsoft.NET.Test.Sdk 18.10.1, NUnit 5.0.0, NUnit3TestAdapter 6.3.1, coverlet.collector 10.1.0. Program.cs now serializes one Patient with a StreamWriter and with an XmlWriter (indentation, UTF-8 without a byte order mark, no xmlns:xsi or xmlns:xsd) and prints both documents, instead of printing hello world. New test XMLSerializationUnitTest_v6 covers the XmlWriterSettings and empty XmlSerializerNamespaces example the article adds. --- .../XMLSerializationInCsharp/Program.cs | 46 ++++++++++++--- .../XMLSerializationInCsharp.csproj | 2 +- .../XMLSerializationInCsharpTests.csproj | 10 ++-- .../XMLSerializationUnitTest_v6.cs | 59 +++++++++++++++++++ 4 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationUnitTest_v6.cs diff --git a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/Program.cs b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/Program.cs index 7783d4b8bd..b52aa8d041 100644 --- a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/Program.cs +++ b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/Program.cs @@ -1,13 +1,43 @@ using System; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using XMLSerializationInCsharp_v1; -namespace XMLSerializationInCsharp +var patient = new Patient() { + ID = 232323, + FirstName = "John", + LastName = "Doe", + Birthday = new DateTime(1990, 12, 30), + RoomNo = 310 +}; - class Program - { - static void Main(string[] args) - { - Console.Write("hello world"); - } - } +// The article's first example: a StreamWriter over a file. +var serializer = new XmlSerializer(typeof(Patient)); +using (var writer = new StreamWriter("patients.xml")) +{ + serializer.Serialize(writer, patient); } + +Console.WriteLine(File.ReadAllText("patients.xml")); +Console.WriteLine(); + +// The article's last example: an XmlWriter with indentation, UTF-8 without a byte order mark, +// and no xmlns:xsi or xmlns:xsd declarations on the root element. +var namespaces = new XmlSerializerNamespaces(); +namespaces.Add(string.Empty, string.Empty); + +var settings = new XmlWriterSettings +{ + Indent = true, + Encoding = new UTF8Encoding(false) +}; + +using (var xmlWriter = XmlWriter.Create("patient.xml", settings)) +{ + serializer.Serialize(xmlWriter, patient, namespaces); +} + +Console.WriteLine(File.ReadAllText("patient.xml")); diff --git a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/XMLSerializationInCsharp.csproj b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/XMLSerializationInCsharp.csproj index 2082704286..a15a29bf12 100644 --- a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/XMLSerializationInCsharp.csproj +++ b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharp/XMLSerializationInCsharp.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net10.0 diff --git a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationInCsharpTests.csproj b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationInCsharpTests.csproj index 8e9671cfd6..a3c4672bb8 100644 --- a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationInCsharpTests.csproj +++ b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationInCsharpTests.csproj @@ -1,16 +1,16 @@  - net5.0 + net10.0 false - - - - + + + + diff --git a/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationUnitTest_v6.cs b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationUnitTest_v6.cs new file mode 100644 index 0000000000..2e1792ef1f --- /dev/null +++ b/xml-csharp/XMLSerializationInCsharp/XMLSerializationInCsharpTests/XMLSerializationUnitTest_v6.cs @@ -0,0 +1,59 @@ +using NUnit.Framework; +using System; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using XMLSerializationInCsharp_v1; + +namespace XMLSerializationInCsharpTests +{ + public class XMLSerializationUnitTest_v6 + { + string xml = @" + + 232323 + John + Doe + 1990-12-30T00:00:00 + 310 +"; + + [Test] + public void WhenSerializingWithXmlWriterSettingsAndEmptyNamespaces_ThenNoNamespacesAndUtf8Declaration() + { + var patient = new Patient() + { + ID = 232323, + FirstName = "John", + LastName = "Doe", + Birthday = new DateTime(1990, 12, 30), + RoomNo = 310 + }; + + var namespaces = new XmlSerializerNamespaces(); + namespaces.Add(string.Empty, string.Empty); + + var settings = new XmlWriterSettings + { + Indent = true, + Encoding = new UTF8Encoding(false) + }; + + var serializer = new XmlSerializer(typeof(Patient)); + using var stream = new MemoryStream(); + using (var writer = XmlWriter.Create(stream, settings)) + { + serializer.Serialize(writer, patient, namespaces); + } + + var bytes = stream.ToArray(); + var result = Encoding.UTF8.GetString(bytes); + + Assert.That(bytes[0], Is.EqualTo((byte)'<'), "UTF8Encoding(false) writes no byte order mark"); + Assert.That(result, Does.Not.Contain("xmlns:xsi")); + Assert.That(result, Does.Not.Contain("xmlns:xsd")); + Assert.That(result.Replace("\r\n", "\n"), Is.EqualTo(xml.Replace("\r\n", "\n"))); + } + } +}