Не удается сохранить тип 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
Другие вопросы по тегам