Notes
Serialization
The easiest way to make a class serializable is to mark it with the
Serializable attribute as follows.[Serializable] public class MyObject { public int n1 = 0; public int n2 = 0; public String str = null; } The code example below shows how an instance of this class can be serialized to a file. MyObject obj = new MyObject(); obj.n1 = 1; obj.n2 = 24; obj.str = "Some String"; IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(stream, obj); stream.Close(); This example uses a binary formatter to do the serialization. All you
need to do is create an instance of the stream and the formatter you intend
to use, and then call the Serialize method on the formatter. The
stream and the object to serialize are provided as parameters to this call.
Although not explicitly demonstrated in this example, all member variables
of a class will be serialized — even variables marked as private. In this
aspect, binary serialization differs from the
Restoring the object back to its former state is just as easy. First,
create a stream for reading and a
IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read); MyObject obj = (MyObject) formatter.Deserialize(stream); stream.Close(); // Here's the proof. Console.WriteLine("n1: {0}", obj.n1); Console.WriteLine("n2: {0}", obj.n2); Console.WriteLine("str: {0}", obj.str); The BinaryFormatter used above is very efficient and produces a compact byte stream. All objects serialized with this formatter can also be deserialized with it, which makes it an ideal tool for serializing objects that will be deserialized on the .NET platform. It is important to note that constructors are not called when an object is deserialized. This constraint is placed on deserialization for performance reasons. However, this violates some of the usual contracts the runtime makes with the object writer, and developers should ensure they understand the ramifications when marking an object as serializable. If portability is a requirement, use the SoapFormatter instead. Simply replace the BinaryFormatter in the code above with SoapFormatter, and call Serialize and Deserialize as before. This formatter produces the following output for the example used above. <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP- ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle= "http://schemas.microsoft.com/soap/encoding/clr/1.0" "http://schemas.xmlsoap.org/soap/encoding/" xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile"> <SOAP-ENV:Body> <a1:MyObject id="ref-1"> <n1>1</n1> <n2>24</n2> <str id="ref-3">Some String</str> </a1:MyObject> </SOAP-ENV:Body> </SOAP-ENV:Envelope> It is important to note that the Serializable attribute cannot be
inherited. If you derive a new class from public class MyStuff : MyObject { public int n3; } Using the Serializable attribute is convenient, but it has limitations as demonstrated above. Refer to the Serialization Guidelines for information about when you should mark a class for serialization; serialization cannot be added to a class after it has been compiled. |