从字典中提取属性值
问题描述:
我正在尝试编写一个子程序,它将从.ser文件(此位工作正常)中反序列化一个字典,然后重新填充此字典中的几个列表(这是我无法做到的)。从字典中提取属性值
字典包含具有如ETA,笔记,媒体等属性的自定义类我写了名为“照片作业”的对象(我认为)(宣布为)
Dim photoJobs As New Dictionary(Of String, PhotoJob)
总之,我希望能够将每个特定属性的每个条目提取到一个单独的数组中(每个属性一个数组),并且我可以从那里去。
任何帮助将不胜感激,我可能会完全错误的方式,我是新来的VB。相关代码如下:
照片作业类:
<Serializable()> _Public Class PhotoJob
Private intStage As Integer 'Declare all local private variables
Private ID As String
Private timeLeft As Integer
Private material As String '
Private note As String
Private path As String
Private finished As Boolean = False
'Declare and define properties and methods of the class
Public Property productionStage() As Integer
Get
Return intStage
End Get
Set(ByVal Value As Integer)
intStage = Value
End Set
End Property
Public Property photoID() As String
Get
Return ID
End Get
Set(ByVal Value As String)
ID = Value
End Set
End Property
Public Property ETA() As Integer
Get
Return timeLeft
End Get
Set(ByVal Value As Integer)
timeLeft = Value
End Set
End Property
Public Property medium() As String
Get
Return material
End Get
Set(ByVal Value As String)
material = Value
End Set
End Property
Public Property notes() As String
Get
Return note
End Get
Set(ByVal Value As String)
note = Value
End Set
End Property
Public Property imagePath() As String
Get
Return path
End Get
Set(ByVal Value As String)
path = Value
End Set
End Property
Public Property complete() As Boolean
Get
Return finished
End Get
Set(value As Boolean)
finished = value
End Set
End Property
Public Sub nextStage()
If intStage < 4 Then
intStage += 1
ElseIf intStage = 4 Then
intStage += 1
finished = True
End If
End Sub
End Class
子程序参与德/序列:
Private Sub BackupAllToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BackupAllToolStripMenuItem.Click
Dim formatter As New BinaryFormatter
Dim backupFile As New FileStream(Strings.Replace(Strings.Replace(Now, ":", "_"), "/", ".") & ".ser", FileMode.Create, FileAccess.Write, FileShare.None)
formatter.Serialize(backupFile, photoJobs)
backupFile.Close()
MsgBox("Collection saved to file")
End Sub
Private Sub RestoreFromFileToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles RestoreFromFileToolStripMenuItem.Click
With OpenFileDialog 'Executes the following sets/gets/methods of the OpenFileDialog
.FileName = ""
.Title = "Open Image File"
.InitialDirectory = "c:\"
.Filter = "Serial Files(*.ser)|*ser"
.ShowDialog()
End With
Dim backupPathStr As String = OpenFileDialog.FileName
Dim deSerializer As New BinaryFormatter
Dim backupFile As New FileStream(backupPathStr, FileMode.Open)
photoJobs = deSerializer.Deserialize(backupFile)
backupFile.Close()
End Sub
从我可以使用汽车的菜单,保存/的恢复看字典工作得很好。
答
首先,如果你正在使用VS2010 +,可以大大利用autoimplemented属性减少样板代码:
<Serializable()>
Public Class PhotoJob
Public Property productionStage() As Integer
Public Property photoID() As String
Public Property ETA() As Integer
etc
End Class
即所有需要,所有的样板代码为您处理。其次,这条线:
photoJobs = deSerializer.Deserialize(backupFile)
反序列化photojobs将会是通用Object
,不是Dictionary
。您应该打开Option Strict
,以便VS执行这些类型的错误。这是如何反序列化到类型:
Using fs As New FileStream(myFileName, FileMode.Open)
Dim bf As New BinaryFormatter
PhotoJobs= CType(bf.Deserialize(fs), Dictionary(Of String, PhotoJob))
End Using
Using
关闭和流的处置,CType
将通过BF返回到实际的字典
要使用字典的工作对象(这个有没有关系序列化),你需要遍历集合,以获得数据:
For Each kvp As KeyValuePair(Of String, PhotoJob) In PhotoJobs
listbox1.items.Add(kvp.value.productionStage)
listbox2.items.Add(kvp.value.ETA)
etc
Next
收集是由(String, PhotoJob)
对在你的宣言,当你把它们添加到集合中。他们以同样的方式回归。 kvp.Key
将是字典中用于标识此作业的字符串键,kvp.Value
将是对PhotoJobs对象的引用。
只要VS/VB知道它是Dictionary(of String, PhotoJob)
,kvp.Value
就会像PhotoJob(它就是这样)的一个实例。
没有人可以帮助不知道什么是字典。 – Plutonix 2015-04-05 17:24:42
哎呀!抱歉!我已经编辑了相应的代码 – 2015-04-05 17:28:14
有些代码可能是为了让我们看到你的意思,因为字典不能*正常*被序列化,并且很高兴看到类,因为你可以很容易地使用公共字段而不是属性所有。显示你的尝试。 – Plutonix 2015-04-05 17:30:39