¿Cómo debo almacenar datos de solo lectura para implementarlos con mi aplicación?

17

Estoy desarrollando una aplicación de escritorio, y esta aplicación requiere cierta información para ejecutarse, pero no cambia nada de esta información (los datos deben cargarse en cada ejecución de la aplicación, pero los datos nunca cambian). Los datos deben almacenarse en la misma computadora en la que se ejecuta la aplicación (¿almacenamiento del lado del cliente?).

También es mejor si el usuario no puede cambiar fácilmente esta información (suponga que no tiene mucho conocimiento de TI).

¿Cómo debo almacenar este tipo de información? ¿Una base de datos local? XML que se envía con la aplicación?

Estoy usando WPF.

appa yip yip
fuente
2
Esto no es un meta. Un meta es un sitio para discutir problemas o inquietudes sobre los sitios principales donde se hacen preguntas.
jpmc26
1
¿Por qué no quieres que los usuarios cambien la información? ¿Es eso un problema de seguridad o qué? ¿Se supone que esta información debe mantenerse en secreto para el usuario? Las razones podrían cambiar enormemente qué respuestas son apropiadas.
jpmc26
1
@ jpmc26 Bueno, es una especie de preocupación de seguridad, pero no es un gran problema. El objetivo principal de la aplicación es comunicarse a través de un puerto serie con un controlador de temperatura (como este ), y el XML almacenará cierta información sobre las direcciones de memoria del controlador. Si el usuario lo modifica, puede causar problemas durante la ejecución, por lo que me gustaría evitarlo. Pero es solo una preocupación, como dije, no es un gran problema. ps: editó la pregunta para reemplazar meta para SE . Gracias.
appa yip yip
2
Si desea una base de datos local, eche un vistazo a SQLite. (Pero si los datos son lo suficientemente pequeños como para cargarlos en la RAM al inicio, prefiero un archivo estructurado simple como json o algo binario)
CodesInChaos
1
"Si el usuario lo modifica, puede causar problemas durante la ejecución, por lo que me gustaría evitarlo". no suena como una preocupación de seguridad en absoluto. Una preocupación de seguridad es aquella en la que tiene una frase de contraseña o similar en el archivo. Simplemente coloque la configuración en un archivo XML al lado del ejecutable y coloque un comentario en la parte superior que diga "¡No toque la configuración en este archivo!". Si el usuario edita archivos aleatorios en su directorio de instalación, entonces se merecen cualquier rotura que obtengan.
Roger Lipscombe

Respuestas:

14

Un archivo binario sería la respuesta obvia, pero depende de cómo lo esté cargando; también podría facilitarle la vida si puede.

XML podría ser una buena opción ya que hay métodos integrados en C # para leer esto. Puede agregar una suma de verificación a sus datos, de modo que si el usuario la modifica, la suma de verificación ya no coincidirá (debe agregar una verificación para asegurarse de que la suma de verificación sea válida)

Una base de datos local puede crear más problemas porque tiene otras dependencias que necesita para poder acceder a ella

Matt Wilko
fuente
No he pensado en la suma de comprobación, es una muy buena idea. Entonces, ¿genero una suma de verificación y la almaceno en mi aplicación, así que cada vez que deserializo el XML, genero una nueva suma de verificación y la comparo con la primera?
appa yip yip
44
Si almacena la suma de verificación en la aplicación, nunca permitirá una configuración diferente, por lo que también puede almacenar los datos de configuración como constantes de la aplicación en su código. Si desea poder cambiar la configuración en el futuro, agregue la suma de verificación (un mejor término sería un "hash") como un campo del XML y utilícelo para verificar que el XML no ha sido alterado. Por supuesto, un atacante determinado podría investigar su código, encontrar su lógica hash y usarla para producir archivos XML válidos, pero de todos modos las aplicaciones del lado del cliente siempre son vulnerables a atacantes determinados.
SJuan76
44
En lugar de archivo o base de datos local, el archivo de recursos incrustado en el ensamblado sería mejor. Oculto para el usuario final, fácilmente manejable por el desarrollador pero aún fácil de usar. Si el rendimiento es una preocupación, entonces la serialización binaria sería superior.
PTwr
@ SJuan76 Sí, el problema del hash en XML es que se puede cambiar si alguien lo deserializa. De todos modos, si el XML cambia (lo que creo que no va a suceder, pero quién sabe) solo cambiará en una nueva versión de la aplicación, así que supongo que me quedaré con el código hash.
appa yip yip
2
@schmaedeck: los archivos de recursos son literalmente archivos dentro del binario ejecutable. Iconos y cadenas y cualquier otro dato constante que su programa necesite.
Mooing Duck
21

Si los datos nunca cambian y son de solo lectura , simplemente colóquelos en un archivo de código como una lista de constantes.

public readonly string AppStartUpData = "MyAppNeedsThis";

Si estos datos son diferentes por implementación, entonces un archivo externo está bien.

.Net viene con archivos .config integrados (App.Config). Uno debería usarlos ya que hay formas estándar (integradas en el marco) para leer la información de ellos.

Use los archivos de configuración en caso de que una configuración deba cambiar (nunca digas nunca), ya que son solo archivos de texto (Xml). Si hay información confidencial, se puede cifrar una configuración si es necesario.

Jon Raynor
fuente
Pensé en las constantes / readonlys, el problema es que hay muchos datos, así que supongo que haré un seguimiento con el archivo externo. ¡Gracias!
appa yip yip
55
@schmaedeck ... ¿y? Puede poner esas definiciones en un archivo separado e importarlo. De hecho, creo que Qt hace este tipo de cosas al compilar formularios y cosas así que terminas con archivos generados automáticamente que tienen megabytes de datos binarios (por ejemplo, imágenes) en algunas constantes, pero si está en un archivo separado no hay nada de malo en eso .
Bakuriu
15

Siempre puede agregar un archivo a su proyecto y establecer su tipo de compilación para Embedded Resourceque se incruste directamente en la aplicación misma.

Alternativamente, un archivo que se cifra y se coloca en una ubicación accesible.

TheLethalCoder
fuente
1
Esta es la mejor respuesta. Me gustaría ver más orientación sobre cómo lograrlo. Obtiene los beneficios de un archivo de configuración potencialmente modificable, pero puede mantenerlo estático ya que está incrustado en su ensamblaje.
Gusdor
5

Si no desea que el usuario eche un vistazo a los datos, debe serializarlos en un archivo de datos binarios.

Solo la aplicación sabría la longitud de los fragmentos para leer.

No sé C # pero en Java crearías el archivo así:

FileOutputStream fos = new FileOutputStream(file);      
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(var1);
oos.writeObject(var2);
oos.writeObject(var3);
oos.writeObject(var4);

... y ellos lo leen así:

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object o[] = new Object[4];
o[0] = ois.readObject();
o[1] = ois.readObject();
o[2] = ois.readObject();
o[3] = ois.readObject();
Tulains Córdova
fuente
Seguramente usaré la serialización binaria. ¡Muchas gracias por su tiempo!
appa yip yip