2016-08-28 10 views
0

Я работаю над программой, которая читает из онлайн-файла 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 

ответ

0

Просто быстрый взгляд на вашей линии - Dim Serializer As New Serialization.XmlSerializer(GetType(Inventory))

я не видел ссылку на инвентаре, если это не будет InventoryGV в порядке сделать вызов в файл Inventory?

Возможно, это неправильно ...

+0

Я просто добавил код для структуры инвентаря. InventoryGV - это DataGridView (это то, что означает GV). Извините за путаницу. –

+0

Постарайтесь добавить это в свою структуру, чтобы увидеть, появляются ли какие-либо другие ссылочные ошибки, может быть более описательным - AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionEventRaised. Я также заметил, что вы используете «год» как целое число, попробуйте его как дату или измените имя, поскольку год - это используемый знаменатель системы. –

+1

Другое примечание, не уверен, что вы сделали, включите опцию Strict On или поставьте Option Strict On в верхней части кода. –