XmlSerializer Entity Model mit Daten - Fehler beim Reflektieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    XmlSerializer Entity Model mit Daten - Fehler beim Reflektieren

    Guten Morgen zusammen,

    habe leider noch Probleme mit dem Speichern und komme momentan nicht weiter. Hab das Thema https://www.vb-paradise.de/index.php/Thread/91975-List-of-Typ-in-xml-Datei-speichern/ schon durchforstet, aber finde meinen Fehler noch nicht. Daher dazu ein neues Thema, mit der Hoffnung auf Hilfe :)

    So sieht es aus: Ich möchte die Struktur und Daten einzelnen Tabellen in einer XML Datei Speichern und später wieder einlesen. Ein Backup eben. Dazu habe ich folgendes:

    Eine Klasse für die Backupsstruktur mit den Tabellen, hier mal nur eine. Alle nötigen Tabellen habe ich als Entity Data Model eingebunden.

    VB.NET-Quellcode

    1. <Serializable()> Public Class Backup
    2. Sub New()
    3. End Sub
    4. Private myTabelle1List As List(Of Tabelle1)
    5. Public Property myTabelle1List As List(Of Tabelle1)
    6. Get
    7. Return myTabelle1List
    8. End Get
    9. Set(value As List(Of myTabelle1))
    10. myTabelle1List = value
    11. End Set
    12. End Property
    13. End Class


    Die generierte Klasse für die Tabelle:

    VB.NET-Quellcode

    1. Partial Public Class Tabelle1
    2. Public Property Id As Integer
    3. Public Overridable Property Test As ICollection(Of Tabelle2)= New HashSet(Of Tabelle2)
    4. End Class


    Nun baue ich mir die Daten zusammen:

    VB.NET-Quellcode

    1. Dim tmpBackup As New Backup
    2. tmpBackup.Tabelle1List = Dbcon.Database.SqlQuery(Of Tabelle1)("SELECT * FROM Tabelle1").ToList


    Und ab in die XML Datei

    VB.NET-Quellcode

    1. Dim writer As New XmlSerializer(GetType(Backup))
    2. Dim file As New StreamWriter("Backup.xml", False)
    3. writer.Serialize(file, tmpBackup)
    4. file.Close()


    Ich bekomme aber immer die Fehlermeldung:

    System.InvalidOperationException: Fehler beim Reflektieren des Types 'Connection.Tabelle1....Das Element ... kann nicht serialisiert werden, da es eine Schnittstelle ist.

    Bin am Montag morgen noch nicht wach für sowas :)

    Ich glaube der Fehler liegt hier aber wieso.

    Quellcode

    1. Public Overridable Property Test As ICollection(Of Tabelle2)= New HashSet(Of Tabelle2)


    THX 4 ALL

    CyberDannen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „CyberDannen“ ()

    CyberDannen schrieb:

    kann nicht serialisiert werden, da es eine Schnittstelle ist.
    Steht doch da.
    Auch wenn das Designer-genmeriert ist, probier mal dies:

    VB.NET-Quellcode

    1. Public Overridable Property Test As HashSet(Of Tabelle2) = New HashSet(Of Tabelle2)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was du da machst, ist folgendes: Du hast eine lokale Variable vom Typ einer Klasse und eine Property, welche du mit Get "returnst" und per Set "setzt". Was du aber vergessen hast, ist die lokale Variable zu instanziieren (also ein New zu verwenden).
    Meines Wissens nach ist das das Selbe, als wenn du die Property gleich weglässt und nur auf die lokale Variable (welche in dem Fall dann als Public markiert ist) zugreifst. Das kann nicht gehen.

    Mal ganz davon abgesehen, dein Code kann nicht mal kompillieren. Wenn ich den Code, wie in deinem ersten Post, kopiere und bei mir in einer VB-Datei einfüge, dann wird mir nicht nur im Return-Wert das myTabelle1List grün unterringelt "Die myTabelle1List wird verwendet bevor ihr ein Wert zugewiesen wird. Zur Laufzeit kann eine Nullverweisausnahme auftreten." Des weiteren (da VB NICHT Case-sensitive ist - für VB ein kleines a einem großen A, und anders rum, entspricht), erkennt der Compiler keinen Unterschied zwischen der lokalen myTabelle1List-Variable und der Public Property myTabelle1List ("myTabelle1List wurde bereits als "Private myTabelle1List As List(Of Tabelle1)" in dieser class definiert")
    Und drittens: in deinem Setter-Bereich hast du als Wert für value List(Of myTabelle1) - da es die Klasse myTabelle1 nicht gibt, kann dieser Code nicht gehen.

    Eine Frage deswegen von mir: Schreibst du das Programm mit Notepad(++)?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell