The idea behind the .NET System.Xml.Serialization.XmlSerializer class is that you can easily serialize an XML file into a class tree and vice versa.
If you’re using XML Schema files, the xsd.exe tool can create that class tree for you.
But for simple applications you don’t even need a schema. You simply create a class that has public properties of simple types or complex types that in turn contain simple types.
Then you can throw this object into the XmlSerializer and you’re done. 🙂
Here’s my personal XmlSerializer coding pattern for a simple list of settings:
using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; [Serializable()] [XmlRoot()] public class Settings { private static XmlSerializer s_Serializer; [XmlArray("SettingsList")] [XmlArrayItem("Setting")] public Setting[] SettingsList; static Settings() { //This way is safer than the more obvious //s_Serializer = new XmlSerializer(typeof(Settings)); XmlReflectionImporter importer = new XmlReflectionImporter(); XmlTypeMapping xmlMapping = importer .ImportTypeMapping(typeof(Settings), null, null); XmlSerializerFactory factory = new XmlSerializerFactory(); s_Serializer = factory.CreateSerializer(xmlMapping); } public static Settings Deserialize(String filename) { using (FileStream stream = new FileStream(filename , FileMode.Open, FileAccess.Read, FileShare.Read)) { return (s_Serializer.Deserialize(stream) as Settings); } } public void Serialize(String filename) { using (FileStream stream = new FileStream(filename , FileMode.Create, FileAccess.Write, FileShare.Read)) { using (XmlTextWriter writer = new XmlTextWriter(stream , Encoding.UTF8)) { writer.Formatting = Formatting.Indented; s_Serializer.Serialize(writer, this); } } } } [Serializable()] public class Setting { public String Key; public String Value; } |
Or maybe you want a simple way to have a crash report when your application crashes for yet unknown reasons:
using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; [Serializable()] [XmlRoot()] public class ExceptionXml { private static XmlSerializer s_Serializer; public String Type; public String Message; public String StackTrace; public ExceptionXml InnerException; static ExceptionXml() { //This way is safer than the more obvious //s_Serializer // = new XmlSerializer(typeof(ExceptionXml)); XmlReflectionImporter importer = new XmlReflectionImporter(); XmlTypeMapping xmlMapping = importer .ImportTypeMapping(typeof(ExceptionXml), null, null); XmlSerializerFactory factory = new XmlSerializerFactory(); s_Serializer = factory.CreateSerializer(xmlMapping); } public static ExceptionXml Deserialize(String filename) { using (FileStream stream = new FileStream(filename , FileMode.Open, FileAccess.Read, FileShare.Read)) { return (s_Serializer.Deserialize(stream) as ExceptionXml); } } public void Serialize(String filename) { using (FileStream stream = new FileStream(filename , FileMode.Create, FileAccess.Write, FileShare.Read)) { using (XmlTextWriter writer = new XmlTextWriter(stream , Encoding.UTF8)) { writer.Formatting = Formatting.Indented; s_Serializer.Serialize(writer, this); } } } public ExceptionXml() { } public ExceptionXml(Exception ex) { if (ex != null) { this.Type = ex.GetType().FullName; this.Message = ex.Message; this.StackTrace = ex.StackTrace; if (ex.InnerException != null) { this.InnerException = new ExceptionXml(ex.InnerException); } } } } |