While the example above shows one way to implement ISerializable, it is often better in C# to implement ISerializable.GetObjectData explicity and have that call a protected method or in Visual Basic implement ISerializable.GetObjectData directly using a protected method. This saves you from polluting your class's public API with methods that consumers will never need to call directly.
The following example shows a class that does this.
[C#]
using System;
using System.Security.Permissions;
using System.Runtime.Serialization;
namespace Samples
{
[Serializable]
public class Book : ISerializable
{
private string _Text;
public Book(string text)
{
if (text == null)
throw new ArgumentNullException("text");
_Text = text;
}
protected Book(SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException("info");
_Text = info.GetString("Text");
}
public string Text
{
get { return _Text; }
}
protected virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Text", _Text);
}
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException("info");
GetObjectData(info, context);
}
}
}
[Visual Basic]
Imports System
Imports System.Security.Permissions
Imports System.Runtime.Serialization
Namespace Samples
<Serializable()> _
Public Class Book
Implements ISerializable
Private _Text As String
Public Sub New(ByVal text As String)
If (text Is Nothing) Then Throw New ArgumentNullException("text")
_Text = text
End Sub
Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
If (info Is Nothing) Then Throw New ArgumentNullException("info")
_Text = info.GetString("Text")
End Sub
Public ReadOnly Property Text() As String
Get
Return _Text
End Get
End Property
<SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.SerializationFormatter)> _
Protected Overridable Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) _
Implements ISerializable.GetObjectData
If (info Is Nothing) Then Throw New ArgumentNullException("info")
info.AddValue("Text", _Text)
End Sub
End Class
End Namespace