none
Serialisierung von geerbten Klassen RRS feed

  • 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


    Donnerstag, 16. November 2017 08:13

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




    Donnerstag, 16. November 2017 14:34

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

    Donnerstag, 16. November 2017 12:30
  • 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


    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




    Donnerstag, 16. November 2017 14:34