Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Serialize Custom Collections of CollectionBase

0.00/5 (No votes)
31 Jan 2019 1  
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

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here