Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 30 Julio 2014, 17:08 pm



Título: ¿ Como preservar los cambios de un ArrayList en My.Settings ?
Publicado por: Eleкtro en 30 Julio 2014, 17:08 pm
Buenas

He acudido a varias personas del planeta para intentar resolver este problema de la manera idonea, pero por desgracia nadie ha podido aportarme algo de lúz a este misterio...

Me gustaría usar la interface de My.Settings para poder implementar una MRU (http://en.wikipedia.org/wiki/Most_Recently_Used) algo avanzada en una aplicación, cada entrada de la MRU debería contener una imagen (Bitmap), un índice (Int32), y una cadena (String), pero la interface My.Settings es incompatible con Types genéricos (Ej: Tuple(of Bitmap, Integer, String) ) así que el type que mejor se adapta a mis necesidades es un ArrayList, porque antes que ponerme a escribir una pequeña Class serializable para almacenar estos 3 datos insignificantes prefiero usar un ArrayList que ya está implementado, sinceramente.

El problema es que los cambios que se efectuen a la propiedad no se preservan en los siguientes inicios de la aplicación ...y eso es lo que nadie me ha sabido resolver, yo por mi parte he probado todo lo que se me ha ocurrido, incluso la serialización del ArrayList pero he acabado echo un lio con eso.

Teniendo en cuenta que tenemos una propiedad como esta (con el ArrayList inicializado o sin inicializar, ¡no importa!):
(http://i.imgur.com/8uCoRQp.jpg)

Este código que he escrito demuestra el problema:
Código
  1. Public Class Test
  2.  
  3.    Private Sub Test_Handler() Handles MyBase.Shown
  4.  
  5.        ' Create a temporal predefined ArrayList.
  6.        Dim tmpArrayList As New ArrayList(capacity:=10I)
  7.        With tmpArrayList
  8.            .Add({"Item0", 0.0F})
  9.            .Add({"Item1", 0.5F})
  10.        End With
  11.  
  12.        ' Check the setting status.
  13.        If My.Settings.MRU Is Nothing Then
  14.            Debug.WriteLine("MRU setting is null.")
  15.            Debug.WriteLine("Initializing the Setting...")
  16.            My.Settings.MRU = New ArrayList(capacity:=10I)
  17.  
  18.        ElseIf Not My.Settings.MRU.Count Then
  19.            Debug.WriteLine("MRU is not null but the ArrayList is empty.")
  20.            Debug.WriteLine("Adding some items...")
  21.            My.Settings.MRU = tmpArrayList.Clone
  22.  
  23.        ElseIf My.Settings.MRU.Count Then
  24.            Debug.WriteLine("MRU setting is OK.")
  25.            Debug.WriteLine("Item Count: " & CStr(My.Settings.MRU.Count))
  26.            Threading.Thread.Sleep(Integer.MaxValue)
  27.  
  28.        End If
  29.  
  30.        Debug.WriteLine("Saving any changes")
  31.        My.Settings.Save()
  32.  
  33.        Debug.WriteLine("Updating any changes")
  34.        My.Settings.Reload()
  35.  
  36.        Debug.WriteLine(String.Empty)
  37.        Debug.WriteLine("****************************************")
  38.        Debug.WriteLine("Checking again the MRU setting status in...")
  39.        For Count As Integer = 1 To 3
  40.            Debug.WriteLine(CStr(Count) & New String("."c, Count))
  41.            Threading.Thread.Sleep(TimeSpan.FromSeconds(1))
  42.        Next
  43.        Debug.WriteLine("****************************************")
  44.        Debug.WriteLine(String.Empty)
  45.  
  46.        Me.Test_Handler()
  47.  
  48.    End Sub
  49.  
  50. End Class

¿Alguien conoce el motivo de porque ocurre esto, porque los cambios no se preservan en el siguiente inicio de la aplicación, y como poder solucionarlo?

PD: Me gustaría dejar bien claro que conozco varios métodos o mejor dicho alternativas para conseguir hacer lo mismo (es decir, guardar un archivo de configuración legible por la app), pero yo me he propuesto hacer esto usando My.Settings debido a las ventajas y comodidades que ofrece, quiero encarecidamente intentar resolver este problema unicamente usando my.settings y conocer con exactitud el motivo de porque el ArrayList no se preserva, no busco alternativas ...pues ya las conozco.

Gracias.


Título: Re: ¿ Como preservar los cambios de un ArrayList en My.Settings ?
Publicado por: El Benjo en 30 Julio 2014, 19:49 pm
Parece que tampoco se puede guardar el tipo 'ArrayList' en 'My. Settings'. Es decir, la aplicación puede decirte que los guarda pero sólo en memoria, nunca en disco. Aquí está otra persona con el mismo problema.

http://stackoverflow.com/questions/25008539/my-settings-does-not-save-an-arraylist (http://stackoverflow.com/questions/25008539/my-settings-does-not-save-an-arraylist)

Y no tienes que crearte un método serializador para guardar eso. Con las funciones para serializar del propio .NET debería ser suficiente. A como yo lo veo, es la única solución que existe para guardar en 'My.Settings'. Saludos.


Título: Re: ¿ Como preservar los cambios de un ArrayList en My.Settings ?
Publicado por: Eleкtro en 30 Julio 2014, 21:50 pm
Aquí está otra persona con el mismo problema.
Por desgracia Googleando no se puede encontrar mucha más información que esa acerca de este problema específico.
PD: Me hizo gracia lo de "otra persona", no te fijaste lo suficiente en el nombre del usuario :P

Citar
Y no tienes que crearte un método serializador para guardar eso. Con las funciones para serializar del propio .NET debería ser suficiente. A como yo lo veo, es la única solución que existe para guardar en 'My.Settings'. Saludos.

Por serializable no quise decir desarrollar un serializador, quise decir: crear una Class, añadirle 3 propiedades públicas ("image", "index", "file") declarar la Class como serializable (ISerializable (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable%28v=vs.110%29.aspx)), y luego reemplazar el uso del ArrayList por una colección de objetos, de esta Class, y usar los métodos ya existentes para serializar y deserializar la colección en "X" archivo, lo que quise decir era eso, y que para hacer todo ese rollo teniendo disponible un ArrayList entonces ¿para que hacerlo?, prefiero aprovechar la comodidad del ArrayList pero no hay por donde cojerlo.

Si supieras como guardar los cambios del ArrayList en la propiedad de My.Setting aunque fuese serializando la colección entonces me gustaría que pudieses mostrarme un ejemplo, yo lo intenté como puedes comprobar en el update de aquél post que citaste, pero en un comentario más abajo explico que acabé echo un lio porque no tenia muy claro si estaba serializando un Arraylists que contenia otro Arraylist Arraylist(Arraylist), y luego para deserializarlo acabé echo un lio también con el Stream de memoria, no tengo mucha experiencia en eso.

Gracias por comentar El Benjo

Un saludo!


Título: Re: ¿ Como preservar los cambios de un ArrayList en My.Settings ?
Publicado por: El Benjo en 31 Julio 2014, 08:14 am
Jajajajajajajaja Lo siento, creo que lo de 'otra persona' era una ilusión. Y sí, creo que entiendo tu problema con lo de la serialización. Lamento no poder ayudarte, pero si se me ocurre algo sin muchas complicaciones, te digo.