The following sample code illustrates how to implement support for both binary and SOAP serialization for an object derived from the abstract SubObjectBase class.
Refer to the .NET Framework's BinaryFormatter and SoapFormatter documentation.
Imports System.Runtime.Serialization Imports System.Drawing Imports Infragistics.Shared Imports Infragistics.Shared.Serialization Imports Infragistics.Win <Serializable()> Public Class MySerializableClass Inherits KeyedSubObjectBase Implements ISerializable Private enabled As Boolean = True Private height As Integer = 0 Private location As Point Private borderStyle As UIElementBorderStyle = UIElementBorderStyle.Solid Public Sub New(ByVal keyValue As String) MyBase.New(keyValue) End Sub ' Special de-serialization constructor. Private Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) ' Iterate over the entries. This is considerably faster ' than calling the various 'Get...' methods exposed by ' the SerializationInfo object for the following reasons: ' 1. Usually not every property is persisted. For example, ' an object might have 50 properties but only 5 that had ' non-default values when it was serialized out. ' 2. When you call a 'Get...' method, if the value was ' not persisted an exception is thrown which is ' relatively expensive. ' 3. Switch statements with strings are very efficient ' because they take advantage of string internment ' and are doing object reference comparisons instead ' of string comparisons. Dim entry As SerializationEntry For Each entry In info ' Use the DeserializeProperty static method to de-serialize ' properties. ' This works for both binary and SOAP formatters. ' Note: the last paramter into this method takes the ' defualt value that will be returned if there is a ' problem converting the value to the requested type. Select Case entry.Name Case "BorderStyle" Me.borderStyle = Utils.DeserializeProperty(entry, GetType(UIElementBorderStyle), Me.borderStyle) Case "Enabled" Me.enabled = Utils.DeserializeProperty(entry, GetType(Boolean), Me.enabled) Case "Height" Me.height = Utils.DeserializeProperty(entry, GetType(Integer), Me.height) Case "Key" Me.Key = Utils.DeserializeProperty(entry, GetType(String), Me.Key) Case "Location" Me.location = Utils.DeserializeProperty(entry, GetType(Point), Me.location) ' Use the protected const (defined in SubObjectBase) ' 'TagSerializationName' which was used by the ' 'SerializeTag' method. It has a value of "Tag". Case MySerializableClass.TagSerializationName ' Use SubObjectBase's DeserializeTag method to de-serialize the tag property. MyBase.DeserializeTag(entry) Case Else Debug.Assert(False, "Invalid entry in MySerializableClass de-serialization ctor") End Select Next End Sub ' Called to serialize the object Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData ' Use the SerializeProperty static method to serialize properties. ' This works for both binary and SOAP formatters If Not Me.borderStyle = UIElementBorderStyle.Solid Then Utils.SerializeProperty(info, "BorderStyle", Me.borderStyle) End If If Not Me.enabled Then Utils.SerializeProperty(info, "Enabled", Me.enabled) End If If Me.height <> 0 Then Utils.SerializeProperty(info, "Height", Me.height) End If If Not Me.location.IsEmpty Then Utils.SerializeProperty(info, "Location", Me.location) End If If Me.Key.Length > 0 Then Utils.SerializeProperty(info, "Key", Me.Key) End If ' Call the SubObjectBase's SerializeTag method which will only ' serialize the tag if it makes sense. MyBase.SerializeTag(info) End Sub End Class
using System; using System.Drawing; using System.Diagnostics; using System.Runtime.Serialization; using Infragistics.Shared; using Infragistics.Shared.Serialization; using Infragistics.Win; namespace SharedSnippets { [Serializable()] public class MySerializableClass : KeyedSubObjectBase, ISerializable { private UIElementBorderStyle borderStyle = UIElementBorderStyle.Solid; private bool enabled = true; private int height = 0; private Point location; public MySerializableClass( string key ) : base( key ) { } // Special de-serialization constructor. private MySerializableClass(SerializationInfo info, StreamingContext context) { // Iterate over the entries. This is considerably faster // than calling the various 'Get...' methods exposed by // the SerializationInfo object for the following reasons: // 1. Usually not every property is persisted. For example, // an object might have 50 properties but only 5 that had // non-default values when it was serialized out. // 2. When you call a 'Get...' method, if the value was // not persisted an exception is thrown which is // relatively expensive. // 3. Switch statements with strings are very efficient // because they take advantage of string internment // and are doing object reference comparisons instead // of string comparisons. foreach( SerializationEntry entry in info ) { switch (entry.Name) { // Use the DeserializeProperty static method to de-serialize // properties. // This works for both binary and SOAP formatters. // Note: the last paramter into this method takes the // defualt value that will be returned if there is a // problem converting the value to the requested type. case "BorderStyle": this.borderStyle = (UIElementBorderStyle)Utils.DeserializeProperty( entry, typeof(UIElementBorderStyle), this.borderStyle ); break; case "Enabled": this.enabled = (bool)Utils.DeserializeProperty( entry, typeof(bool), this.enabled ); break; case "Height": this.height = (int)Utils.DeserializeProperty( entry, typeof(int), this.height ); break; case "Key": this.Key = (string)Utils.DeserializeProperty( entry, typeof(string), this.Key ); break; case "Location": this.location = (Point)Utils.DeserializeProperty( entry, typeof(Point), this.location ); break; // Use the protected const (defined in SubObjectBase) // 'TagSerializationName' which was used by the // 'SerializeTag' method. It has a value of "Tag". case MySerializableClass.TagSerializationName: // Use SubObjectBase's DeserializeTag method to de-serialize the tag property. base.DeserializeTag(entry); break; default: { Debug.Assert( false, "Invalid entry in MySerializableClass de-serialization ctor" ); break; } } } } // Called to serialize the object void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { // Use the SerializeProperty static method to serialize properties. // This works for both binary and SOAP formatters. if (this.borderStyle != UIElementBorderStyle.Solid) Utils.SerializeProperty( info, "BorderStyle", this.borderStyle ); if (this.enabled != true) Utils.SerializeProperty( info, "Enabled", this.enabled ); if (this.height != 0) Utils.SerializeProperty( info, "Height", this.height ); if (!this.location.IsEmpty) Utils.SerializeProperty( info, "Location", this.location ); if (this.Key.Length > 0) Utils.SerializeProperty( info, "Key", this.Key ); // Call the SubObjectBase's SerializeTag method which will only // serialize the tag if it makes sense. base.SerializeTag(info); } } }
Target Platforms: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Server 2012, Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2