.:: Wawan .Net - .NET News & Article ::..

Talking About All .NET Technology

Tuesday, February 21, 2006

What is serialization?

Serialization is the process of converting an object into a stream of bytes. Deserialization
is the opposite process, i.e. creating an object from a stream of bytes. Serialization/Deserialization
is mostly used to transport objects (e.g. during remoting), or to persist objects
(e.g. to a file or database).

Does the .NET Framework have in-built support for serialization?

There are two separate mechanisms provided by the .NET class library - XmlSerializer
and SoapFormatter/BinaryFormatter. Microsoft uses XmlSerializer for Web Services,
and SoapFormatter/BinaryFormatter for remoting. Both are available for use in
your own code.


I want to serialize instances of my class. Should I use XmlSerializer,
SoapFormatter or BinaryFormatter?


It depends. XmlSerializer has severe limitations such as the requirement that
the target class has a parameterless constructor, and only public read/write
properties and fields can be serialized. However, on the plus side, XmlSerializer
has good support for customising the XML document that is produced or consumed.
XmlSerializer's features mean that it is most suitable for cross-platform work,
or for constructing objects from existing XML documents.


SoapFormatter and BinaryFormatter have fewer limitations than XmlSerializer.
They can serialize private fields, for example. However they both require that
the target class be marked with the [Serializable] attribute, so like XmlSerializer
the class needs to be written with serialization in mind. Also there are some
quirks to watch out for - for example on deserialization the constructor of
the new object is not invoked.


The choice between SoapFormatter and BinaryFormatter depends on the application.
BinaryFormatter makes sense where both serialization and deserialization will
be performed on the .NET platform and where performance is important. SoapFormatter
generally makes more sense in all other cases, for ease of debugging if nothing
else.


Can I customise the serialization process?

Yes. XmlSerializer supports a range of attributes that can be used to configure
serialization for a particular class. For example, a field or property can be
marked with the [XmlIgnore] attribute to exclude it from serialization. Another
example is the [XmlElement] attribute, which can be used to specify the XML
element name to be used for a particular property or field.


Serialization via SoapFormatter/BinaryFormatter can also be controlled to some
extent by attributes. For example, the [NonSerialized] attribute is the equivalent
of XmlSerializer's [XmlIgnore] attribute. Ultimate control of the serialization
process can be acheived by implementing the the ISerializable interface on the
class whose instances are to be serialized.


Why is XmlSerializer so slow?

There is a once-per-process-per-type overhead with XmlSerializer. So the first
time you serialize or deserialize an object of a given type in an application,
there is a significant delay. This normally doesn't matter, but it may mean,
for example, that XmlSerializer is a poor choice for loading configuration settings
during startup of a GUI application.


Why do I get errors when I try to serialize a Hashtable?

XmlSerializer will refuse to serialize instances of any class that implements
IDictionary, e.g. Hashtable. SoapFormatter and BinaryFormatter do not have this
restriction.


XmlSerializer is throwing a generic "There was an error reflecting
MyClass" error. How do I find out what the problem is?


Look at the InnerException property of the exception that is thrown to get a
more specific error message.


Why am I getting an InvalidOperationException when I serialize an ArrayList?

XmlSerializer needs to know in advance what type of objects it will find in
an ArrayList. To specify the type, use the XmlArrayItem attibute like this:


public class Person

{

public string Name;

public int Age;

}


public class Population

{

[XmlArrayItem(typeof(Person))] public ArrayList People;

}

0 Comments:

Post a Comment

<< Home