Click here to Skip to main content
11,629,614 members (65,940 online)
Click here to Skip to main content

Serialize custom collections of CollectionBase

, 15 Jan 2004 CPOL 93.8K 207 22
Rate this:
Please Sign up or sign in to vote.
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, serialize, deserialize of 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 derrive 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


'-------------------------------------------
'derrived 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


'-----------------------------------------------
'derrived collection item
'
Option Explicit On 
Option Strict On

Public Class Yitem
    Inherits cItem

End Class


'--------------------------------------------
'derrived collection item

'NOTE: XmlInclude attribute is not included on cItem,
'This was done to demo Serialize/Deserialize 
'unknown derrived 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 derrived "+ _
   "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 derrived 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 x
     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 x
     End Try
  End Function

End Class

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Eric Paul Schneider
Software Developer (Senior)
United States United States
Software Engineer, Finance market, VB5/6/NET/JAVA/C/C++.

You may also be interested in...

Comments and Discussions

 
GeneralSpecifying derived types at runtime Pin
solublefish31-Dec-04 10:32
membersolublefish31-Dec-04 10:32 
GeneralRe: Specifying derived types at runtime Pin
eschneider10031-Dec-04 16:52
membereschneider10031-Dec-04 16:52 
GeneralSerialization for ViewState Pin
drazz7522-May-04 11:44
memberdrazz7522-May-04 11:44 
GeneralRe: Serialization for ViewState Pin
eschneider10024-May-04 15:18
membereschneider10024-May-04 15:18 
GeneralRe: Serialization for ViewState Pin
lumonis9-Dec-05 18:53
memberlumonis9-Dec-05 18:53 
QuestionRe: Serialization for Web Service Pin
Renz8110-Jan-07 1:52
memberRenz8110-Jan-07 1:52 
AnswerRe: Serialization for Web Service Pin
eschneider10024-Oct-07 12:17
membereschneider10024-Oct-07 12:17 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150723.1 | Last Updated 16 Jan 2004
Article Copyright 2004 by Eric Paul Schneider
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid