Salvataggio array

martedì 30 dicembre 2008 - 11.20

toniovigi Profilo | Expert

Ciao ragazzi
ho un array di button,
ogni elemento contiente il proprio button (text,height,width,....)
Devo riuscire a salvare questo array in modo tale che quando riapro l'applicazione io possa ricaricarlo e quindi riavere i miei buttoni con i loro valori all'interno
di esso

come ovviare??
Grazie

Antonio

Teech Profilo | Expert

Puoi serializzare l'array su un file XML. Ho trovato questo esempio (come traccia) sul web:

PER SERIALIZZARE
Dim list As ArrayList = New ArrayList() Dim out As StreamWriter = New StreamWriter("array.xml") Dim ser As XmlSerializer = New XMLSerializer(list.GetType()) list.Add("aaa") list.Add("bbb") list.Add("ccc") ser.Serialize(out, list)

PER DESERIALIZZARE
Dim serializer As New System.xml.Serialization.XmlSerializer(GetType(Arr ayList)) ' A FileStream is needed to read the XML document. Dim fs As New System.IO.FileStream("C:\array.xml", System.IO.FileMode.Open) Dim reader As New System.Xml.XmlTextReader(fs) Dim list As ArrayList = CType(serializer.Deserialize(reader), ArrayList) Dim counter As Integer = 0 For counter = 0 To list.Count - 1 MessageBox.Show(list(counter)) Next

--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

lorecosta Profilo | Junior Member

Un'idea potrebbe essere scrivere i valori in una struttura di un file xml...


Lorenzo


...non avevo visto che avevano già risposto!

toniovigi Profilo | Expert

cè questo bel esempio in c#??

aiedail92 Profilo | Expert

Ciao

Potresti usare la serializzazione. Puoi serializzare sia in Xml che in binario, rispettivamente con le classi XmlSerializer (namespace System.Xml.Serialization) e BinaryFormatter (namespace System.Runtime.Serialization.Formatters.Binary). Eccoti un esempio:

//L'array dei tuoi bottoni Button[] arr = new Button[50]; //Crea il serializzatore Xml XmlSerializer serializer = new XmlSerializer(arr.GetType()); //Apre lo stream in uscita dove serializzare l'array using (FileStream file = new FileStream(@"C:\serialized.xml", FileMode.Create)) { serializer.Serialize(file, arr); } //Oppure in binario: BinaryFormatter formatter = new BinaryFormatter(); //Apre lo stream in uscita dove serializzare l'array using (FileStream file = new FileStream(@"C:\serialized.dat", FileMode.Create)) { formatter.Serialize(file, arr); }

E per deserializzare:

//il risultato della deserializzazione Button[] arr; //Crea il serializzatore Xml XmlSerializer serializer = new XmlSerializer(typeof(Button[])); //Apre lo streamda dove effettuare la deserializzazione using (FileStream file = new FileStream(@"C:\serialized.xml", FileMode.Open)) { //Deserializza e ottiene il risultato arr = serializer.Deserialize(file) as Button[]; } //Oppure in binario: BinaryFormatter formatter = new BinaryFormatter(); //Apre lo stream ida dove deserializzare using (FileStream file = new FileStream(@"C:\serialized.dat", FileMode.Open)) { //Deserializza e ottiene il risultato arr = formatter.Deserialize(file) as Button[]; }

[edit]Scusate ragazzi non avevo visto [/edit]

Luca

lorecosta Profilo | Junior Member

prova a tradurlo con uno dei tanti tools che ci sono online..
ad esempio http://www.developerfusion.com/tools/convert/vb-to-csharp/




... sono troppo avanti questi ragazzi!...

toniovigi Profilo | Expert

Errore nella reflection del tipo 'System.Windows.Forms.Button[]'

mi da questo errore nella riga XmlSerializer serializer = new XmlSerializer(ipet.GetType());

aiedail92 Profilo | Expert

Ah giusto, la classe Button non ha l'attributo Serializable ^^"

Ti scrivo un piccolo workaround per sistemare la faccenda: ho creato una struttura contentente le informazioni rilevanti sul Button, quindi vai a serializzare quella:

[Serializable()] public struct ButtonInfo { public ButtonInfo(Button from) { this.Name = from.Name; this.Text = from.Text; this.Bounds = from.Bounds; } public static implicit operator ButtonInfo(Button from) { return new ButtonInfo(from); } public static implicit operator Button(ButtonInfo from) { Button b = new Button(); b.Name = from.Name; b.Text = from.Text; b.Bounds = from.Bounds; return b; } public string Name; public string Text; public Rectangle Bounds; } //L'array dei tuoi bottoni Button[] arr = new Button[50]; //Crea i rispettivi ButtonInfo ButtonInfo[] info = new ButtonInfo[50]; for (int i = 0; i < info.Length; i++) { info[i] = arr[i]; } //Crea il serializzatore Xml XmlSerializer serializer = new XmlSerializer(info.GetType()); //Apre lo stream in uscita dove serializzare l'array using (FileStream file = new FileStream(@"C:\serialized.xml", FileMode.Create)) { serializer.Serialize(file, info); } //Oppure in binario: BinaryFormatter formatter = new BinaryFormatter(); //Apre lo stream in uscita dove serializzare l'array using (FileStream file = new FileStream(@"C:\serialized.dat", FileMode.Create)) { formatter.Serialize(file, info); }

Luca

toniovigi Profilo | Expert

scusa nn riesco ad implementeare il tuo codice

guardo ho rifatto una form da 0 in modo tale da capire questa serializzazione dato che è la prima volta che la utilizzo

Ho messo 2 bottoni nella mia form al solo scopo di capire

bottone1 Serializza

bottone2 Deserliazza

partendo che ho un array di button di 4 valori

quindi
Button[] ipet = new button[4];
ipet[1].text="test1";
ipet[2].text="test2";
ipet[3].text="test3";
ipet[4].text="test4";

come devo fare la serializzazione di questo array,quindi clicco button1 per serializzare e poi button2 per "scaricare i dati"


aiedail92 Profilo | Expert

Ciao

In pratica poichè la classe Button non è serializzabile, ho creato una struttura serializzabile implicitamente convertibile da e in Button, che contiene le proprietà che ti interessa salvare (e quindi serializzare). In questo modo invece che serializzare il tuo array di Button, serializzi un array equivalente di ButtonInfo, e stesso per la deserializzazione. Comunque ecco il codice che dovresti usare:

/// <summary> /// Questa struttura viene usata per racchiudere le proprietà del bottone che vuoi salvare /// </summary> [Serializable()] public struct ButtonInfo { /// <summary> /// Crea una struttura ButtonInfo a partire da un bottone, copiando le proprietà rilevanti /// </summary> public ButtonInfo(Button from) { this.Name = from.Name; this.Text = from.Text; this.Bounds = from.Bounds; //Assegna le altre proprietà che intendi salvare } /// <summary> /// Conversione implicita da Button a ButtonInfo /// </summary> /// <remarks>Serve per poter scrivere buttonInfo = button;</remarks> public static implicit operator ButtonInfo(Button from) { return new ButtonInfo(from); } /// <summary> /// Conversione implicita da ButtonInfo a Button /// </summary> /// <remarks>Serve per poter scrivere button = buttonInfo;</remarks> public static implicit operator Button(ButtonInfo from) { Button b = new Button(); b.Name = from.Name; b.Text = from.Text; b.Bounds = from.Bounds; //Assegna le altre proprietà che intendi salvare return b; } //Nome del Button public string Name; //Testo del button public string Text; //Posizione e dimensioni del Button public Rectangle Bounds; //Aggiungi altre proprietà da serializzare } //Nella tua Form: //Questi sono i bottoni da serializzare\deserializzare Button[] ipet = new Button[4]; private void Serializza_Click(object sender, EventArgs e) { //Il tuo array di button, lo converte in un array di ButtonInfo ButtonInfo[] buttons = new ButtonInfo[ipet.Length]; //Copia ogni Button nell'array, convertendolo (implicitamente) in ButtonInfo for (int i = 0; i < buttons.Length; i++) { buttons[i] = ipet[i]; } //Crea il serializzatore Xml, serializza un array di tipo ButtonInfo XmlSerializer xmlSerializer = new XmlSerializer(buttons.GetType()); //Apre lo stream per salvare sul file using (FileStream stream = new FileStream(@"C:\XmlSerialized.xml", FileMode.Create)) { //Serializza l'array sul file xmlSerializer.Serialize(stream, buttons); } // - oppure - //Crea il serializzatore binario: BinaryFormatter formatter = new BinaryFormatter(); //Apre lo stream per salvare sul file using (FileStream stream = new FileStream(@"C:\BinarySerialized.dat", FileMode.Create)) { //Serializza l'array sul file formatter.Serialize(stream, buttons); } } private void Deserializza_Click(object sender, EventArgs e) { //Abbiamo serializzato un array di ButtonInfo, quindi deserializ- //zeremo un array di ButtonInfo e li convertiremo in Button ButtonInfo[] buttons; //Crea il deserializzatore Xml XmlSerializer xmlSerializer = new XmlSerializer(typeof(ButtonInfo[])); //Apre il file da cui leggere i dati da deserializzare using (FileStream stream = new FileStream(@"C:\XmlSerialized.xml", FileMode.Open)) { //Deserializza i dati buttons = xmlSerializer.Deserialize(stream) as ButtonInfo[]; } // - oppure - //Crea il deserializzatore binario BinaryFormatter formatter = new BinaryFormatter(); //Apre il file da cui leggere i dati da deserializzare using (FileStream stream = new FileStream(@"C:\BinarySerialized.dat", FileMode.Open)) { //Deserializza i dati buttons = formatter.Deserialize(stream) as ButtonInfo[]; } //Adesso converte (implicitamente) ogni ButtonInfo in un Button, //inserendoli nel tuo array di Button ipet = new Button[buttons.Length]; for (int i = 0; i < ipet.Length; i++) { ipet[i] = buttons[i]; } }

Luca

toniovigi Profilo | Expert

Provo ad implementare il tuo codice,spero funzioni,
domanda,davo un occhiata sul web, si potrebbe anche usare il setting file??Quando si clicca su esplora soluzioni,poi proprietà quella pagina "setting" può centrare??


Inoltre, riprendendo il codice di prima,

li si parla di "proprietà rilevanti"

se io volessi anche tenere conto degli eventi?come bisognerebbe muoversi??

Grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5