2015-04-05 100 views
1

我正在尝试编写一个子程序,它将从.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 

从我可以使用汽车的菜单,保存/的恢复看字典工作得很好。

+0

没有人可以帮助不知道什么是字典。 – Plutonix 2015-04-05 17:24:42

+0

哎呀!抱歉!我已经编辑了相应的代码 – 2015-04-05 17:28:14

+0

有些代码可能是为了让我们看到你的意思,因为字典不能*正常*被序列化,并且很高兴看到类,因为你可以很容易地使用公共字段而不是属性所有。显示你的尝试。 – Plutonix 2015-04-05 17:30:39

回答

1

首先,如果你正在使用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(它就是这样)的一个实例。