August 11, 2010

ISerializable - Serializing objects

Serializing is a mechanism to create a text/binary version of your objects state, this can be saved or sent somewhere and then deserialized back into the instance again.
i.e. The member variables of your Type get written somewhere with their values of the instance of your Type.

e.g.
Here's the class who's instance I want to recreate somewhere else or at a later time.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleClass
{
public class Class1
{
public int _myMemberVar;

///
/// required for serialization
///
public Class1()
{
_myMemberVar = 0;
}

public Class1(int value)
{
_myMemberVar = value;
}
}
}

Here's a class which Serializes the instance of the class above with the XMLSerializer. The version below writes the XML version of the instance to the Console, you could replace the
using (Stream str = Console.OpenStandardOutput())
with a FileStream of some sort to write the XML to file.
This results in

www.w3.org/2001/XMLSchema">

<_mymembervar>10



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Xml.Serialization;

namespace CallMySimpleClass
{
class Program
{
static void Main(string[] args)
{
SimpleClass.Class1 c = new SimpleClass.Class1(10);

string result = Serialize(c);
Console.WriteLine(result);
}
static string Serialize(object o)
{
string result = null;
using (Stream str = Console.OpenStandardOutput())
{
XmlSerializer x = new XmlSerializer(typeof(SimpleClass.Class1));
x.Serialize(str, o);
}
return result;
}
}
}




So that's how the default Serialization works but what if you want to customize how Serialize works.To do this you can either make members Serializable and NonSerialiazed by putting the [Serializable] and [NonSerialized] attributes on your Types and members (Note: these only work when using the Formatters .net gives you BinaryFormatter and SoapFormatter).Or you can take over the process completely buy making the Type you want to serialize implement ISerializable.


ISerializable:


No comments: