Не удается сохранить тип System.Version в My.Settings
У меня есть небольшой тестовый проект для проверки версии приложения с сервера и запроса пользователя на обновление. Все работает хорошо, за исключением того, что я не могу сохранить тип System.Version
в My.Settings
, (Я хочу сохранить новую версию на случай, если пользователь попросит больше не напоминать об этом.)
Теперь я знаю, что могу сохранить версию в виде строки и конвертировать ее туда и обратно - что я сделал, чтобы обойти эту проблему - но как System.Version
указан в доступных настройках типов данных, я думаю, это должно работать. Но вместо сохранения версии он просто сохраняет XML-запись "Версия" без значения (см. Ниже).
Я использую 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>
Итак, что я делаю не так? Я прочитал несколько сообщений о необходимости сериализации классов, чтобы сохранить их в пользовательских настройках, но это простой номер версии, который, на первый взгляд, я бы ожидал, что это будет поддерживаемый тип данных.
1 ответ
Класс System.Version помечен SerializableAttribute
но вам нужно будет пометить свойство с помощью SettingsSerializeAsAttribute и передать значение System.Configuration.SettingsSerializeAs.Binary.
Вы не можете использовать интерфейс дизайнера параметров проекта для автоматической генерации кода, который вы нашли в Settings.designer.vb
файл. Вам нужно будет расширить класс My Namespace - MySettings самостоятельно. Это одна из областей, в которой полезны частичные классы.
Добавьте новый файл класса в свой проект и назовите что-нибудь креативное, например CustomMySettings. Выберите и удалите автоматически сгенерированный код в этом новом файле и замените его следующим кодом.
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
так же, как если бы вы создали настройку через дизайнер. При первом обращении к параметру он будет иметь нулевое значение (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