2016-08-28 1 views
0

Ich arbeite an einem Programm, liest aus einer Online-XML-Datei, lädt es in eine Schnittstelle, wandelt die XML-Datei in eine Struktur und lädt die Strukturen in eine zufällige Access-Datei, liest dann die Daten aus der Direktzugriffsdatei in eine JSON-Datei. Ich erhalte derzeit eine InvalidOperationException, wenn ich versuche, die Datei zu serialisieren. Ein Teil des Codes ist unter:vb.net InvalidOperatorException bei Verwendung von GetType() Methode in XMLSerializer

Private Sub cmdReadXML_Click(sender As System.Object, e As System.EventArgs) Handles cmdReadXML.Click 
'Read XML from xmlURL, Display in InventoryGV, Write to a Random Access File in the Data directory.' 

Dim xmlFile As XmlReader 
xmlFile = XmlReader.Create(xmlURL) 
Dim ds As New DataSet 
ds.ReadXml(xmlFile) 
InventoryGV.DataSource = ds.Tables(0) 

Dim fileName As String = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory).FullName).FullName + "\Data\raf.xml" 
FileOpen(1, fileName, OpenMode.Random, FileShare.ReadWrite) 
FileClose(1) 
Dim stream As FileStream = New FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite) 

Dim Serializer As New Serialization.XmlSerializer(GetType(Inventory)) 

Serializer.Serialize(stream, xmlFile) 

End Sub 

Die letzte Zeile Serializer.Serialize(stream, xmlFile) wirft einen System.InvalidOperationException mit der Meldung { „Es gab einen Fehler das XML-Dokument zu erzeugen.“}. Die innere Ausnahme lautet {"Angegebener Cast ist nicht gültig."}.

Wenn ich bei der Laufzeitwert von GetType aussehen (Inventory) der vorherigen Zeile Dim Serializer As New Serialization.XmlSerializer(GetType(Inventory)), ich sehe einen DeclaringMethod Fehler: „DeclaringMethod = 'Direct ((GetType (Inventory)), System.RuntimeType) .DeclaringMethod' warf ein Ausnahme vom Typ 'System.InvalidOperationException' "

Meine beste Schätzung ist, dass die GetType() -Methode einen Laufzeitwert zurückgibt, während der Serializer den Wert zum Zeitpunkt der Kompilierung kennen muss. Wenn ja, gibt es eine Funktion, um den Typwert zur Kompilierzeit zurückzugeben? Die TypeOf-Funktion scheint nur für boolesche Ausdrücke zu funktionieren, und ich bin mir nicht sicher, ob eine andere Funktion in vb.net dies tun würde.

Wenn das nicht der Fall ist, wo liege ich falsch, und wie kann ich das erfolgreich bewerkstelligen? Jede Hilfe wäre willkommen.

EDIT: Hier ist die Bestandsstruktur als auch:

<Serializable()> Public Structure Inventory 
    'Create Structure for Putting Inventory into Random Access File 
    Dim id As Integer 
    Dim year As Integer 
    Dim make As String 
    Dim model As String 
    Dim terrain As String 
    Dim mileage As Integer 
    Dim color As String 
    Dim cylinders As Integer 
    Dim transmission As String 
End Structure 

Antwort

0

Nur ein kurzer Blick auf Ihrer Linie - Dim Serializer As New Serialization.XmlSerializer(GetType(Inventory))

ich keinen Verweis auf Inventar gesehen hat, sollte diese InventoryGV sein nicht in Ordnung einen Aufruf zur Inventarisierung machen?

Könnte falsch sein, aber ...

+0

Ich habe gerade den Code für die Inventarstruktur hinzugefügt. InventoryGV ist ein DataGridView (dafür steht GV). Entschuldigung für die Verwirrung. –

+0

Versuchen Sie, das zu Ihrer Struktur hinzuzufügen, um zu sehen, ob andere Referenzfehler angezeigt werden, beschreibender sein könnte - AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionEventRaised. Ich habe auch bemerkt, dass Sie "Jahr" als eine Ganzzahl verwenden, versuchen Sie es als Datum oder ändern Sie die Benennung als Jahr ist ein System verwendet Nenner. –

+1

Noch ein Hinweis, nicht sicher, ob Sie das getan haben, schalten Sie Option Strict On ein oder setzen Sie Option Strict On oben in Ihren Code. –

Verwandte Themen