vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Gizmo2011
Datum: 06.11.11 18:37

Hallo @all

ich bin neu hier und bin gerade dabei mein VB.NET(2010) Studium zu absolvieren.
Leider komme ich gerade nicht weiter vieleicht könnt ihr mir ja helfen.

Es geht um XML Serialisieren und deserialisieren.

Imports System
Imports System.Xml.Serialization
Imports System.IO
 
Public Class Teilnehmer
    Public tnrNummer As Integer
    Public Person As String
    Public Punkte As Single
End Class
 
Public Class Kurs
    Public Tnliste As String = "D:\xmlKursTeilnehmer.xml"
 
    Public Shared Sub Main()
        Dim xt As New Kurs
        Dim p As New Teilnehmer
        p.tnrNummer = "1001"
        p.Person = "Maximilian"
        p.Punkte = "90"
 
        'Wie bekomme ich 2 weitere Personen dazu? Hier liegt jetzt noch mein 
       ' Problem[u]
        xt.xmlSpeichern(p)
 
 
        Dim p1 As Teilnehmer
        p1 = xt.xmlLesen
        Console.WriteLine("{0,15}{1,8}{2,15}", "Tnr", "Name", "Punkte")
        Console.WriteLine("{0,16}{1,13}{2,5}", p.tnrNummer, p.Person, p.Punkte)
 
        Console.ReadLine()
    End Sub
 
    Private Sub xmlSpeichern(ByVal p As Teilnehmer)
        Dim meineSerialisierer As New XmlSerializer(GetType(Teilnehmer))
        Dim sw As New StreamWriter(Tnliste)
        meineSerialisierer.Serialize(sw, p)
        sw.Close()
    End Sub
 
    Private Function xmlLesen() As Teilnehmer
        Dim meineSerialisierer As New XmlSerializer(GetType(Teilnehmer))
        Dim sr As New StreamReader(Tnliste)
        Dim p As Teilnehmer
        p = meineSerialisierer.Deserialize(sr)
        sr.Close()
        Return p
    End Function
End Class
Alle 3 Personen mit Nummer und Namen und Punkte sollen angezeigt werden

Vieleicht könnt ihr mir helfen wäre euch super DANKBAR

MFG Gizmo

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Manfred X
Datum: 07.11.11 00:11

Hallo!

Nimm eine Liste.

Option Strict On
Imports System.Xml.Serialization
Imports System.Collections.Generic
 
Public Class Kurs
    Public Tnliste As String = "F:\daten\xmlKursTeilnehmer.xml"
 
    Structure Teilnehmer
        Public tnrNummer As String
        Public Person As String
        Public Punkte As String
    End Structure
 
    Shared Personen As New System.Collections.Generic.List(Of Teilnehmer)
 
    Public Shared Sub Main()
 
        Dim xt As New Kurs
        Dim p As New Teilnehmer
        p.tnrNummer = "1001"
        p.Person = "Maximilian"
        p.Punkte = "90"
 
        Personen.Add(p)
 
        p.tnrNummer = "1002"
        p.Person = "Friedrich"
        p.Punkte = "82"
 
        Personen.Add(p)
 
        'Wie bekomme ich 2 weitere Personen dazu? Hier liegt jetzt noch mein 
        ' Problem
        xt.xmlSpeichern(Personen)
 
        Dim Personen2 As List(Of Teilnehmer)
        Personen2 = xt.xmlLesen
        Console.WriteLine("{0,15}{1,8}{2,15}", "Tnr", "Name", "Punkte")
        With Personen2
            For i As Integer = 0 To Personen2.Count - 1
                With .Item(i)
                    Console.WriteLine("{0,16}{1,13}{2,5}", .tnrNummer, .Person, _
                      .Punkte)
                End With
            Next i
        End With
 
        Console.ReadLine()
    End Sub
 
    Private Sub xmlSpeichern(ByVal personen As List(Of Teilnehmer))
        Dim meineSerialisierer As New XmlSerializer(GetType(List(Of _
          Teilnehmer)))
        Dim sw As New IO.StreamWriter(Tnliste)
        meineSerialisierer.Serialize(sw, personen)
        sw.Close()
    End Sub
 
    Private Function xmlLesen() As List(Of Teilnehmer)
        Dim meineSerialisierer As New XmlSerializer(GetType(List(Of _
          Teilnehmer)))
        Dim sr As New IO.StreamReader(Tnliste)
        Dim personen As List(Of Teilnehmer)
        personen = CType(meineSerialisierer.Deserialize(sr), List(Of _
          Teilnehmer))
        sr.Close()
        Return personen
    End Function
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 16.05.14 08:25

Hallo
Soweit habe ich das alles hinbekommen. Es funktioniert auch gut.
Ich habe aber folgendes Problem, Idee, Herausforderung:

Was muss ich anpassen, damit ich die Struktur variabel habe. Ich möchte nicht für jede Struktur eine eigene Klasse erstellen mit identischem Code.

z.B.
Eine Struktur sieht in etwa so aus:

    Structure Teilnehmer
        Public tnrNummer As String
        Public Person As String
        Public Punkte As String
    End Structure
die 2. so:
    Structure Adresse
        Public Person As String
        Public Strasse As String
        Public Ort As String
    End Structure
Ich würde gerne die Liste dann übertragen welche geschrieben/gelesen werden soll. Mir fehlt aber der Ansatz das Sinnvoll einzubinden.

Grüße Basti

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: ModeratorDaveS (Moderator)
Datum: 16.05.14 11:22

Es gibt generische Methoden...
    Private Sub xmlSpeichern(Of T)(ByVal obj As T)
        Dim meineSerialisierer As New XmlSerializer(GetType(T))
        Using sw As New IO.StreamWriter(Tnliste)
            meineSerialisierer.Serialize(sw, obj)
        End Using
    End Sub
 
    Private Function xmlLesen(Of T)() As T
        Dim meineSerialisierer As New XmlSerializer(GetType(T))
        Using sr As New IO.StreamReader(Tnliste)
            Return CType(meineSerialisierer.Deserialize(sr), T)
        End Using
    End Function
Personen2 = xt.xmlLesen(Of List(Of Teilnehmer))()

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 19.05.14 11:08

Vielen Dank. Das klappt soweit schonmal.
Solange alles in der selben Klasse liegt zumindest. Wenn ich xmlSpeichern und xmlLaden aber in eine separate Klasse auslagere, bleibt mein Programm bei "meineSerialisierer.Serialize(sw, obj)" hängen

!InvalidOperationException wurde nicht behandelt!
Beim Generieren des XML-Dokuments ist ein Fehler aufgetreten.

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: ModeratorDaveS (Moderator)
Datum: 19.05.14 11:22

Eventuell im Exception-Objekt gibt es weitere Informationen. Vielleicht erklärst du auch genauer was du machst. Mit folgendem Code zB
Imports System.Xml.Serialization
 
Public Class XmlSer
    Public Shared Sub xmlSpeichern(Of T)(ByVal obj As T, tnListe As String)
        Dim meineSerialisierer As New XmlSerializer(GetType(T))
        Using sw As New IO.StreamWriter(tnListe)
            meineSerialisierer.Serialize(sw, obj)
        End Using
    End Sub
 
    Public Shared Function xmlLesen(Of T)(tnListe As String) As T
        Dim meineSerialisierer As New XmlSerializer(GetType(T))
        Using sr As New IO.StreamReader(tnListe)
            Return CType(meineSerialisierer.Deserialize(sr), T)
        End Using
    End Function
End Class
und angepasstem Aufruf
        XmlSer.xmlSpeichern(Personen, Tnliste)
        ....
        Personen2 = XmlSer.xmlLesen(Of List(Of Teilnehmer))(Tnliste)
klappt es.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 19.05.14 12:10

Imports System.Xml.Serialization
    Public Class toolbox
 
        Public Shared Sub xmlSpeichern(Of T)(ByVal obj As T, ByVal DateiXML As _
          String)
            Dim xml As New XmlSerializer(GetType(T))
            Using sw As New IO.StreamWriter(DateiXML)
                xml.Serialize(sw, obj)
            End Using
        End Sub
 
        Public Shared Function xmlLesen(Of T)(ByVal DateiXML As String) As T
            Dim xml As New XmlSerializer(GetType(T))
            Using sr As New IO.StreamReader(DateiXML)
                Return CType(xml.Deserialize(sr), T)
            End Using
        End Function
 
 
    End Class
Imports Toolbox.Toolbox
Public Class frmDemoTest
 
    Public Structure Daten
        Public Name As String
        Public Firma As String
        Public RegCode As String
        Public ID As String
    End Structure
 
    Public Shared _Daten As New List(Of Daten)
 
    Public Sub frmDemoTest_Load(sender As Object, e As EventArgs) Handles _
      MyBase.Load
 
        '  Einstellungen speichern
        Dim tools As New Toolbox.Toolbox
        Dim g As New Daten
        g.Firma = "Tester GmbH"
        g.Name = "Test Name"
        g.ID = "Test ID"
        g.RegCode = "Test Code"
 
        _Daten.Add(g)
 
        tools.xmlSpeichern(_Daten, "XMLTest.xml")
 
    End Sub
End Class
Was ich vorhabe:

Ich hab ein Hauptprogramm. In diesem Hauptprogramm lade ich verschiedene Funktionen über Plugins (ddl) nach. Dann habe ich eine toolbox.dll in der Funktionen bereitstehen sollen, die für alle Plugins verwendbar sind. Unter anderem die xmlSchreiben und lesen. Den Inhalt der XML Datei und auch die Struktur ist also abhängig von der jeweiligen DLL.
Hintergrund ist, dass ich später bei neuen Funktionen nur die toolbox.dll austauschen muss ohne das gesamte Programm wieder neu zu erzeugen.

Vielen Dank für deine Hilfe!

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Manfred X
Datum: 19.05.14 12:34

Hallo!

Die Datentypen, für die das generische T verwendet wird, müssen beim
Kompilieren bereits bekannt sein.
Falls die Plugins jeweils eigene Datentypen enthalten, sollten die Methoden
für das Laden/Speichern solcher Variablen dort enthalten sein.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 19.05.14 13:03

Hallo
Das kann ich derzeit noch nicht sagen. Im Grunde werde ich anfangs zumindest immer mit Strings zu tun haben. Die Größe der Struktur wird sich aber sicher erheblich vergrößern.
Allerdings ist mir nicht klar wie ich hier Abhilfe schaffen kann. Anscheint fehlen mir dabei noch die entscheidenden Grundlagen.

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Manfred X
Datum: 19.05.14 14:01

Für die Methoden, die im "Hauptprogramm" vereinbart und
für alle Plugins identisch sind, kannst Du z.B. eine gemeinsame
"wohl-definierte" Schnittstelle verwenden.
http://www.vbarchiv.net/workshop/details.php?id=93


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 19.05.14 14:36

Im Grunde habe ich die Schnittstelle auch so aufgebaut. Da die meisten Plugins später aber ohne die Toolbox sowieso nicht laufen, habe ich im Aufruf abgefragt ob die Toolbox Version ausreicht um mein Plugin zu laden. Die Toolbox selbst habe ich in den Verweisen drinne. Dies ist aber in den Plugins und im 'Hauptprogramm' identisch.
Ich habe gerade den kompletten Code der Klasse "frmDemoTest" in mein Hauptprogramm kopiert und dort gestartet. Dort läuft er ohne murren. Irgendwo habe ich meinen Denkfehler.

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Manfred X
Datum: 19.05.14 14:41

Für Klassen/Structures, die im Hauptprogramm (bzw. einer nutzenden DLL)
als Public deklariert bzw. bekannt sind, kann der Compiler eine "T-Überladung"
beim Erstellen der "Nutzung" erzeugen.

Beitrag wurde zuletzt am 19.05.14 um 14:59:00 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 20.05.14 11:10

Guten Morgen
OK. Ich verstehe aber nicht warum dies nur im Hauptprogramm läuft, aber nicht in den Dlls meiner Plugins. Der Quellcode ist identisch. Die Klassen wie auch die Funktionen, Strukturen sind alle auf Public. Irgendwo muss ich noch einen Fehler drinne haben

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Manfred X
Datum: 20.05.14 11:30

Hallo!

Du mußt zuerst die ToolBox-DLL erstellen und in den
Plugins darauf verweisen.
Wenn Du etwas an den Datenstrukturen in der Toolbox änderst,
müssen alle diese Plugins neu übersetzt werden.

Da die Toolbox-DLL Methoden enthalten soll, die bei allen Plugins
einheitlich sind, wäre es sinnvoll, für die Datenübergabe eine
gemeinsame Schnittstelle zu schaffen. Die könnte auch als
Constraint für generische Methoden-Parameter fungieren.
(Du hättest in der Toolbox-DLL Zugriff auf die Methoden und Eigenschaften
der übergebenen Objekte, die in der Schnittstelle vereinbart sind.)

Beitrag wurde zuletzt am 20.05.14 um 11:37:31 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 20.05.14 21:31

Es lässt mir keine Ruhe. Ich komm nicht drauf wo es hakt:

Ich habe jetzt die XMLspeichern und XMLladen mal direkt in die Plugin.dll gepackt. Ich bekomme hier den selben Fehler wie vorher:




Da der Fehler noch immer besteht liegt es wohl nicht wie vermutet an den fehlenden Verweisen. Andere Funktionen in meiner Toolbox laufen ja auch ohne murren. Es muss wohl irgendwas mit meinem Plugin zu tun haben.

Ich rufe in dem Plugin eine Form als Child auf. Inb der Form ist Testweise nur ein button der dann das Ereignis auslöst. Könnte es vielleicht hieran liegen?

Danke für deine Geduld.
Grüße Sebastian

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Manfred X
Datum: 20.05.14 21:53

Hallo!

Du mußt Dir darüber im klaren sein, daß alle Datenelemente
in der Klasse, deren Instanzen als Listenelemente zu speichern sind,
auch in XML wandelbar sind. Siehe Hinweise:
http://msdn.microsoft.com/de-de/library/system.xml.serialization.xmlserializer%28v=vs.100%29.aspx

Beim Serialisieren kann man einen Filestream verwenden.
Und für den T-Parameter eventuell einen geeigneten Constraint.
Public Shared Sub xmlSpeichern(Of T As IList)_
        (ByVal obj As T, ByVal DateiXML As String)
 
     Dim xml As New XmlSerializer(GetType(T))
 
     Using fs As New IO.FileStream(DateiXML, _
         IO.FileMode.OpenOrCreate, IO.FileAccess.Write, IO.FileShare.None)
         xml.Serialize(fs, obj)
     End Using
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: XML Kurs, XML Serialisieren und Deserialisieren 
Autor: Dickschieder
Datum: 21.05.14 06:55

Danke. Dein Code hatte leider den gleichen Effekt.
Es läuft aber jetzt. Warum, wieso - ist mir Schleierhaft.
Ich habe das komplette Projekt neu aufgebaut. Also ein neues Projekt erzeugt, den Code 1 zu 1 rüber kopiert. Die Verweise gesetzt, kompiliert. Gestartet und siehe da, es läuft.
Es hat zumindest dazu beigetragen, dass ich den Code zerpflückt habe nd mich in das Thema XmlSerializer eingelesen habe

Vielen Vielen Dank für deine Geduld.

--
Bitte um Nachsicht - ich übe noch

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel