Я работаю над программой, которая читает из онлайн-файла xml, загружает его в интерфейс, преобразует XML-файл в структуру и загружает структуры в случайную файл доступа, затем считывает данные из файла произвольного доступа в файл json. В настоящее время я получаю InvalidOperationException при попытке сериализации файла. Часть коды ниже:vb.net InvalidOperatorException при использовании метода GetType() внутри 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
Последняя строка Serializer.Serialize(stream, xmlFile)
бросает System.InvalidOperationException с сообщением { «Была ошибка при генерации документа XML.»}. Внутреннее исключение читается {«Указанный приведение недействителен."}.
Если посмотреть на значение во время выполнения GetType (Inventory) предыдущей строки Dim Serializer As New Serialization.XmlSerializer(GetType(Inventory))
, я вижу ошибку DeclaringMethod: «DeclaringMethod = 'DirectCast ((GetType (Inventory)), System.RuntimeType) .DeclaringMethod' бросил исключение типа 'System.InvalidOperationException' "
Мое лучшее предположение - метод GetType() возвращает значение времени выполнения, в то время как сериализатор должен знать значение во время компиляции. Если да, существует ли функция, возвращающая значение типа во время компиляции? Функция TypeOf работает только для булевых выражений, и я не уверен в другой функции в vb.net, которая сделает это.
Если это не так, где я ошибаюсь, и как я могу успешно это сделать? Любая помощь будет оценена по достоинству.
EDIT: Вот структура запасов, а также:
<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
Я просто добавил код для структуры инвентаря. InventoryGV - это DataGridView (это то, что означает GV). Извините за путаницу. –
Постарайтесь добавить это в свою структуру, чтобы увидеть, появляются ли какие-либо другие ссылочные ошибки, может быть более описательным - AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionEventRaised. Я также заметил, что вы используете «год» как целое число, попробуйте его как дату или измените имя, поскольку год - это используемый знаменатель системы. –
Другое примечание, не уверен, что вы сделали, включите опцию Strict On или поставьте Option Strict On в верхней части кода. –