What is Serialization? What is serializable attribute used for?
Serialization - The process of converting an object into a stream of bytes. This stream of bytes
can be persisted. Deserialization is an opposite process, which involves converting a stream of bytes into
an object. Serialization is used usually during remoting (while transporting objects) and to persist file
objecst & database objects.
.NET provides 2 ways for serializtion 1) XmlSerializer and 2) BinaryFormatter/SoapFormatter
The XmlSerializer is used for Web Services. The BinaryFormatter & SoapFormatter is used for Remoting.
While using XmlSerializer, it is required that the target class has parameter less constructors, has
public read-write properties and has fields that can be serialized. The XmlSerializer has good support
for XML documents. It can be used to construct objects from existing XML documents. The XmlSerializer
enables us to serialize and deserialize objects to an XML format.
SoapFormatter enables us to serialize & deserialize objects to SOAP format. They can serialize
private and public fields of a class. The target class must be marked with the Serializable attribute. On
deserialization, the constructor of the new object is not invoked.
The BinaryFormatter has the same features as the SoapFormatter except that it formats data into
binary format. The BinaryForamatter (and the SoapFormatter) has two main methods. Serialize and Deserialize.
To serialize an object, we pass an instance of the stream and the object to the Serialize method. To
Deserialize an object, you pass an instance of a stream to the Deserialize method.
You can use the BinaryFormatter to serialize many, but not all, classes in the .NET Framework. For example,
you can serialize ArrayLists, DataSets, and Arrays but not other objects, such as DataReaders or TextBox
controls. To serialize a class, the class must have the Serializable attribute or implement the ISerializable
interface.
Note that the XmlSerializer captures only the public members of the class, whereas the BinaryFormatter
& the SoapFormatter captures both the public & private members of the class. The output using the
BinaryFormatter is quite compact, as the information is in binary format, whereas the XmlSerializer
format is filled with XML tags. See example below...
Imports System.IOImports System.Runtime.Serialization.Formatters.Binary
Dim colArrayList As ArrayListDim
objFileStream As FileStreamDim
objBinaryFormatter As BinaryFormattercolArrayList = New ArrayList()
colArrayList.Add( "Whisky")
colArrayList.Add( "Vodka")
colArrayList.Add( "Brandy")
objFileStream = New FileStream(MapPath("C:\myArrayList.data"), FileMode.Create)
objBinaryFormatter = New BinaryFormatterobjBinaryFormatter.Serialize(objFileStream, colArrayList)objFileStream.Close()
Here we see that an instance of the file stream (objFileStream) and an instance of the object (colArrayList)
is passed to the Serialize method of the BinaryFormatter object (objBinaryFormatter). We also end up creating a
file by the name myArrayList.data on our hard-drive.In order to deserialize an object, see the code below…
Dim colArrayList As ArrayListDim objFileStream As FileStreamDim
objBinaryFormatter As BinaryFormatterDim strItem As String
objFileStream = New FileStream( MapPath("myArrayList.data"), FileMode.Open )
objBinaryFormatter = New BinaryFormatter
colArrayList = CType( objBinaryFormatter.Deserialize( objFileStream ), ArrayList )
objFileStream.Close()
For Each strItem In colArrayList
Response.Write( " " & strItem )
Next
Here, CType takes in two parameters, the first parameter is the serialized object in the file stream format,
and the second parameter is the desired type. Finally, the page iterates through all the elements of the
ArrayList and displays the value of each element.
XmlSerializer does not serialize instances of classes like Hashtable which implement the IDictionary
interface.
Serializable - This is a class attribute. When we use this attribute with a class, an
instance of this class can be taken in whatever state it is, and write it to a disk. The class
can then be deserialized, and the class will act as if it is simply stored in the memory.
1
2
3
4
5
6
7
8
9
10
11
12&n