.NET und Xml 02.05.2017, 14:22 Uhr

Nicht öffentliche Typen als XML serialisieren

.NET bietet mit dem XmlSerializer die Möglichkeit, Klassen als als XML zu serialisieren. Dabei berücksichtigt der XmlSerialzer allerdings nur öffentliche Eigenschaften und Felder. Nicht öffentliche ignoriert er. Eine weitere Klasse hilft.
(Quelle: 18560034)
"Eigentlich ist es ja ein alter Hut (und XML ist für viele out)", schreibt Norbert Eder in seinem Blog-Beitrag. Trotzdem verwendet er das Xml-Format aus alter Gewohnheit, um Konfigurationsdaten zu speichern.
Der XmlSerializer des .NET Framework ist hier die passende Klasse für den Job. Das funktioniert auch ganz wunderbar, solange es sich um öffentliche Typen handelt. Nicht öffentliche Typen ignoriert der XmlSerializer. Soll sich der Inhalt von Feldern also im XML niederschlagen, muss man diese auf public setzen.
Doch genau das sollte man nicht tun. Schließlich macht die Sichtbarkeit der Eigenschaften und Felder die Schnittstelle der Klasse mit der Außenwelt aus. Manche Felder sollen also nicht öffentlich zugänglich sein.
Diesen Konflikt löst die Klasse DataContractSerializer. Bei diesem Serialisierer lässt sich durch Attribute an den Feldern steuern, ob sie serialisiert werden sollen oder nicht:
using System.Runtime.Serialization;
using System.Text;
using System.Xml;

namespace ConsoleApp3
{
  class Program
  {
    static void Main(string[] args)
    {
      string path = @"C:\Settings\Settings.xml";
      Setting set = new Setting() { Firstname = "Norbert",
        Lastname = "Eder" };

      DataContractSerializer d = new    
        DataContractSerializer(typeof(Setting));

      var serializer = new DataContractSerializer(typeof(Setting));
      using (var stream = new XmlTextWriter(path, Encoding.Unicode))
      {
        serializer.WriteObject(stream, set);
      }
    }
  }

  [DataContract]
  internal class Setting
  {
    [DataMember]
    public string Firstname { get; set; }
    [DataMember]
    public string Lastname { get; set; }
    [DataMember]
    private string Medium = "Blog-Post";
  }
}
Es wird in dem Fall auch das private Feld Medium in das Xml serialisiert.