Listing 12.13 shows a class that describes books. The Book class is quite trivial, except that each book can have any number of authors. The authors are stored in an array of Book.Author objects.
Listing 12.13: Book Class
The following statements create a new Book object, which includes three authors:
Private BK0 As New Book Dim authors(2) As Book.Author authors(0) = New Book.Author authors(0).FirstName = "Author1 First" authors(0).LastName = "Author1 Last" authors(1) = New Book.Author authors(1).FirstName = "Author2 First" authors(1).LastName = "Author2 Last" authors(2) = New Book.Author authors(2).FirstName = "Author3 First" authors(2).LastName = "Author3 Last" BK0.Title = "Book Title" BK0.Pages = 234 BK0.Price = 29.95 BK0.Authors = authorsCode language: PHP (php)
Let’s see how to serialize arrays of objects in XML format, starting with a hard rule: The array to be serialized must be typed. All the elements of the array should have the same type, which must match the type you pass to the constructor of the XmlSerializer class. You can’t create an array of objects and store objects of different types to it. No warning will be issued at design time, but a runtime exception will be thrown as soon as your code reaches the Serialize method. The XmlSerializer is constructed for a specific type of object, and any given instance of this class can handle objects of the specific type and nothing else.
To serialize the Book objects created with the preceding statements, we’ll first create an array of the Book type and store a few properly initialized instances of the Book class to its elements. Then we’ll pass this array to the Serialize method of the XmlSerializer class, as shown in Listing 12.14.
Listing 12.14: XML Serialization of an Array of Objects
Private Sub bttnSaveArrayXML Click(...)Handles bttnSaveArrayXML.Click Me.Cursor = Cursors.WaitCursor Dim AllBooks(3) As Book AllBooks(0) = BK0 AllBooks(1) = BK1 AllBooks(2) = BK2 AllBooks(3) = BK3 Dim serializer As New XmlSerializer(AllBooks.GetType) Dim FS As FileStream Try FS = New FileStream("..\SerializedXMLArray.xml", _ FileMode.Create) serializer.Serialize(FS, AllBooks) Catch exc As Exception MsgBox(exc.InnerException.ToString) Exit Sub Finally FS.Close() End Try Me.Cursor = Cursors.Default bttnLoadArrayXML.Enabled = True TextBox1.Clear() TextBox1.Text = _ "Array of Book objects saved in file SerializedXMLArray.xml" End SubCode language: PHP (php)
The XmlSerializer class’s constructor accepts as an argument the array type. Because the array is typed, it can figure out the type of custom objects it will serialize.
There’s a substantial overhead the first time you create an instance of the XmlSerializer class, but the process isn’t repeated during the course of the application. There is overhead because the CLR creates a temporary assembly for serializing and deserializing the specific type. This assembly, however, remains in memory for the course of the application, and the initial overhead won’t recur. This means that although there will be an additional delay of a couple of seconds when the application starts (or whenever you load the settings), you can persist the class with the application’s configuration every time the user changes one of the settings without any performance penalty.