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