プロジェクト設定は、基本タイプ以外の値のシリアル化と保存ではうまく機能しないようです。できることは、ユーザースコープの文字列値設定を使用して、シリアル化されたディクショナリを格納することです。
私の例ではSerializedKeyPercentDictionary
、Typestring
とScopeという名前の設定を作成しましたUser
。シリアル化にJSONを使用しています。これは、他のほとんどのシリアル化よりも短い文字列を作成するためです。このためには、System.Runtime.Serializationsへの参照を追加する必要があります。この設定とその参照を適切に設定すると、グローバルヘルパークラスを作成して、キーからパーセントへのマッピングを管理するための厳密に型指定されたディクショナリを提供できます。
Public Class KeyPercentHelper
Private Shared _keyPercentDictionary As Dictionary(Of Integer, Decimal)
Private Shared _initLock As Object = New Object()
Public Shared ReadOnly Property KeyPercentDictionary As Dictionary(Of Integer, Decimal)
Get
If (_keyPercentDictionary Is Nothing) Then
InitializeDictionary()
End If
Return _keyPercentDictionary
End Get
End Property
Shared Sub New()
AddHandler My.Settings.SettingsLoaded, AddressOf HandleSettingsLoad
AddHandler My.Settings.SettingsSaving, AddressOf HandleSettingsSaving
End Sub
Private Shared Sub InitializeDictionary()
' Load dictionary from User Setting.
SyncLock _initLock
If (_keyPercentDictionary Is Nothing) Then
If (String.IsNullOrEmpty(My.Settings.SerializedKeyPercentDictionary)) Then
_keyPercentDictionary = New Dictionary(Of Integer, Decimal)()
Else
Dim ser As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Dictionary(Of Integer, Decimal)))
Using memStream As New System.IO.MemoryStream()
Using writer As New System.IO.StreamWriter(memStream)
writer.Write(My.Settings.SerializedKeyPercentDictionary)
writer.Flush()
memStream.Position = 0
_keyPercentDictionary = CType(ser.ReadObject(memStream), Dictionary(Of Integer, Decimal))
End Using
End Using
End If
End If
End SyncLock
End Sub
Private Shared Sub HandleSettingsLoad(ByVal sender As Object, ByVal e As EventArgs)
If (_keyPercentDictionary Is Nothing) Then
InitializeDictionary()
End If
End Sub
Private Shared Sub HandleSettingsSaving(ByVal sender As Object, ByVal e As EventArgs)
' Ensure User Setting value is updated before save.
Dim ser As New System.Runtime.Serialization.Json.DataContractJsonSerializer(GetType(Dictionary(Of Integer, Decimal)))
Using memStream As New System.IO.MemoryStream()
ser.WriteObject(memStream, _keyPercentDictionary)
memStream.Position = 0
Using reader As New System.IO.StreamReader(memStream)
My.Settings.SerializedKeyPercentDictionary = reader.ReadToEnd()
End Using
End Using
End Sub
End Class