Visual Basic.NET 7.x (2002/03)Visual Studio .NET 2003.NET 1.1XMLIntermediateDevVisual StudioWindows.NETVisual Basic
Serialize Custom Collections of CollectionBase






3.32/5 (16 votes)
Basic demo on how to serialize and deserialize custom collections
Introduction
This is a simple demo on how to serialize and deserialize custom collections, while handling derived collection items. This version also demos, serializes, deserializes unknown derived types of cItem
(see Eitem
class).
Background
I wanted to be able to serialize using collections rather than arrays, allowing better type checking.
Using the Code
This page does not display all the code, but the basic structure. Download the application for a demo on usage of the objects.
'-----------------------------------------
'The abstract item
'
'NOTE: Notice the attributes on the Citem, these are all the
'derived types we plan to use in the collection
'
Option Explicit On
Option Strict On
Imports System.Xml.Serialization
'NOTE: If you derive from this clas, then add a
'XmlInclude attribute for the new class!
< _
XmlInclude(GetType(Yitem)), _
XmlInclude(GetType(XItem)), _
Serializable() _
> _
Public Class Citem
Private m_Id As Integer
Private m_Data As String
Public Property Id() As Integer
Get
Return m_Id
End Get
Set(ByVal value As Integer)
m_Id = value
End Set
End Property
Public Property Data() As String
Get
Return m_Data
End Get
Set(ByVal value As String)
m_Data = value
End Set
End Property
End Class
'-------------------------------------------
'derived collection item
'This one has an extra property for the demon
'to show differences in XML output
'
Option Explicit On
Option Strict On
Public Class XItem
Inherits cItem
Private m_D As Double
Public Property D() As Double
Get
Return m_D
End Get
Set(ByVal value As Double)
m_D = Value
End Set
End Property
End Class
'-----------------------------------------------
'derived collection item
'
Option Explicit On
Option Strict On
Public Class Yitem
Inherits cItem
End Class
'--------------------------------------------
'derived collection item
'NOTE: XmlInclude attribute is not included on cItem,
'This was done to demo Serialize/Deserialize
'unknown derived types of cItem
Option Explicit On
Option Strict On
Public Class Eitem
Inherits Citem
Private m_B As Double
Public Property B() As Double
Get
Return m_B
End Get
Set(ByVal value As Double)
m_B = value
End Set
End Property
End Class
'---------------------------------------------------
'The Collection
'
Option Explicit On
Option Strict On
Imports System.Xml
Imports System.IO
<Serializable()> _
Public Class MyCollection
Inherits System.Collections.CollectionBase
Public Overridable Function Add(ByVal value As cItem) As Integer
MyBase.List.Add(value)
End Function
Default Public Overridable Property Item(ByVal index As Integer) As cItem
Get
Return DirectCast(MyBase.List.Item(index), cItem)
End Get
Set(ByVal value As cItem)
MyBase.List.Item(index) = value
End Set
End Property
Public Shared Sub SerializeObject(ByVal filename As String, _
ByVal col As MyCollection, ByVal ExtraTypes() As System.Type)
Try
' Create a new XmlSerializer instance.
Dim s As New Xml.Serialization.XmlSerializer(_
GetType(MyCollection), ExtraTypes)
' Writing the XML file to disk requires a TextWriter.
Dim writer As New StreamWriter(filename)
' Serialize the object, and close the StreamWriter.
s.Serialize(writer, col)
writer.Close()
Catch x As System.InvalidOperationException
Throw New Exception("Check class cItem, all derived "+ _
"classes must be listed with the [ "+
"XmlInclude(GetType(derrivedClass)) ] attribute!")
End Try
End Sub
Public Shared Sub SerializeObject(ByVal filename As String, _
ByVal col As MyCollection)
Try
' Create a new XmlSerializer instance.
Dim s As New Xml.Serialization.XmlSerializer(GetType(MyCollection))
' Writing the XML file to disk requires a TextWriter.
Dim writer As New StreamWriter(filename)
' Serialize the object, and close the StreamWriter.
s.Serialize(writer, col)
writer.Close()
Catch x As System.InvalidOperationException
Throw New Exception("Check class cItem, all derived classes "+ _
"must be listed with the [ XmlInclude"+ _
"(GetType(derrivedClass)) ] attribute!")
End Try
End Sub
Public Shared Function DeserializeObject(ByVal filename As String, _
ByVal ExtraTypes() As System.Type) As MyCollection
Try
Dim fs As New IO.FileStream(filename, FileMode.Open)
Dim w As New Xml.Serialization.XmlSerializer( _
GetType(MyCollection), ExtraTypes)
Dim g As MyCollection = CType(w.Deserialize(fs), MyCollection)
fs.Close()
Return g
Catch x As Exception
Throw
End Try
End Function
Public Shared Function DeserializeObject(ByVal filename As String _
) As MyCollection
Try
Dim fs As New IO.FileStream(filename, FileMode.Open)
Dim w As New Xml.Serialization.XmlSerializer(GetType(MyCollection))
Dim g As MyCollection = CType(w.Deserialize(fs), MyCollection)
fs.Close()
Return g
Catch x As Exception
Throw
End Try
End Function
End Class
History
- 31st January, 2019: Initial version