Allows an object to control its own serialization and deserialization.
Assembly: mscorlib (in mscorlib.dll)
Thetype exposes the following members.
Any class that might be serialized must be marked with the SerializableAttribute. If a class needs to control its serialization process, it can implement the interface. The Formatter calls the GetObjectData at serialization time and populates the supplied SerializationInfo with all the data required to represent the object. The Formatter creates a SerializationInfo with the type of the object in the graph. Objects that need to send proxies for themselves can use the FullTypeName and AssemblyName methods on SerializationInfo to change the transmitted information.
In the case of class inheritance, it is possible to serialize a class that derives from a base class that implements . In this case, the derived class should call the base class implementation of GetObjectData inside its implementation of GetObjectData. Otherwise, the data from the base class will not be serialized.
The interface implies a constructor with the signature constructor (SerializationInfo information, StreamingContext context). At deserialization time, the current constructor is called only after the data in the SerializationInfo has been deserialized by the formatter. In general, this constructor should be protected if the class is not sealed.
The order in which objects are deserialized cannot be guaranteed. For example, if one type references a type that has not been deserialized yet, an exception will occur. If you are creating types that have such dependencies, you can work around the problem by implementing the IDeserializationCallback interface and the OnDeserialization method.
The serialization architecture handles object types that extend MarshalByRefObject the same as types that extend Object. These types can be marked with the SerializableAttribute and implement the interface as any other object type. Their object state will be captured and persisted onto the stream.
When these types are being used through System.Runtime.Remoting, the remoting infrastructure provides a surrogate that preempts typical serialization and instead serializes a proxy to the MarshalByRefObject. A surrogate is a helper that knows how to serialize and deserialize objects of a particular type. The proxy, invisible to the user in most cases, will be of type ObjRef.
As a general design pattern, it would be unusual for a class to be both marked with the serializable attribute and extend MarshalByRefObject. Developers should think carefully about the possible serialization and remoting scenarios when combining these two characteristics. One example where this might be applicable is with a MemoryStream. While the base class of MemoryStream (Stream) extends from MarshalByRefObject, it is possible to capture the state of a MemoryStream and restore it at will. It might, therefore, be meaningful to serialize the state of this stream into a database and restore it at some later point in time. However, when used through remoting, an object of this type would be proxied.Notes to Implementers
Implement this interface to allow an object to take part in its own serialization and deserialization.
The following code example demonstrates the use of the interface to define custom serialization behavior for a class.
Imports System.Text Imports System.IO ' Add references to Soap and Binary formatters. Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters.Soap Imports System.Runtime.Serialization <Serializable()> _ Public Class MyItemType Implements ISerializable ' Empty constructor required to compile. Public Sub New() End Sub ' The value to serialize. Private myProperty_value As String Public Property MyProperty() As String Get Return myProperty_value End Get Set(value As String) myProperty_value = value End Set End Property ' Implement this method to serialize data. The method is called ' on serialization. Public Sub GetObjectData(info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData ' Use the AddValue method to specify serialized values. info.AddValue("props", myProperty_value, GetType(String)) End Sub ' The special constructor is used to deserialize values. Public Sub New(info As SerializationInfo, context As StreamingContext) ' Reset the property value using the GetValue method. myProperty_value = DirectCast(info.GetValue("props", GetType(String)), String) End Sub End Class ' This is a console application. Public Class Test Public Shared Sub Main() ' This is the name of the file holding the data. You can use any file extension you like. Dim fileName As String = "dataStuff.myData" ' Use a BinaryFormatter or SoapFormatter. Dim formatter As IFormatter = New BinaryFormatter() ' Dim formatter As IFormatter = New SoapFormatter() Test.SerializeItem(fileName, formatter) ' Serialize an instance of the class. Test.DeserializeItem(fileName, formatter) ' Deserialize the instance. Console.WriteLine("Done") Console.ReadLine() End Sub Public Shared Sub SerializeItem(fileName As String, formatter As IFormatter) ' Create an instance of the type and serialize it. Dim myType As New MyItemType() myType.MyProperty = "Hello World" Dim fs As New FileStream(fileName, FileMode.Create) formatter.Serialize(fs, myType) fs.Close() End Sub Public Shared Sub DeserializeItem(fileName As String, formatter As IFormatter) Dim fs As New FileStream(fileName, FileMode.Open) Dim myType As MyItemType = DirectCast(formatter.Deserialize(fs), MyItemType) Console.WriteLine(myType.MyProperty) End Sub End Class