Here is what works for me. It's fully flexible in regard to the order of the nodes.
Public Sub ReadXml(reader As System.Xml.XmlReader) Implements IXmlSerializable.ReadXml
reader.MoveToContent()
While True
Select Case reader.Name
Case "IntProperty"
IntProperty = CInt(reader.ReadString())
Case "BoolProperty"
BoolProperty = CBool(reader.ReadString())
Case "StringProperty"
StringProperty = reader.ReadString()
Case "ArrayProperty"
Dim arrayEntries As New List(Of ArrayEntry)
If Not reader.IsEmptyElement Then
While reader.Read()
If reader.Name <> "ArrayEntry" Then Exit While
Dim ar As New ArrayEntry
ar.MyAttr = reader.GetAttribute("MyAttr")
arrayEntries.Add(ar)
End While
End If
ArrayProperty = arrayEntries.ToArray()
End Select
If Not reader.Read() Then Exit While
End While
End Sub