Serialization in C#
Oftentimes, we need to store objects in physical storage so they can be read back and converted back to an object. The process of storing an object in a physical storage is called serialization. The process of reading a serialized object back into memory is deserialization.
In simple words, serialization in C# is a process of storing the object instance in a persistent storage. Serialization stores the state of objects, i.e., member variable values, to persistent storage such as a disk. Deserialization is the reverse of serialization. It is a process of reading objects from a file where they have been stored. In this code sample, we will see how to serialize and deserialize objects using C#.
Here is how serialization works. Image source: Microsoft Docs.
Namespaces involved
The following namespaces are involved in the serialization process.
- System.Runtime.Serialization
- System.Runtime.Serialization.Formatters.Binary
Example 1
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class SerialTest {
public void SerializeNow() {
ClassToSerialize c = new ClassToSerialize();
File f = new File("temp.dat");
Stream s = f.Open(FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(s, c);
s.Close();
}
public void DeSerializeNow() {
ClassToSerialize c = new ClassToSerialize();
File f = new File("temp.dat");
Stream s = f.Open(FileMode.Open);
BinaryFormatter b = new BinaryFormatter();
c = (ClassToSerialize) b.Deserialize(s);
Console.WriteLine(c.name);
s.Close();
}
public static void Main(string[] s) {
SerialTest st = new SerialTest();
st.SerializeNow();
st.DeSerializeNow();
}
}
public class ClassToSerialize {
public int age = 100;
public string name = "bipin";
}
Explanation
Here we have our own class named ClassToSerialize. This class has two public variables, name, and age, with some default values. We will write this class to a disk file (temp.dat) using the SerializeTest class.
SerializeTest class has two methods SerializeNow() and DeSerializeNow(), which perform the task of serialization and deserialization, respectively.
The general steps for serializing are as follows.
- Create an instance of a File that will store serialized objects.
- Create a stream from the file object.
- Create an instance of BinaryFormatter.
- Call the serialize method of the instance, passing it stream and object to serialize.
The steps for de-serializing the object are similar. The only change is that you need to call the deserialize method of the BinaryFormatter object.
Now, let us see an example where we have used a 'real' class with public and shared members and properties to encapsulate them. The class also uses another supporting class. This is just to make clear that if your class contains further classes, all the classes in the chain will be serialized.
Example 2
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class SerialTest {
public void SerializeNow() {
ClassToSerialize c = new ClassToSerialize();
c.Name = "bipin";
c.Age = 26;
ClassToSerialize.CompanyName = "xyz";
File f = new File("temp.dat");
Stream s = f.Open(FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(s, c);
s.Close();
}
public void DeSerializeNow() {
ClassToSerialize c = new ClassToSerialize();
File f = new File("temp.dat");
Stream s = f.Open(FileMode.Open);
BinaryFormatter b = new BinaryFormatter();
c = (ClassToSerialize) b.Deserialize(s);
Console.WriteLine("Name :" + c.Name);
Console.WriteLine("Age :" + c.Age);
Console.WriteLine("Company Name :" + ClassToSerialize.CompanyName);
Console.WriteLine("Company Name :" + c.GetSupportClassString());
s.Close();
}
public static void Main(string[] s) {
SerialTest st = new SerialTest();
st.SerializeNow();
st.DeSerializeNow();
}
}
public class ClassToSerialize {
private int age;
private string name;
static string companyname;
SupportClass supp = new SupportClass();
public ClassToSerialize() {
supp.SupportClassString = "In support class";
}
public int Age {
get {
return age;
}
set {
age = value;
}
}
public string Name {
get {
return name;
}
set {
name = value;
}
}
public static string CompanyName {
get {
return companyname;
}
set {
companyname = value;
}
}
public string GetSupportClassString() {
return supp.SupportClassString;
}
}
public class SupportClass {
public string SupportClassString;
}
Example 3
The final example shows how to serialize an array of objects.
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class SerialTest {
public void SerializeNow() {
ClassToSerialize[] c = new ClassToSerialize[3];
c[0] = new ClassToSerialize();
c[0].Name = "bipin";
c[0].Age = 26;
c[1] = new ClassToSerialize();
c[1].Name = "abc";
c[1].Age = 75;
c[2] = new ClassToSerialize();
c[2].Name = "pqr";
c[2].Age = 50;
ClassToSerialize.CompanyName = "xyz";
File f = new File("temp.dat");
Stream s = f.Open(FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(s, c);
s.Close();
}
public void DeSerializeNow() {
ClassToSerialize[] c;
File f = new File("temp.dat");
Stream s = f.Open(FileMode.Open);
BinaryFormatter b = new BinaryFormatter();
c = (ClassToSerialize[]) b.Deserialize(s);
Console.WriteLine("Name :" + c[2].Name);
Console.WriteLine("Age :" + c[2].Age);
Console.WriteLine("Company Name :" + ClassToSerialize.CompanyName);
s.Close();
}
public static void Main(string[] s) {
SerialTest st = new SerialTest();
st.SerializeNow();
st.DeSerializeNow();
}
}
public class ClassToSerialize {
private int age;
private string name;
static string companyname;
public int Age {
get {
return age;
}
set {
age = value;
}
}
public string Name {
get {
return name;
}
set {
name = value;
}
}
public static string CompanyName {
get {
return companyname;
}
set {
companyname = value;
}
}
}