Массив пользовательских классов внутри My.Settings - PullRequest
0 голосов
/ 17 октября 2010

У меня есть программа Visual Basic .Net 2.0. Я перемещаю настройки из старого файла настроек в файл настроек программы app.config. Я пытаюсь сделать это как можно лучше.

Итак, я добавил свою настройку , как показано на этом рисунке .

На нагрузке я делаю это:

If My.Settings.databaseConnectionSettings Is Nothing Then
            My.Settings.databaseConnectionSettings = New ArrayList()
End If

Это мой пользовательский класс:

Imports System.Xml.Serialization

<Serializable()> Public Class DatabaseConnectionSettings
    Private _nickname As String = String.Empty
    Private _username As String = String.Empty
    Private _password As String = String.Empty
    Private _database As String = String.Empty
    Private _server As String = String.Empty
    Private _ssl As Boolean

    Public Sub New()
        _nickname = ""
        _username = ""
        _password = ""
        _database = ""
        _server = ""
        _ssl = False
    End Sub

    Public Sub New(ByVal nickname As String, ByVal username As String, _
                   ByVal password As String, ByVal database As String, _
                   ByVal server As String, ByVal ssl As Boolean)
        _nickname = nickname
        _username = username
        _password = password
        _database = database
        _server = server
        _ssl = ssl
    End Sub

    Public Property nickname() As String
        Get
            Return _nickname
        End Get
        Set(ByVal Value As String)
            _nickname = Value
        End Set
    End Property

    Public Property username() As String
        Get
            Return _username
        End Get
        Set(ByVal Value As String)
            _username = Value
        End Set
    End Property

    Public Property password() As String
        Get
            Return _password
        End Get
        Set(ByVal Value As String)
            _password = Value
        End Set
    End Property

    Public Property database() As String
        Get
            Return _database
        End Get
        Set(ByVal Value As String)
            _database = Value
        End Set
    End Property

    Public Property server() As String
        Get
            Return _server
        End Get
        Set(ByVal Value As String)
            _server = Value
        End Set
    End Property

    <XmlElementAttribute(ElementName:="ssl")> Public Property ssl() As Boolean
        Get
            Return _ssl
        End Get
        Set(ByVal Value As Boolean)
            _ssl = Value
        End Set
    End Property

End Class

И вот как я это использую:

Dim databaseSettings As New DatabaseConnectionSettings( _
                        Me.txtNickName.Text, Me.txtUser.Text, Me.txtPass.Text, Me.txtData.Text, _
                            Me.txtServer.Text, Me.chkSSL.Checked)
                        'This statement will increment the arraylist count'
                        My.Settings.databaseConnectionSettings.Add(databaseSettings)
                        'This statement will save everything but the array list'
                        My.Settings.Save()
                        'This statement reloads everything, but the array list.  The array list count after this goes to zero.'
                        My.Settings.Reload() 'If I remove this, program works fine until next run.'

Итак, вопрос в том, как мне получить этот массив моих баз данных DatabaseConnectionSettings, сохраненных в постоянном хранилище? Я хочу сделать это самым чистым способом. То есть я не хочу преобразовывать его в строку или сохранять в отдельный файл каждый раз, когда я хочу его использовать. Я хотел бы иметь возможность использовать метод доступа My.Settings.

Обратите внимание, что он работает отлично, за исключением того, что он не сохраняется в хранилище.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2012

МНОГИЕ НОВЫЕ ПРОГРАММИСТЫ, ДАЖЕ РАСШИРЕННЫЕ, НЕ ЗНАЮТ, КАК СОХРАНИТЬ ТАМОЖЕННЫЙ КЛАСС В ЗАГАДКАХ.

ЗДЕСЬ ЕГО ИДЕАЛЬНОЕ РЕШЕНИЕ

  1. ВЫ СОЗДАЕТЕ КЛАСС И ПОЛУЧАЕТЕ, ЧТО ВАМ ХОТИТЕ
  2. СОЗДАНИЕ ТИПА НАСТРОЙКИ: СПИСОК МАРШРУТОВ В MYSETTINGS
  3. В КОДЕ, КОГДА ВЫ ХОТИТЕ СОХРАНИТЬ, ВАМ НУЖНО ПОЛУЧИТЬ ПАМЯТЬ КЛАССА, СЕРИАЛИЗИРОВАТЬ, ИСПОЛЬЗОВАТЬ ФОРМАТОР.

ПРИМЕР

Dim formatter As Runtime.Serialization.IFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter
            Dim ms As New IO.MemoryStream
            formatter.Serialize(ms, original)
            Return ms
  1. СОХРАНИТЬ ДЛЯ ЧАСТЕЙ В ARRAYLIST, ДОБАВИТЬ ЗНАЧЕНИЕ ТИПА БАЙТА (), КАК: ms.ToArray

ЭТО РАБОТАЕТ, И КОГДА ПРИЛОЖЕНИЕ,ЕГО ОТКЛЮЧЕНИЕ И ВНОВЬ ОТКРЫТО, Массив () все еще будет в загадках

  1. СЕЙЧАС, КОГДА ВЫ ХОТИТЕ ИСПОЛЬЗОВАТЬ ЗНАЧЕНИЕ, ВАМ НУЖНО ОБУЧИТЬ БАЙТЫ С ИСПОЛЬЗОВАНИЕМ ФОРМАТЕРА.

ЗДЕСЬ СВОЙ КЛАСС, КОТОРЫЙ Я СДЕЛАЛ, ЭТО ПОМОГАЕТ СЕРИАЛИЗИРОВАТЬ, ПОЛУЧИТЬ ПАМЯТЬ ИЗ ЛЮБОГО ОБЪЕКТА, КОТОРЫЙ ВЫ ХОТИТЕ, И ДЕЗЕРИАЛИЗИРОВАТЬ.

Public Class SerializableObjectCopier(Of ObjectType)
        Public Function GetMemoryStream(ByVal original As ObjectType) As IO.MemoryStream
            Dim formatter As Runtime.Serialization.IFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter
            Dim ms As New IO.MemoryStream
            formatter.Serialize(ms, original)
            Return ms
        End Function
        Public Function GetCopy(ByVal original As ObjectType) As ObjectType
            Dim formatter As Runtime.Serialization.IFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter
            Dim ms As New IO.MemoryStream
            formatter.Serialize(ms, original)

            ms.Seek(0, IO.SeekOrigin.Begin)
            Return CType(formatter.Deserialize(ms), ObjectType)
        End Function
        Public Function GetCopy(ByVal ms As System.IO.MemoryStream) As ObjectType
            Dim formatter As Runtime.Serialization.IFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter
            ms.Seek(0, IO.SeekOrigin.Begin)
            Return CType(formatter.Deserialize(ms), ObjectType)
        End Function
    End Class

ЕСЛИ ВАМ НУЖНА НЕКОТОРАЯ ПОМОЩЬ ИЛИ ИМЕТЬ ВОПРОС ЗДЕСЬ, МОЙ ЭЛЕКТРОННЫЙ ПОЧТА1031 * bboyse aaron GmA IL doot com

2 голосов
/ 17 октября 2010

Отладка + Исключения, установите флажок Брошенный для исключений CLR. Теперь вы увидите, что происходит не так. Есть несколько исключений, но вторым нарушителем сделки является «Тип ... не ожидался».

Атрибуты необходимы, чтобы сообщить сериализатору xml, какие типы хранятся в ArrayList. Это описано в этой странице библиотеки MSDN , раздел «Сериализация списка массивов». Проблема в том, что вы не можете применить обязательный атрибут [XmlElement], поскольку экземпляр ArrayList объявлен в автоматически сгенерированном коде. Универсальный список (Of T) не имеет такой же проблемы, но теперь вы столкнетесь с ограничением в конструкторе настроек, он не поддерживает универсальные типы.

Ну, рок и тяжелое место здесь, вы не можете сделать эту работу. StringCollection является неприятной альтернативой. Или откажитесь от идеи использования настроек для этого и просто сделайте это самостоятельно с сериализацией XML. Или все, что вы предпочитаете.

...