Mi.La configuración no se guarda un ArrayList
-
20-12-2019 - |
Pregunta
Me he fijado este vacío propiedad de:
Pero después de la asignación de un nuevo ArrayList objeto de la propiedad, la propiedad siempre vacía en cada ejecución de la aplicación.
En un controlador de MyBase.Carga caso tengo que hacer una llamada a este método, sólo para probar este problema:
sub blahblah handles mybase.load
me.CheckRecentFiles
end sub
Private Sub CheckRecentFiles()
Try
' This throws an object not referenced exception 'cause always is empty.
MsgBox(My.Settings.RecentFiles.Count)
Catch ex As Exception
MsgBox(ex.Message)
End Try
' Just for testing, if the collection is empty then I instance a new ArrayList
' and I assign it to the property and I save it and exit from the application.
' But even doing this the property is always empty in the next execution.
If My.Settings.RecentFiles Is Nothing Then
My.Settings.RecentFiles = New ArrayList
My.Settings.RecentFiles.Add({"test-Item1", "test-Item2", "Test-Item3"})
My.Settings.Save()
Application.Exit()
End If
End Sub
Como se puede ver en el código anterior estoy asignación de un nuevo ArrayList con una entrada, pero los cambios sólo se aplicarán durante la ejecución de la aplicación, si salgo de la aplicación, a continuación, la propiedad pasa de nuevo vacía.
Y también, por supuesto he comprobado esta opción:
Pero de todos modos que es innecesario ya que estoy guardar la configuración manualmente en el código, así que...
¿Por qué sucede esto?.
Cómo puedo resolver este problema?.
ACTUALIZACIÓN:
He investigado y parece que este es un problema conocido de que las Matrices, ArrayLists y cualquier colecciones Genéricas(De Tipo) no puede ser salvado por el mi.configuración (pero en el otro lado un StringCollection puede)
Pero en la última respuesta de este post (MemoryStream respuesta) explica de una manera fácil de guardar permanentemente los cambios de un ArrayList para mi.configuración y, a continuación, leer en la siguiente ejecución de la aplicación.
La respuesta parece muy buena, pero estoy un poco perdido con el código y las medidas que proceda, por lo que alguien podría explicar los pasos que se explican ahí, pero en un formato legible idioma para mí por favor?
He comprobado que el ArrayList permanece en la siguiente ejecución de la aplicación, sí, pero no estoy seguro de lo que estoy haciendo porque si MemoryStream contiene el antiguo ArrayList entonces lo que estoy haciendo ahora Es la asignación de la Mi.Los ajustes.MRU como un Arraylist que contiene más Arraylists
en lugar de la original ArrayList que contiene un String()
?, y de todos modos cómo cargar la matriz de entradas después de guardar la configuración de esta manera?.
Esto es lo que he tratado de esa respuesta:
' Create the ArrayList
Dim tmpArrayList = New System.Collections.ArrayList
tmpArrayList.Add({"test-Item1-1", "test-Item1-2", "Test-Item1-3"})
tmpArrayList.Add({"test-Item2-1", "test-Item2-2", "Test-Item2-3"})
' Serialize the arraylist entries:
Dim formatter As Runtime.Serialization.IFormatter =
New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim ms1 As New IO.MemoryStream
formatter.Serialize(ms1, tmpArrayList)
' Save the ArrayList
My.Settings.MRU = New ArrayList(ms1.ToArray) ' I think it hould be like that?
' Load the ArrayList contained in My.Settings.MRU (no idea)
Solución
Si tenemos los datos en una arrayList (o la Lista o Colección), y que busca en la BinaryFormatter para la solución, no hay ninguna buena razón para también usar Mi.Los ajustes.Usted puede hacer lo que se hace a través de la BinaryFormatter, que se acaba de guardar el archivo y elegir un nombre.
Imports System.Runtime.Serialization.Formatters.Binary
Private MRUArrayList = New ArrayList
' file location
myFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment. _
SpecialFolder.ApplicationData),
CompName,
ProgramName,
File)
Guardar Configuración:
Dim bf As New BinaryFormatter
Using fs As New FileStream(myFile, FileMode.OpenOrCreate)
bf.Serialize(fs, MRUArrayList )
End Using
La Configuración De Carga:
' dont attempt for the first time run
If File.Exists(myFile) = False Then Return False
Dim bf As New BinaryFormatter
Using fs As New FileStream(myFile, FileMode.Open)
MRUArrayList = CType(bf.Deserialize(fs), ArrayList)
End Using
Una vez que usted tiene que recurrir a BF para la solución, en sustitución de la Secuencia de Memoria con una Secuencia de Archivos elimina la necesidad para Mi.Configuración totalmente, permite almacenar el archivo donde quieras y no lo puedo cambiar por la versión, el usuario cambiar el nombre del EXE o cualquier otra cosa a menos que cambie el nombre de archivo de la fórmula anterior.
Para una Aplicación mucho más que el MRU ArrayList, puede utilizar una Clase en su lugar para almacenar todos los ajustes a la ubicación en la que desea muy parecida a la de Configuración no hace.Usted necesidad justa de la etiqueta de la Clase como <Serializable>
.Se mantiene una línea de código para guardar toda la clase, una línea para la reconstitución de la misma.Hay algunas limitaciones, pero que no son difíciles de superar.
Private myNewSettings As New myNewSettingsClass
...
bf.Serialize(fs, myNewSettings)
myNewSettings = CType(bf.Deserialize(fs), myNewSettingsClass )
En otras situaciones, puede utilizar el serializador de XML o ProtoBuf-NET como necesario para la situación.
Usted también puede tener su nueva configuración guarda automáticamente cuando se sale del programa:Ir a Propiedades Del Proyecto --> Aplicaciones --> Haga Clic En La Vista De Eventos De Aplicación.Seleccione la Aplicación "Eventos" en el menú de la izquierda, y Apagado desde la derecha del menú evento.
Private Sub MyApplication_Shutdown(sender As Object,
e As EventArgs) Handles Me.Shutdown
' add your code to Save (above) here
End Sub
Asimismo puede cargar automáticamente en el Startup
evento.