反序列化要显示的文件中的对象列表
Deserialize list of objects from a file to be displayed
基本上我创建了一个文件,用于存储来自名为 TravelRecord 的对象的序列化数据。使用 BinaryFormatter() 序列化数据并将其存储在文件中没有问题,检索第一条记录也没有问题。我只想检索所有记录并将它们显示在列表框中。
下面是一些相关代码:
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())
这适用于 return 第一条记录,但我希望它 return 所有记录,这样我就可以像下面这样遍历它们:
For Each r As TravelRecord In records
RequestLst.Items.Add(r.ToString())
Next
我知道我可能遗漏了一些非常简单的东西,但我尝试的一切都会导致运行时错误。可能还有更好的方法来处理这个问题。
文件中的序列化数据如下所示。
ÿÿÿÿ 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Ó @o@ @_@ ÿÿÿÿ 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%Ó @ˆ!?(Ó @_@ ÿÿÿÿ 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,Ô @_@ ÿÿÿÿ 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 的代码 Class:
<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 的一个实例。
我可能需要更好地解释这一点。该系统供用户提交旅行记录。序列化设置为 Append
一个新的 TravelRecord 到文件,就像一个数据库一样。 (这是我通常使用的家庭作业SQL)。反序列化是读取文件中的所有条目并将它们显示在摘要列表框中。
反序列化只得到一个 TravelRecord 的原因是因为我不知道如何从文件中取出所有 TravelRecords。
有没有办法计算序列化文件中的项目数量,以便我可以执行有限的 For 循环或其他操作
您一次写入一条记录:
formatter.Serialize(output, travelRequest)
因此您必须一次回读一条记录。 BinaryFomratter
将类型数据与数据 (TravelRecord
) 一起存储,因此您不能将其作为 collection(数组或 List(of TravelRecord)
读回,因为它无法转换从一种类型到 collection 类型(没有一些旋转我确定你不想进行)。你可以在文件中看到类型数据:
TravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken...
该文件不会是随机访问的,因此要获取记录 3 或查找 "Foo",您必须执行类似的操作(例如,测试用户名 = "Bob" 和 Exit For
)。代表 TravelRecord
的是一个名为 class 的 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
输出:
ziggy (1)
zacky (2)
zoey (3)
ziggy (4)
zacky (5)
我在那里有 11 件东西,它们都以相同的顺序安全地回来了。
其他人请注意,serialize an entire collection 和回读 as collection.
更容易
基本上我创建了一个文件,用于存储来自名为 TravelRecord 的对象的序列化数据。使用 BinaryFormatter() 序列化数据并将其存储在文件中没有问题,检索第一条记录也没有问题。我只想检索所有记录并将它们显示在列表框中。
下面是一些相关代码:
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())
这适用于 return 第一条记录,但我希望它 return 所有记录,这样我就可以像下面这样遍历它们:
For Each r As TravelRecord In records
RequestLst.Items.Add(r.ToString())
Next
我知道我可能遗漏了一些非常简单的东西,但我尝试的一切都会导致运行时错误。可能还有更好的方法来处理这个问题。
文件中的序列化数据如下所示。
ÿÿÿÿ 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Ó @o@ @_@ ÿÿÿÿ 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%Ó @ˆ!?(Ó @_@ ÿÿÿÿ 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,Ô @_@ ÿÿÿÿ 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 的代码 Class:
<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 的一个实例。
我可能需要更好地解释这一点。该系统供用户提交旅行记录。序列化设置为 Append
一个新的 TravelRecord 到文件,就像一个数据库一样。 (这是我通常使用的家庭作业SQL)。反序列化是读取文件中的所有条目并将它们显示在摘要列表框中。
反序列化只得到一个 TravelRecord 的原因是因为我不知道如何从文件中取出所有 TravelRecords。
有没有办法计算序列化文件中的项目数量,以便我可以执行有限的 For 循环或其他操作
您一次写入一条记录:
formatter.Serialize(output, travelRequest)
因此您必须一次回读一条记录。 BinaryFomratter
将类型数据与数据 (TravelRecord
) 一起存储,因此您不能将其作为 collection(数组或 List(of TravelRecord)
读回,因为它无法转换从一种类型到 collection 类型(没有一些旋转我确定你不想进行)。你可以在文件中看到类型数据:
TravelRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken...
该文件不会是随机访问的,因此要获取记录 3 或查找 "Foo",您必须执行类似的操作(例如,测试用户名 = "Bob" 和 Exit For
)。代表 TravelRecord
的是一个名为 class 的 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
输出:
ziggy (1)
zacky (2)
zoey (3)
ziggy (4)
zacky (5)
我在那里有 11 件东西,它们都以相同的顺序安全地回来了。
其他人请注意,serialize an entire collection 和回读 as collection.
更容易