Easily write the entire instance of the class to an XML file and read it

I have a main class called theGarage , which contains instances of the classes of our customers, suppliers and jobs.

I want to save the program data to an XML file, I used the code below (just a fragment, I have the corresponding code for other classes). I am wondering if I have an easier way to do this, for example to write the entire TheGarage class to an XML file and read it without having to write all this code, as shown below.

  public void saveToFile() { using (XmlWriter writer = XmlWriter.Create("theGarage.xml")) { writer.WriteStartDocument(); /// writer.WriteStartElement("theGarage"); writer.WriteStartElement("Customers"); foreach (Customer Customer in Program.theGarage.Customers) { writer.WriteStartElement("Customer"); writer.WriteElementString("FirstName", Customer.FirstName); writer.WriteElementString("LastName", Customer.LastName); writer.WriteElementString("Address1", Customer.Address1); writer.WriteElementString("Address2", Customer.Address2); writer.WriteElementString("Town", Customer.Town); writer.WriteElementString("County", Customer.County); writer.WriteElementString("PostCode", Customer.Postcode); writer.WriteElementString("TelephoneHome", Customer.TelephoneHome); writer.WriteElementString("TelephoneMob", Customer.TelephoneMob); //begin vehicle list writer.WriteStartElement("Vehicles"); foreach (Vehicle Vehicle in Customer.Cars) { writer.WriteStartElement("Vehicle"); writer.WriteElementString("Make", Vehicle.Make); writer.WriteElementString("Model", Vehicle.Model); writer.WriteElementString("Colour", Vehicle.Colour); writer.WriteElementString("EngineSize", Vehicle.EngineSize); writer.WriteElementString("Registration", Vehicle.Registration); writer.WriteElementString("Year", Vehicle.YearOfFirstReg); writer.WriteEndElement(); } writer.WriteEndElement(); writer.WriteEndElement(); } } } 
+7
source share
4 answers

There is a much simpler way to serialize objects, use the XmlSerializer instead. See the documentation here .

A code snippet to serialize your garage to a file might look like this:

 var garage = new theGarage(); // TODO init your garage.. XmlSerializer xs = new XmlSerializer(typeof(theGarage)); TextWriter tw = new StreamWriter(@"c:\temp\garage.xml"); xs.Serialize(tw, garage); 

And the code for loading the garage from the file:

 using(var sr = new StreamReader(@"c:\temp\garage.xml")) { garage = (theGarage)xs.Deserialize(sr); } 
+28
source

What about some excellent extension methods, then you can read / write this to / from a file easily.

 public static class Extensions { public static string ToXml(this object obj) { XmlSerializer s = new XmlSerializer(obj.GetType()); using (StringWriter writer = new StringWriter()) { s.Serialize(writer, obj); return writer.ToString(); } } public static T FromXml<T>(this string data) { XmlSerializer s = new XmlSerializer(typeof(T)); using (StringReader reader = new StringReader(data)) { object obj = s.Deserialize(reader); return (T)obj; } } } 

Example

  var xmlData = myObject.ToXml(); var anotherObject = xmlData.FromXml<ObjectType>(); 
+5
source

In my project, I am using DataContractSerializer . I contrast with the XmlSerializer , it can handle multiple references to the same object in such a way that the data is not duplicated in xml and is not restored as saved.

0
source

I wrote a blog post about storing object data in Binary, XML or Json . Here are the functions for writing and reading an instance of a class to / from XML. See my blog post for more details.

This requires the System.Xml assembly to be included in your project.

 /// <summary> /// Writes the given object instance to an XML file. /// <para>Only Public properties and variables will be written to the file. These can be any type though, even other classes.</para> /// <para>If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.</para> /// <para>Object type must have a parameterless constructor.</para> /// </summary> /// <typeparam name="T">The type of object being written to the file.</typeparam> /// <param name="filePath">The file path to write the object instance to.</param> /// <param name="objectToWrite">The object instance to write to the file.</param> /// <param name="append">If false the file will be overwritten if it already exists. If true the contents will be appended to the file.</param> public static void WriteToXmlFile<T>(string filePath, T objectToWrite, bool append = false) where T : new() { TextWriter writer = null; try { var serializer = new XmlSerializer(typeof(T)); writer = new StreamWriter(filePath, append); serializer.Serialize(writer, objectToWrite); } finally { if (writer != null) writer.Close(); } } /// <summary> /// Reads an object instance from an XML file. /// <para>Object type must have a parameterless constructor.</para> /// </summary> /// <typeparam name="T">The type of object to read from the file.</typeparam> /// <param name="filePath">The file path to read the object instance from.</param> /// <returns>Returns a new instance of the object read from the XML file.</returns> public static T ReadFromXmlFile<T>(string filePath) where T : new() { TextReader reader = null; try { var serializer = new XmlSerializer(typeof(T)); reader = new StreamReader(filePath); return (T)serializer.Deserialize(reader); } finally { if (reader != null) reader.Close(); } } 

Example

 // Write the list of salesman objects to file. WriteToXmlFile<Customer>("C:\TheGarage.txt", customer); // Read the list of salesman objects from the file back into a variable. Customer customer = ReadFromXmlFile<Customer>("C:\TheGarage.txt"); 
0
source

All Articles