Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   ¿Cuál es el mejor archivo para guardar y recuperar datos? (https://www.clubdelphi.com/foros/showthread.php?t=96103)

REHome 11-02-2023 19:43:26

¿Cuál es el mejor archivo para guardar y recuperar datos?
 
Hola:

Antes usaba muchos el XML para guardar y leer datos que tenía en el formulario. Por ejemplo en este caso.



Código:

using System;
using System.Windows.Forms;
using System.Xml;

namespace Guardar_y_cargar_datos_en_archivo_xml
{
 * *public partial class Form1 : Form
 * *{
 * * * *public Form1()
 * * * *{
 * * * * * *InitializeComponent();
 * * * *}

 * * * *// Guarda los datos introducidos a parte de crear el archivo "miXML.xml".
 * * * *private void button_Guardar_Click(object sender, EventArgs e)
 * * * *{
 * * * * * *XmlWriter w = XmlWriter.Create("miXML.xml");
 * * * * * *w.WriteStartElement("MiInfo");
 * * * * * *w.WriteElementString("TextBox", textBox1.Text);
 * * * * * *w.WriteElementString("CheckBox", checkBox1.Checked.ToString());
 * * * * * *w.WriteElementString("radioButton1", radioButton1.Checked.ToString());
 * * * * * *w.WriteElementString("radioButton2", radioButton2.Checked.ToString());
 * * * * * *w.WriteEndElement();
 * * * * * *w.Close();
 * * * *}

 * * * *private void Form1_Load(object sender, EventArgs e)
 * * * *{
 * * * * * *try
 * * * * * *{
 * * * * * * * *XmlReader r = XmlReader.Create("miXML.xml");
 * * * * * * * *r.ReadStartElement("MiInfo");
 * * * * * * * *textBox1.Text = r.ReadElementContentAsString();
 * * * * * * * *checkBox1.Checked = Convert.ToBoolean(r.ReadElementContentAsString());
 * * * * * * * *radioButton1.Checked = Convert.ToBoolean(r.ReadElementContentAsString());
 * * * * * * * *radioButton2.Checked = Convert.ToBoolean(r.ReadElementContentAsString());
 * * * * * * * *r.ReadEndElement();
 * * * * * * * *r.Close();
 * * * * * *}
 * * * * * *catch (Exception)
 * * * * * *{

 * * * * * * * *//
 * * * * * *}

 * * * *}
 * *}
}

El archivo se genera en el disco duro o SSD hoy en día y pone esto.

Código:

<MiInfo>
<TextBox>Texto y textos</TextBox>
<CheckBox>True</CheckBox>
<radioButton1>False</radioButton1>
<radioButton2>True</radioButton2>
</MiInfo>

Me funciona de maravilla para lo que es el XML y me lo recomendaron en este foro hace años, desde el 2.008.

Ahora, veo mucho con el santo JSON.

¿Es recomendable usar el JSON?

Si es cierto o no. Quiero hacer el mismo ejemplo de recuperar y guardar datos como se hizo el XML.

Saludos.

mamcx 11-02-2023 20:58:19

El "mejor" formato depende de los requisitos y todo eso. Si no hay un problema con tu uso de XML, no veo el porque cambiar por cambiar.

REHome 12-02-2023 11:39:44

Más que cambiar quier probar cosas que nunca he probado como el json, también porque cada vez más lo usan más y más, a parte de eso, parece más fácil de leer por el humano que muchas etiquetas que tiene el XML a lo HTML, tiene menos peso entre otras ventajas.

Casimiro Notevi 12-02-2023 14:23:35

Prefiero el .ini de toda la vida, es más simple :)

REHome 12-02-2023 14:46:02

Precisamente usaba *.ini y me comentaron ya por el 2.000 que es muy lento, intento con .reg y me dice que te relantiza Windows con el tiempo, mejor nunca tocar el editor de registro, al final me enseñaron XML y mal hecho, a lo antigua, ahora se hace con clases. Hoy en día por su versatilidad el json.

¿Qué entiende más el humano?
XML
Código:

    <?xml version="1.0" encoding="utf-8"?>
    <MiInfo>
        <TextBox>Hola.</TextBox>
        <CheckBox>True</CheckBox>
        <radioButton1_Luz_ON>False</radioButton1_Luz_ON>
        <radioButton2_Luz_OFF>True</radioButton2_Luz_OFF>
    </MiInfo>

Json
Código:

    {
        "MiInfo":
                {
                    "TextBox": "Hola.",
                    "CheckBox": "True",
                    "radioButton1_Luz_ON": "False",
                    "radioButton2_Luz_OFF": "True"
                }
    }

Saludos.

Casimiro Notevi 12-02-2023 15:04:23

Todo depende de para lo que se use exactamente.
Mucho más simple, claro... y rápido así:
Código:

TextBox: Hola.
CheckBox: True
radioButton1_Luz_ON: False
radioButton2_Luz_OFF: True


MAXIUM 12-02-2023 17:39:54

Concuerdo con legibilidad y simpleza de Jsom vs XML

Y si bien sigo usando .ini por su minimalismo y eficacia. No me atrevería a usarlo para decenas de datos.

dec 13-02-2023 09:26:36

Hola a todos,

Estoy con Mario. Depende del uso que se le quiera dar. Hay datos, por ejemplo, que pueden guardarse en XML (usando "CDATA") que no sería posible o sería muy complicado guardar en archivos JSON, por ejemplo. De modo que depende del uso que se le vaya a dar al archivo y a los datos que se necesita guardar en el mismo. Si son datos verdaderamente simples acaso el venerable INI, o acaso JSON, en lugar de XML, pero, lo cierto es que cada archivo tiene sus más y su menos.

Neftali [Germán.Estévez] 13-02-2023 10:06:44

Al final todos los tipos de los que estamos hablando son ficheros de texto, por lo tanto son muy similares.
A mi me siguen gustando, por simplicidad y por legibilidad, los .INI

Para los otros, XML y JSON, lo primero que tengo que hacer al abrirlos con un editor (Notepad++) es formatearlos, cosa que me ha mucha rabia/madra. :p
Si se necesita más complejidad (por ejemplo anidamiento) ya si que es necesario ir a XML/JSON.

Y entre estos 2 pues casi mejor (en mi caso) JSON, por legibilidad también, y porque puedes usar clases nativas; Los XMLDoc, Xml.XMLIntf, XMLDom, me resultan incómodos.

Por otro lado, yo he usado a veces esto, que resulta muy útil y cómodo (siempre y cuando la estructura del JSON no cambie):
https://jsontodelphi.com/

Ñuño Martínez 15-02-2023 10:30:36

Yo suelo usar IFF. De hecho hace poco subí mis clases a SourceForge con el nombre de iff4pascal. Si no lo había dicho es porque estaba pensando en si añadir soporte a RIFF, pero tampoco veo el porqué... :rolleyes::p;) Bueno, eso y que todavía no lo he probado con Delphi, aunque no debería dar muchos problemas.

REHome 19-02-2023 13:14:40

Lo he logrado con el Newtonjson, en el cual es una librería externa.

El resultado me queda en una sola línea y no me gusta. Por ejemplo.
Código:

{"TextBox":"Hola Club Delphi","CheckBox":true,"RadioButton1_Luz_ON":true,"RadioButton2_Luz_OFF":false}
Cuando en realidad debe quedar así para su fácil entendimiento o de forma legible.
Código:

{
    "TextBox":"Hola Club Delphi",
    "CheckBox":true,
    "RadioButton1_Luz_ON":true,
    "RadioButton2_Luz_OFF":false
}

Al menos ya puedo guardar y leer el json de una vez por todas. Ya averiguaré el formato de guardado como dije arriba.

Lo que estoy intentado, es evitar librerías de terceros como el Newtonjson, lo que no sabía que está el System.Text.json de la propia .net 7.0, que en realidad es nuevo en el core ya que el .net 4.8 hacia atrás no lo incluye.

Dejo aquí el código por si alguien lo necesita o por curiosear hecho con el Newtonjson.
Código:

using Newtonsoft.Json;

namespace Guardar_y_cargar_datos_en_archivo.json_.NET_7._0
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        class MiInfo
        {
            public string? TextBox { get; set; }
            public bool CheckBox { get; set; }
            public bool RadioButton1_Luz_ON { get; set; }
            public bool RadioButton2_Luz_OFF { get; set; }
        }

        void SalvarDatos()
        {
            MiInfo miInfo = new()
            {
                TextBox = textBox1.Text,
                CheckBox = checkBox1.Checked,
                RadioButton1_Luz_ON = radioButton1.Checked,
                RadioButton2_Luz_OFF = radioButton2.Checked
            };

            try
            {
                string serializado = JsonConvert.SerializeObject(miInfo);
                File.WriteAllText(@"Ejemplo.json", serializado);
            }
            catch {}
        }

        void RecuperarDatos()
        {
            if (File.Exists(@"Ejemplo.json"))
            {
                string serializado = File.ReadAllText(@"Ejemplo.json");
                //MiInfo miInfo = (MiInfo)JsonConvert.DeserializeObject(serializado);
                MiInfo miInfo = JsonConvert.DeserializeObject<MiInfo>(serializado);
                if (miInfo != null)
                {
                    textBox1.Text = miInfo.TextBox;
                    checkBox1.Checked = miInfo.CheckBox;
                    radioButton1.Checked = miInfo.RadioButton1_Luz_ON;
                    radioButton2.Checked = miInfo.RadioButton2_Luz_OFF;
                }
            }
        }

        private void button_Guardar_Click(object sender, EventArgs e)
        {
            SalvarDatos();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RecuperarDatos();
        }
    }
}

Como podrán ver, he intentado usarlo con la librería de la propia Visual Studio Community 2022 usando .NET 7.0 y no es compatible.

¿Alguna idea sobre cómo adaptar de Newtosjon al de Microsoft que viene de serie?

En cuanto a los ini, los abandoné desde hace años cuando me dijeron que es muy viejo y lento, tampoco use el editor de registro para guardar datos y leerlos, ya que esta el Windows cada vez sería más lento, que suse XML y lo he usado hasta a día de hoy y ahora quiero ver el json por lo que veo, antes lo ignoraba y parece mejor que el xml y depende para qué, al menos para leer y entender de entrada, parece el más recomendable, por se usa cada vez más y más.

Saludos.

Casimiro Notevi 19-02-2023 13:47:17

Cita:

Empezado por REHome (Mensaje 550439)
En cuanto a los ini, los abandoné desde hace años cuando me dijeron que es muy viejo y lento

Eso son prejucios de quien te lo dijo. ¿Acaso no es lo mismo que dicen de Delphi, que es viejo?

Si todo lo que vas a almacenar es algo así:
Cita:

TextBox=Hola Club Delphi
CheckBox=true
RadioButton1_Luz_ON=true
RadioButton2_Luz_OFF=false
Es lo más simple, directo, claro y cómodo de usar, te sirve cualquier editor.

Ahora, si vas a almacenar "registros" en ese fichero de texto, eso ya sería distinto.

REHome 19-02-2023 20:21:38

Se ve muy bien el ini, lo recuerdo bien y lo usaba mucho el Officce 1997. Los de ahora no lo he mirado y mira que ha llovido desde entonces.

No recordaba que el más rápido y también me aconsejaron, es usar el binario.
https://learn.microsoft.com/es-es/do...e?view=net-7.0

Como no lo lee en el block de notas, por muy rápido que sea, lo descarté.

Y mira que Delphi, lo tengo todavía pendiente para hacer cosas relacionados con Arduino, ejemplos, pequeños tutoriales. Hace años hice un tutorial sencillo, así que Delphi no quede en el olvido, ya que Java por medio, que si Python, que si el Visual Studio y no se qué, pascal en general solo lo apoya Delphi.



Gracias.

mamcx 19-02-2023 23:14:07

Varias veces hablas de algo "rápido" pero lo que muestras no veo algo que lo demande. Si no hablamos de varias megas/gigas no va a ver enorme diferencia entre los formatos.

Creo que si no tienes claro el porque estas buscando un formato ninguno va a resaltar.


P.D: La version moderna de los INI es el TOML https://toml.io/en/

Casimiro Notevi 20-02-2023 10:39:47

Cita:

Empezado por mamcx (Mensaje 550444)
P.D: La version moderna de los INI es el TOML https://toml.io/en/

TOML [Tom's Obvious Minimal Language]
Viendo el ejemplo de su web, está claro que es un nombre muy apropiado.
¿Sabes si hay algo implementado en Delphi para usarlos?

mamcx 20-02-2023 15:57:07

Parece que para FPC:

https://github.com/toml-lang/toml/wiki

https://github.com/genericptr/fpTOML

Ñuño Martínez 21-02-2023 10:47:29

Esto de TOML está chulo.

Ahora recuerdo que hace años creé un sistema propio y gerárquico y llegué a usarlo en programas para clientes. No voy a entrar en detalles porque lo tengo borroso, pero quizá deba darle una vuelta y re-inventarlo a partir de lo que recuerdo...

Casimiro Notevi 21-02-2023 12:13:59

Cita:

Empezado por Ñuño Martínez (Mensaje 550470)
Esto de TOML está chulo.

Muy chulo, muy completo, con esas listas y demás queda muy completo.
Cita:

Empezado por Ñuño Martínez (Mensaje 550470)
Ahora recuerdo que hace años creé un sistema propio y gerárquico y llegué a usarlo en programas para clientes. No voy a entrar en detalles porque lo tengo borroso, pero quizá deba darle una vuelta y re-inventarlo a partir de lo que recuerdo...

^\||/

REHome 28-02-2023 03:06:04

Teniendo este código que por fin ya funciona, lo de guardar y leer controles como configuración de formulario Windows.

Uso el .NET 7.0 y tiene su propia librería. Mi idea es no usar librerías externas como Newtonjson, si no el que incluye el propio .NET.

La librería oficial de Visual Studio viene aquí.

Dejo el código aquí abajo hecho con Newtonjson.
Código:

using Newtonsoft.Json;

namespace Guardar_y_cargar_datos_en_archivo.json_.NET_7._0
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        class MiInfo
        {
            public string? TextBox { get; set; }
            public bool CheckBox { get; set; }
            public bool RadioButton1_Luz_ON { get; set; }
            public bool RadioButton2_Luz_OFF { get; set; }
        }

        void SalvarDatos()
        {
            MiInfo miInfo = new()
            {
                TextBox = textBox1.Text,
                CheckBox = checkBox1.Checked,
                RadioButton1_Luz_ON = radioButton1.Checked,
                RadioButton2_Luz_OFF = radioButton2.Checked
            };

            try
            {
                string serializado = JsonConvert.SerializeObject(miInfo);
                File.WriteAllText(@"Ejemplo.json", serializado);
            }
            catch {}
        }

        void RecuperarDatos()
        {
            if (File.Exists(@"Ejemplo.json"))
            {
                string serializado = File.ReadAllText(@"Ejemplo.json");
                //MiInfo miInfo = (MiInfo)JsonConvert.DeserializeObject(serializado);
                MiInfo miInfo = JsonConvert.DeserializeObject<MiInfo>(serializado);
                if (miInfo != null)
                {
                    textBox1.Text = miInfo.TextBox;
                    checkBox1.Checked = miInfo.CheckBox;
                    radioButton1.Checked = miInfo.RadioButton1_Luz_ON;
                    radioButton2.Checked = miInfo.RadioButton2_Luz_OFF;
                }
            }
        }

        private void button_Guardar_Click(object sender, EventArgs e)
        {
            SalvarDatos();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RecuperarDatos();
        }
    }
}

Ahora toca hacer lo que se tenga que hacer con la librería que incluye el .net.

¿Alguna idea?

Lo pregunto porque veo que no es para nada compatible entre Newtonjson con el json .net de Microsoft.


https://learn.microsoft.com/es-es/do...r?view=net-7.0

Saludos.


La franja horaria es GMT +2. Ahora son las 21:09:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi