Click here to Skip to main content
15,867,453 members
Articles / Programming Languages / XML

Serialize Custom Collections of CollectionBase

Rate me:
Please Sign up or sign in to vote.
3.32/5 (16 votes)
31 Jan 2019CPOL 116.3K   384   25   7
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.

VB.NET
'-----------------------------------------
'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, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
Software Engineer, .Net

Comments and Discussions

 
GeneralSpecifying derived types at runtime Pin
solublefish31-Dec-04 10:32
solublefish31-Dec-04 10:32 
GeneralRe: Specifying derived types at runtime Pin
Eric P Schneider31-Dec-04 16:52
Eric P Schneider31-Dec-04 16:52 
GeneralSerialization for ViewState Pin
drazz7522-May-04 11:44
drazz7522-May-04 11:44 
GeneralRe: Serialization for ViewState Pin
Eric P Schneider24-May-04 15:18
Eric P Schneider24-May-04 15:18 
Well, I had to look-up viewstate..

Sounds like you need to implement IStateManager?

Schneider

Schneider
GeneralRe: Serialization for ViewState Pin
lumonis9-Dec-05 18:53
lumonis9-Dec-05 18:53 
QuestionRe: Serialization for Web Service Pin
Renz8110-Jan-07 1:52
Renz8110-Jan-07 1:52 
AnswerRe: Serialization for Web Service Pin
Eric P Schneider24-Oct-07 12:17
Eric P Schneider24-Oct-07 12:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.