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.
Option Explicit On
Option Strict On
Imports System.Xml.Serialization
< _
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
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
Option Explicit On
Option Strict On
Public Class Yitem
Inherits cItem
End Class
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
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
Dim s As New Xml.Serialization.XmlSerializer(_
GetType(MyCollection), ExtraTypes)
Dim writer As New StreamWriter(filename)
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
Dim s As New Xml.Serialization.XmlSerializer(GetType(MyCollection))
Dim writer As New StreamWriter(filename)
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