2015-11-15 2 views
1

В основном я создал файл, в котором хранятся сериализованные данные из объекта с именем TravelRecord. У меня нет проблем с сериализацией данных и их хранением в файле с помощью BinaryFormatter(), и у меня нет проблемы с получением первой записи. Я просто хочу получить все записи и отобразить их в ListBox.Deserialize список объектов из файла, который будет отображаться

Вот некоторые из соответствующего кода:

 Private reader As New BinaryFormatter() 
    Private input As FileStream 
    input = New FileStream(fileName, FileMode.Open, FileAccess.Read) 

    Dim record = CType(reader.Deserialize(input), TravelRecord) 
    RequestLst.items.Add(record.toString()) 

Это работает для возвращения первой записи, но я хочу, чтобы вернуть все из них, так что я могу перебирать их, как следующее:

For Each r As TravelRecord In records 
      RequestLst.Items.Add(r.ToString()) 
     Next 

Я знаю, что, вероятно, я пропустил что-то очень простое, но все, что я пытаюсь, вызывает ошибки RunTime. Также может быть лучший способ справиться с этим.

Вот как выглядят сериализованные данные в файле.

ÿÿÿÿ   DTravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null TravelRequest.TravelRecord ID FirstNameLastNamePurpose StartDateEndDateAmount System.Guid 

    ýÿÿÿSystem.Guid _a_b_c_d_e_f_g_h_i_j_k   “ŸPªO½cùømFÚw Steve Robinson Semianr U¾Ó €æ©PÓ  @[email protected] @[email protected] ÿÿÿÿ   DTravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null TravelRequest.TravelRecord ID FirstNameLastNamePurpose StartDateEndDateAmount System.Guid 

    ýÿÿÿSystem.Guid _a_b_c_d_e_f_g_h_i_j_k   æ;o˜ùéAÎÜ^pñÌ jake  Kirkbride Stuff l«™ Ó €CøX,Ô  À^@ ÿÿÿÿ   DTravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null TravelRequest.TravelRecord ID FirstNameLastNamePurpose StartDateEndDateAmount System.Guid 

    ýÿÿÿSystem.Guid _a_b_c_d_e_f_g_h_i_j_k   FP“¼Î«Gž¥5tuUš steve stevenson vacation @áw%Ó @ˆ!?(Ó  @[email protected] ÿÿÿÿ   DTravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null TravelRequest.TravelRecord ID FirstNameLastNamePurpose StartDateEndDateAmount System.Guid 

    ýÿÿÿSystem.Guid _a_b_c_d_e_f_g_h_i_j_k   ‹MÆoh#D–âÑQþ…P Steve Stevenson Program €œN4)Ô €CøX,Ô  @[email protected] ÿÿÿÿ   DTravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null TravelRequest.TravelRecord ID FirstNameLastNamePurpose StartDateEndDateAmount System.Guid 

    ýÿÿÿSystem.Guid _a_b_c_d_e_f_g_h_i_j_k   k$ˆµ§FŠm§Íüâ George Govern Stuff €CøX,Ô €ê¡}/Ô  `@ 

Кажется, мой вопрос, как я читаю все эти и превратить их в коллекцию, так что я могу работать с ними.

Вот код для TravelRecord класса:

<Serializable()> 
    Public Class TravelRecord 

    'Class fields 
    Public ID As Guid 
    Public FirstName As String 
    Public LastName As String 
    Public Purpose As String 
    Public StartDate As Date 
    Public EndDate As Date 
    Public Amount As Double 

    Public Sub New() 
     MyClass.New(Guid.Empty, String.Empty, String.Empty, String.Empty, 
        Nothing, Nothing, 0.0) 
    End Sub 

    Public Sub New(id As Guid, fName As String, lName As String, 
        purpose As String, startDate As Date, endDate As Date, 
        amount As Double) 
     MyClass.ID = id 
     MyClass.FirstName = fName 
     MyClass.LastName = lName 
     MyClass.Purpose = purpose 
     MyClass.StartDate = startDate 
     MyClass.EndDate = endDate 
     MyClass.Amount = amount 
    End Sub 

    Public Overrides Function ToString() As String 
     Return String.Format("{0,-40}{1,-10}{2,-10}{3,-15}{4,12:d}{5,12:d}{6,12:C}", _ 
      ID, FirstName, LastName, Purpose, StartDate, EndDate, Amount) 
    End Function 
End Class 

Из комментариев:

сериализации код:

formatter.Serialize(output, travelRequest) 

Где travelRequest является экземпляром TravelRecord.

Возможно, мне нужно будет объяснить это лучше всего. Система предназначена для отправки пользователем TravelRecords. Сериализация устанавливает в Append новый файл TravelRecord, чтобы он работал как база данных. (Это домашнее задание, которое я обычно использую SQL). Deserialization - это прочитать все записи в файле и отобразить их в сводном ListBox.

Причина Deserialization - это получение только одного TravelRecord, потому что я не знаю, как получить все TravelRecords из файла.

Есть ли способ, чтобы получить количество, сколько элементов в последовательном файле, так что я могу сделать конечный цикл или что-то

+0

Должен ли вывод быть коллекцией? Если так, тогда 'Dim records = CType (reader.Deserialize (input), List (Of TravelRecord))' – OneFineDay

+0

Когда я пытаюсь, я получаю следующее Unhandled Exception: 'Необработанное исключение типа 'System.InvalidCastException' произошло в TravelRequest. exe Дополнительная информация: Невозможно наложить объект типа «TravelRequest.TravelRecord» на тип «System.Collections.Generic.List'1 [TravelRequest.TravelRecord]». ' – JKirkbride

+0

- это TravelRecord коллекция? или он содержит коллекцию? в первом блоке вы относитесь к нему как к одному элементу, а во втором - к списку или коллекции. – Plutonix

ответ

2

Вы пишете одну запись за один раз:

formatter.Serialize(output, travelRequest) 

поэтому вам придется читать одну запись за раз. BinaryFomratter хранит данные типа вместе с данными (TravelRecord), поэтому вы не можете просто прочитать его как коллекцию (массив или List(of TravelRecord), потому что нет способа конвертировать из одного типа в коллекцию типа (без каких-либо колец я уверен, что вы не вы можете просмотреть данные типа в файле:

TravelRequest, Version = 1.0.0.0, Culture = neutral, PublicKeyToken ...

Файл обыкновение быть произвольным доступом, поэтому, чтобы получить запись 3 или найти «Foo» вы должны сделать что-то подобное (например, тест на имя пользователя = «Bob» и Exit For). Стоять в для TravelRecord - это класс под названием NVP, который, как мне кажется, удобен.

Function GetListofTravelRecords() As List(Of NVP) 
    Dim tmpList As New List(Of NVP) 
    Dim tmp As NVP 

    Using fs As New FileStream("C:\Temp\nvplst.bin", FileMode.Open) 
     Dim bf As New BinaryFormatter 

     Do Until fs.Position >= fs.Length 
      tmp = CType(bf.Deserialize(fs), NVP) 
      tmpList.Add(tmp) 
     Loop 

    End Using 
    Return tmpList 

End Function 

Использование и испытание:

Dim mylist = GetListofTravelRecords() 

For Each item In mylist 
    Console.WriteLine(item.ToString) 
Next 

Выход:

Зигги (1)
Zacky (2)
Zoey (3)
Зигги (4)
zacky (5)

У меня было 11 вещей, и все они сделали это безопасно и в том же порядке.


Примечание к другим, гораздо проще serialize an entire collection и читать его обратно как коллекции.

+0

удаление записи будет практически невозможным - вам нужно будет прочитать их все в коллекции или массиве, отбросьте один, чтобы удалить, а затем напишите все их обратно – Plutonix

+0

Спасибо за все время и усилия Plutonix. Я понимаю, что это не идеальная ситуация или хорошее использование BF. После этого недельного урока я надеюсь, что смогу вернуться к полной разработке веб-сайтов и оставить BF и сериализацию в одиночку! – JKirkbride

+0

BF и Serialization прекрасны ... его одно за раз Добавляют, что это тупой – Plutonix

Смежные вопросы