XML-Serialisierung einer von List Of(..typ..) abgeleiteten Klasse

23/04/2009 - 15:27 von Herbert Lukas | Report spam
Hallo zusammen,

ich habe eine serialisierbare Klasse, die von einer Liste ableitet (im
folgenden Beispiel einfach von einer Liste mit Strings):

Imports System.Xml.Serialization
Imports System.IO

<Serializable()> _
Public Class MyList
Inherits List(Of String)

' Name der Liste
Private mName As String
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property

' Serialisiert dieses Objekt in eine XML-Datei
Public Sub Save(ByVal fileName As String)

Dim xmlSerial As New XmlSerializer(GetType(MyList))
Dim sw As New StreamWriter(fileName)
xmlSerial.Serialize(sw, Me)
sw.Flush()
sw.Close()
End Sub
End Class

Diese Klasse verwende ich wie folgt:

...

' - Instanz erstellen
Dim list As New MyList

' - Beispieleintràge zufügen
list.Add("A")
list.Add("B")

' - Namen vergeben
list.Name = "Der Name"

' - Liste serialisieren
list.Save("C:\Temp\liste.xml")
...

Bei der Serialisierung wird nun leider die Property Name der Liste nicht mit
gespeichert. Die XML-datei sieht so aus:

<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>A</string>
<string>B</string>
</ArrayOfString>

Was mache ich falsch?

Danke im Voraus
Herbert
 

Lesen sie die antworten

#1 Thorsten Doerfler
26/04/2009 - 13:00 | Warnen spam
Herbert Lukas schrieb:
ich habe eine serialisierbare Klasse, die von einer Liste ableitet (im
folgenden Beispiel einfach von einer Liste mit Strings):

[...]

Bei der Serialisierung wird nun leider die Property Name der Liste nicht mit
gespeichert. Die XML-datei sieht so aus:

<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>A</string>
<string>B</string>
</ArrayOfString>

Was mache ich falsch?



Du machst nichts falsch. Es ist eine (von mehreren Einschrànkungen) des
XmlSerializers. Er behandelt diese Sammlungen einfach als Arrays und
ignoriert alles, was sich drum herum befindet. Wenn Du hier Deine
zusàtzliche Eigenschaft serialisieren möchtest, wàre eine Möglichkeit
IXmlSerializable zu implementieren und die serialisierung selbst zu steuern.

Anbei ein sehr einfaches Beispiel:

Public Class MyList
Inherits List(Of String)

Implements IXmlSerializable

' Name der Liste
Private mName As String
Public Property Name() As String
Get
Return mName
End Get
Set(ByVal value As String)
mName = value
End Set
End Property

' Serialisiert dieses Objekt in eine XML-Datei
Public Sub Save(ByVal fileName As String)

Dim xmlSerial As New XmlSerializer(GetType(MyList))
Dim sw As New StreamWriter(fileName)
xmlSerial.Serialize(sw, Me)
sw.Flush()
sw.Close()
End Sub

#Region "IXmlSerializable"
Public Function GetSchema() _
As System.Xml.Schema.XmlSchema _
Implements System.Xml.Serialization.IXmlSerializable.GetSchema

Return Nothing
End Function

Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) _
Implements System.Xml.Serialization.IXmlSerializable.ReadXml

Me.Name = reader.Item("Name")

reader.ReadToFollowing("Item")

While reader.LocalName = "Item"
Me.Add(reader.ReadElementContentAsString())
End While
End Sub

Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) _
Implements System.Xml.Serialization.IXmlSerializable.WriteXml

writer.WriteAttributeString("Name", Me.Name)

For Each Item As String In Me
writer.WriteElementString("Item", Item)
Next
End Sub
#End Region
End Class

Hier fehlen natürlich einige Dinge, wie die Berücksichtigung der
XmlAttribute etc.

Alternativ böten sich SoapFormatter oder BinaryFormatter zur
Serialisierung an, die diese Einschrànkung nicht haben.

Thorsten Dörfler
Microsoft MVP Visual Basic

vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/

Ähnliche fragen