What is XML Serialization?
XML Serialisation is broadly similar to Binary Serialization except the file format is XML not Binary, goes without saying. There are a few changes, the references and using references for one. :-
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.IO;
All classes that are to be serialized must be identified by the attribute [Serializable]. Unlike Binary Serialization, you can not have constructors that take parameters, any attempt at doing so will cause an error.
// For our example, Date Of Birth is a complex class rather than a Date field.
public class clsDOB
{
public int Day;
public int Month;
public int Year;
}
public enum Nationality
{
[XmlEnum(Name="British")]
British,
[XmlEnum(Name = "American")]
American,
[XmlEnum(Name="French")]
France,
[XmlEnum(Name="Australian")]
Australian,
[XmlEnum(Name="German")]
German,
[XmlEnum(Name="Other")]
Other
}
[Serializable, XmlRoot(Namespace = "Human")]
class clsPerson
{
// A parameterless constructor is required whether you have a parameterised one or not.
public clsPerson(string strForename, string strSurname)
{
this.Forename = strForename;
this.Surname = strSurname;
this.DOB = new clsDOB();
}
public clsPerson()
{
this.DOB = new clsDOB();
}
// This function will not execute, it will compile but won't execute.
[OnDeserialized]
public void DisplayName(System.Runtime.Serialization.StreamingContext context)
{
Console.WriteLine("Hello {0} {1}", Forename, Surname);
}
[XmlElement]
public string Forename { get; set; }
[XmlAttribute]
public string Surname { get; set; }
// Must be an XML Element so that it can be properly serialized.
[XmlElement]
public clsDOB DOB { get; set; }
[XmlEnum]
Nationality m_CountryofBirth = Nationality.American ;
[XmlElement]
public Nationality CountryOfBirth
{
get { return m_CountryofBirth; }
set { m_CountryofBirth = value; } }
}
The methods [OnSerializing], [onDeserialized] etc will not run in an XML serialization. XML Serialization has attributes of its own to determine how data is stored.
Qualifier | Explanation |
[XMLAttribute] | The value will be an attribute on the "first" line. Only simple data types can be Attributes, properties that are a class must be elements. |
[XMLElement] | The item will be serialised to an XML Element, these can be either simple type or class object types. |
[XMLEnum] | Prodives the Element Name for an Enumeration Member of the object. |
[XmlRoot] | This names the XML. |
[XmlText] | Item will be serialized as XML Text |
[XmlType] | Name and namespace of the XML namespace. |
Now comes the fun part, the serialization which is really easy. In short, you define the formatter then write the object to a stream. If youlooked at the file that is created, you will find the information is relatively easy to understand.
class Program
{
static void Main(string[] args)
{
//Create Instance of object to be serialized.
clsPerson Person = new clsPerson();
Person.Forename = "Mister";
Person.Surname = "Developer";
Person.DOB.Day = 25;
Person.DOB.Month = 1;
Person.DOB.Year = 2011;
// Create serializer that will do the work.
XmlSerializer binFormat = new XmlSerializer(typeof (clsPerson));
// Open a stream where the serialized file will be stored.
using (Stream fptr = new FileStream("C:\\temp\\user.dat",
FileMode.Create, FileAccess.Write, FileShare.None))
{
binFormat.Serialize(fptr, Person);
}
Person = null;
// Deserialize the object.
using (Stream fptr = File.OpenRead("c:\\temp\\user.dat"))
{
// As we have an [OnDeserialized] function,
the forename + surname will be displayed on screen.
Person = (clsPerson)binFormat.Deserialize(fptr);
Console.WriteLine("Hello {0} {1} who is {2}", Person.Forename,
Person.Surname, Person.CountryOfBirth.ToString());
}
Console.ReadKey();
}
}
You will be able to read the user.dat file that is created. The above example will create the following xml file.
<?xml version="1.0"?>
<clsPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" Surname="Developer" xmlns="Human">
<Forename>Mister</Forename>
<DOB>
<Day>25</Day>
<Month>1</Month>
<Year>2011</Year>
</DOB>
<CountryOfBirth>American</CountryOfBirth>
</clsPerson>
Tags - .NET Serialization XML
Last Modified : June 2023