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
Ich habe gerade den Code für die Inventarstruktur hinzugefügt. InventoryGV ist ein DataGridView (dafür steht GV). Entschuldigung für die Verwirrung. –
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. –
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. –