无法将类型 System.Version 保存到 My.Settings
Can't save type System.Version to My.Settings
我有一个小型测试项目,用于从服务器检查应用程序版本并提示用户更新。除了无法将 System.Version
的类型保存到 My.Settings
之外,一切正常。 (我想保存新版本,以防用户要求不再提醒。)
现在,我知道我可以将 Version 保存为字符串并将其来回转换 - 我已经这样做来解决这个问题 - 但是由于可用设置数据类型中列出了 System.Version
,我图它应该工作。但是它没有保存版本,它只是保存了一个没有值的 XML 条目 "Version"(请参阅下文)。
我正在使用 VB.NET、VS 2013、.NET 4。
这里有一些代码可供查看:
Settings.Designer.vb
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property DoNotRemindVersion() As Global.System.Version
Get
Return CType(Me("DoNotRemindVersion"),Global.System.Version)
End Get
Set
Me("DoNotRemindVersion") = value
End Set
End Property
示例分配
If My.Settings.DoNotRemind Then My.Settings.DoNotRemindVersion = oVersion.NewVersion
(oVersion.NewVersion
是 System.Version
类型。)
保存在user.config
<setting name="DoNotRemindVersion" serializeAs="Xml">
<value>
<Version xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</value>
</setting>
那么,我做错了什么?我读过一些关于必须序列化 类 才能将它们保存到用户设置的帖子,但这是一个简单的版本号,从表面上看,我希望它是受支持的数据类型。
System.Version Class is marked with the SerializableAttribute
but you will need to mark the property with the SettingsSerializeAsAttribute and pass the System.Configuration.SettingsSerializeAs.Binary 值。
您不能像在 Settings.designer.vb
文件中找到的那样使用项目设置设计器界面自动生成代码。您需要自己扩展 My Namespace - MySettings Class。这是部分 classes 有用的领域之一。
向您的项目添加一个新的 class 文件并命名为 CustomMySettings 之类的有创意的名称。 Select 并删除这个新文件中自动生成的代码,并将其替换为以下代码。
Namespace My
Partial Friend NotInheritable Class MySettings
' The trick here is to tell it serialize as binary
<Global.System.Configuration.SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Binary)> _
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property DoNotRemindVersion() As Global.System.Version
Get
Return CType(Me("DoNotRemindVersion"), Global.System.Version)
End Get
Set(value As Global.System.Version)
Me("DoNotRemindVersion") = value
End Set
End Property
End Class
End Namespace
这将允许您使用 My.Settings.DoNotRemindVersion
就像您通过设计器创建设置一样。第一次访问该设置时,它将有一个 null (Nothing) 值,因此您可以在 Form.Load 事件处理程序中使用类似以下内容的内容对其进行初始化。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim savedVersion As Version = My.Settings.DoNotRemindVersion
If savedVersion Is Nothing Then
My.Settings.DoNotRemindVersion = New Version(1, 0)
My.Settings.Save()
End If
End Sub
我有一个小型测试项目,用于从服务器检查应用程序版本并提示用户更新。除了无法将 System.Version
的类型保存到 My.Settings
之外,一切正常。 (我想保存新版本,以防用户要求不再提醒。)
现在,我知道我可以将 Version 保存为字符串并将其来回转换 - 我已经这样做来解决这个问题 - 但是由于可用设置数据类型中列出了 System.Version
,我图它应该工作。但是它没有保存版本,它只是保存了一个没有值的 XML 条目 "Version"(请参阅下文)。
我正在使用 VB.NET、VS 2013、.NET 4。
这里有一些代码可供查看:
Settings.Designer.vb
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property DoNotRemindVersion() As Global.System.Version
Get
Return CType(Me("DoNotRemindVersion"),Global.System.Version)
End Get
Set
Me("DoNotRemindVersion") = value
End Set
End Property
示例分配
If My.Settings.DoNotRemind Then My.Settings.DoNotRemindVersion = oVersion.NewVersion
(oVersion.NewVersion
是 System.Version
类型。)
保存在user.config
<setting name="DoNotRemindVersion" serializeAs="Xml">
<value>
<Version xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</value>
</setting>
那么,我做错了什么?我读过一些关于必须序列化 类 才能将它们保存到用户设置的帖子,但这是一个简单的版本号,从表面上看,我希望它是受支持的数据类型。
System.Version Class is marked with the SerializableAttribute
but you will need to mark the property with the SettingsSerializeAsAttribute and pass the System.Configuration.SettingsSerializeAs.Binary 值。
您不能像在 Settings.designer.vb
文件中找到的那样使用项目设置设计器界面自动生成代码。您需要自己扩展 My Namespace - MySettings Class。这是部分 classes 有用的领域之一。
向您的项目添加一个新的 class 文件并命名为 CustomMySettings 之类的有创意的名称。 Select 并删除这个新文件中自动生成的代码,并将其替换为以下代码。
Namespace My
Partial Friend NotInheritable Class MySettings
' The trick here is to tell it serialize as binary
<Global.System.Configuration.SettingsSerializeAs(System.Configuration.SettingsSerializeAs.Binary)> _
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property DoNotRemindVersion() As Global.System.Version
Get
Return CType(Me("DoNotRemindVersion"), Global.System.Version)
End Get
Set(value As Global.System.Version)
Me("DoNotRemindVersion") = value
End Set
End Property
End Class
End Namespace
这将允许您使用 My.Settings.DoNotRemindVersion
就像您通过设计器创建设置一样。第一次访问该设置时,它将有一个 null (Nothing) 值,因此您可以在 Form.Load 事件处理程序中使用类似以下内容的内容对其进行初始化。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim savedVersion As Version = My.Settings.DoNotRemindVersion
If savedVersion Is Nothing Then
My.Settings.DoNotRemindVersion = New Version(1, 0)
My.Settings.Save()
End If
End Sub