.net - read - My.Settings no guarda una ArrayList
manual de programacion android pdf (1)
Si tiene los datos en un arrayList (o List o Collection), y está buscando en el BinaryFormatter la solución alternativa, no hay una buena razón para usar también My.Settings. Puede hacer lo que hace a través de BinaryFormatter, que es solo 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 ajustes:
Dim bf As New BinaryFormatter
Using fs As New FileStream(myFile, FileMode.OpenOrCreate)
bf.Serialize(fs, MRUArrayList )
End Using
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 tiene que recurrir a BF para solucionar el problema, reemplazar Memory Stream con File Stream elimina la necesidad de My.Settings por completo, le permite almacenar el archivo donde lo desee y no cambiará por versión, el usuario cambiará el nombre de EXE. o cualquier otra cosa, a menos que cambie la fórmula del nombre de archivo anterior.
Para una aplicación con más que solo la lista de matrices de MRU, puede usar una clase en su lugar para almacenar todas las configuraciones en la ubicación que desea de forma muy parecida a la configuración. Solo necesita etiquetar la Clase como <Serializable>
. Sigue siendo una línea de código para guardar toda la clase, una línea para reconstituirla. Hay algunas limitaciones, pero 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 usar el serializador XML o ProtoBuf-NET según sea necesario para la situación.
También puede hacer que su nueva configuración se guarde automáticamente cuando el programa sale: Vaya a Propiedades del proyecto -> Aplicación -> Haga clic en Ver eventos de la aplicación . Seleccione "Eventos de la aplicación" en el menú de la izquierda, y Apagar en el menú derecho del evento.
Private Sub MyApplication_Shutdown(sender As Object,
e As EventArgs) Handles Me.Shutdown
'' add your code to Save (above) here
End Sub
Del mismo modo, puede hacer que los cargue automáticamente en el evento de Startup
.
Establecí esta propiedad de vacío:
Pero después de asignar un nuevo objeto ArrayList a la propiedad, la propiedad siempre sigue vacía en cada ejecución de la aplicación.
En un controlador del evento MyBase.Load hago una llamada a este método, solo 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 puede ver en el código anterior, estoy asignando una nueva ArrayList con una entrada, pero los cambios solo tienen efecto durante la ejecución de la aplicación. Si salgo de la aplicación, la propiedad se vuelve a vació.
Y también, por supuesto, he marcado esta opción:
Pero de todos modos eso es innecesario ya que estoy guardando la configuración a mano en el código, entonces ...
¿Por qué sucede esto?
¿Cómo puedo resolver este problema?
ACTUALIZAR:
Investigué y parece que este es un problema conocido que Array, ArrayLists y cualquier colección genérica (de tipo) no pueden ser guardadas por my.settings (pero, por otro lado, una colección StringCollection)
Pero en la última respuesta de esta publicación (la respuesta de MemoryStream) explica una forma fácil de guardar permanentemente los cambios de una ArrayList en my.settings y luego leerla en la siguiente ejecución de la aplicación.
La respuesta parece muy buena, pero estoy un poco perdido con el código y los pasos a seguir, para que alguien pueda explicar los pasos explicados allí, pero en un lenguaje legible para mí, por favor.
He verificado que 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 la lista de arreglos anterior, entonces lo que estoy haciendo ahora es asignar las Mis configuraciones. Configuración de MRU como un Arraylist que contiene más Arraylists
lugar de ArrayList original que contenía un String()
?, Y de todos modos cómo cargar las entradas del arreglo después de guardar la configuración de esta manera ?.
Esto es lo que he intentado con 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)