Benutzer mit den meisten Antworten
Serialisierung von geerbten Klassen

Frage
-
Hallo Leute,
wie muss ich es anstellen, dass das Serialisieren einer geerbten Klasse (cChild) funktioniert?
Mit cParent funktioniert es.
Imports System.Text Imports System.Xml Imports System.Xml.Serialization Imports System.Collections.ObjectModel Public Module Module1 Sub Main() Dim col As New Collection(Of cParent) 'col.Add(New cParent())'mit cParent kann serialisiert werden col.Add(New cChild()) 'mit cChild kann nicht serialisiert werden Dim o = New cClass(col) Dim s = SerializeToXML(o) End Sub Public Class cClass Public _col As Collection(Of cParent) Public Sub New() End Sub Public Sub New(ByVal col As Collection(Of cParent)) _col = col End Sub End Class 'Elternklasse Public Class cParent End Class 'Kindklasse Public Class cChild Inherits cParent End Class 'serialisiert ein Objekt in einen XML-String Public Function SerializeToXML(ByVal o As Object) As String Dim SB As New StringBuilder Dim XWS As New XmlWriterSettings Dim XSER As New XmlSerializer(o.GetType) XWS.CheckCharacters = False Using XW As XmlWriter = XmlWriter.Create(SB, XWS) XSER.Serialize(XW, o) End Using Return SB.ToString End Function End Module
Vielen Dank im Voraus
Christian Tauschek
- Bearbeitet Christian Tauschek Donnerstag, 16. November 2017 08:14
Antworten
-
Hi Christian,
also bei mir erscheint bei Deinem Code der folgende Fehler (incl. InnerExceptions):System.InvalidOperationException: Beim Generieren des XML-Dokuments ist ein Fehler aufgetreten. ---> System.InvalidOperationException: Der Typ ConsoleApp1.Module09+cChild wurde nicht erwartet. Verwenden Sie das XmlInclude- oder das SoapInclude-Attribut, um Typen anzugeben, die nicht statisch sind.
Da steht eindeutig, dass XmlInclude zu verwenden ist::
'Elternklasse '<XmlInclude(GetType(cChild))> Public Class cParent End Class 'Kindklasse Public Class cChild Inherits cParent End Class
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Als Antwort markiert Christian Tauschek Freitag, 17. November 2017 06:51
- Bearbeitet Peter Fleischer Freitag, 17. November 2017 12:54
Alle Antworten
-
Hi Christian,
hast es mal mit einem parameterlosen Konstruktor in der erbenden Klasse versucht. Das sollte auch als Fehlernachricht erscheinen. Welche Nachricht kommt denn?'Kindklasse Public Class cChild Inherits cParent Public Sub New() End Sub End Class
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks -
Hallo Peter,
wenn in cClass der parameterlose Konstruktor entfernt wird, dann kommt die Meldung: ''serialisieren.Module1.cClass' kann nicht serialisiert werden, weil dafür kein parameterloser Konstruktor verfügbar ist.' (ich glaube, dass du das meinst)
In cChild oder cParent ist es egal, ob dieser vorhanden ist oder nicht. Im obigen Beispiel kommt beim Serialisieren mit cChild die Meldung: 'Beim Generieren des XML-Dokuments ist ein Fehler aufgetreten'
Christian Tauschek
- Bearbeitet Christian Tauschek Donnerstag, 16. November 2017 14:08
-
Hi Christian,
also bei mir erscheint bei Deinem Code der folgende Fehler (incl. InnerExceptions):System.InvalidOperationException: Beim Generieren des XML-Dokuments ist ein Fehler aufgetreten. ---> System.InvalidOperationException: Der Typ ConsoleApp1.Module09+cChild wurde nicht erwartet. Verwenden Sie das XmlInclude- oder das SoapInclude-Attribut, um Typen anzugeben, die nicht statisch sind.
Da steht eindeutig, dass XmlInclude zu verwenden ist::
'Elternklasse '<XmlInclude(GetType(cChild))> Public Class cParent End Class 'Kindklasse Public Class cChild Inherits cParent End Class
--
Viele Grüsse
Peter Fleischer (ehem. MVP)
Meine Homepage mit Tipps und Tricks
- Als Antwort markiert Christian Tauschek Freitag, 17. November 2017 06:51
- Bearbeitet Peter Fleischer Freitag, 17. November 2017 12:54