| |
VB.NET - Ein- und UmsteigerXML 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
| |
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 | |
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 | |
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 | |
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 | |
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.
| |
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 | |
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
| |
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 | |
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. | |
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. | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|