¿Cómo guardar / volver a cargar datos en vb.net después de cerrar .exe?

Soy nuevo en vb.net, y este es mi primer proyecto donde estoy bastante seguro de que hay una respuesta obvia que simplemente no puedo encontrar.

Problema: tengo una lista de una estructura que he definido con muchas propiedades. Quiero poder editar y cargar esa lista con los valores que he guardado en ella antes de cerrar el progtwig y cargarlo. ¿Cuál es la mejor manera de hacer esto?

Esto no es una cadena simple o bool, de lo contrario usaría la configuración de usuario que se sugiere comúnmente, en las propiedades del proyecto. He visto otros que lo guardan en un xml y lo vuelven a subir, pero no estoy dispuesto a hacerlo, ya que esto se va a distribuir a otros en masa. Debido a que es una estructura compleja, ¿cuál es el método preferido preferido?

Ejemplo

Aquí hay una estructura:

Structure animal Dim coloring as string Dim vaccinesUpToDate as Boolean Dim species as string Dim age as integer End structure 

Y hay una Lista (de animales) que el usuario agregará, por ejemplo, 1 gato, 2 perros, etc. Lo quiero para que una vez que los progtwigs se cierren después de que el usuario los haya agregado, esa estructura se guarde para tener ese 1 gato y 2 perros con esos ajustes para que pueda mostrarlos de nuevo. ¿Cuál es la mejor manera de guardar los datos en mi progtwig? ¡Gracias!

Considera la serialización. Para esto, una clase es más adecuada que una Struct antigua:

  Class Animal Public Property Name As String Public Property Coloring As String Public Property VaccinesUpToDate As Boolean Public Property Species As String Public Property DateOfBirth As DateTime Public ReadOnly Property Age As Integer Get If DateOfBirth <> DateTime.MinValue Then Return (DateTime.Now.Year - DateOfBirth.Year) Else Return 0 ' unknown End If End Get End Property ' many serializers require a simple CTor Public Sub New() End Sub Public Overrides Function ToString() As String Return String.Format("{0} ({1}, {2})", Name, Species, Age) End Function End Class 

La ToString() puede ser importante. Es lo que se mostrará si agrega objetos de Animal a un ListBox por ejemplo: “Stripe (Gremlin, 27)”

 Friend animalList As New List(of Animal) ' a place to store animals ' create an animal a = New Animal a.Coloring = "Orange" a.Species = "Feline" ' should be an Enum maybe a.Name = "Ziggy" a.BirthDate = #2/11/2010# animalList.Add(a) ' animalList(0) is now the Ziggy record. add as many as you like. 

En aplicaciones más complejas, puede escribir una clase de colección de Animals . En ese caso, la List podría ser interna y la colección podría guardar / cargar la lista.

 Friend Sub SaveData(fileName as String) Using fs As New System.IO.FileStream(fileName, IO.FileMode.OpenOrCreate) Dim bf As New BinaryFormatter bf.Serialize(fs, animalList) End Using End Sub Friend Function LoadData(fileName as String) As List(Of Animal) Dim a As List(of Animal) Using fs As New FileStream(fileName, FileMode.Open, FileAccess.Read) Dim bf As New BinaryFormatter a = CType(bf.Deserialize(fs), List(Of Animal)) End Using Return a End Function 

XMLSerialization, ProtoBuf e incluso json tienen la misma syntax. Para una pequeña cantidad de datos, una lista serializada es una alternativa fácil a una base de datos (y tiene muchos, muchos otros usos, como un mejor enfoque de Configuración).

Campos calculados como propiedades

Observe que agregué una propiedad BirthDate y cambié la Age para calcular el resultado. No debe guardar nada que pueda calcularse fácilmente: para actualizar la Age (o VaccinesUpToDate ) tendría que ‘visitar’ cada registro, realizar un cálculo y luego guardar el resultado, lo que podría ser incorrecto en 24 horas.

La razón para exponer Age como una propiedad (en lugar de una función) es para el enlace de datos. Es muy común usar una List como DataSource :

 animalsDGV.DataSource = myAnimals 

El resultado será una fila para cada animal con cada Propiedad como una columna. Fields como en la Structure original no aparecerán. Tampoco se mostraría una función Age() , envolviendo el resultado como una propiedad de solo lectura que lo muestra. En un PropertyGrid , se mostrará deshabilitado porque es RO.

Clase versus Estructura

Entonces, si una Estructura que usa Propiedades funcionará, ¿por qué usar una Clase en su lugar? Desde Elegir entre clase y estructura en MSDN , evite usar una estructura a menos que el tipo cumpla con todo lo siguiente:

  1. Lógicamente representa un único valor, similar a los tipos primitivos (int, double, etc.)
  2. Tiene un tamaño de instancia de menos de 16 bytes
  3. Es inmutable
  4. No tendrá que estar en caja con frecuencia

Animal falla los primeros 3 puntos (mientras que es un elemento local , no es un valor para el n. ° 1). También puede fallar el último dependiendo de cómo se usa.