You can mark the class as serializable with [SERIALIZE], even though the buttons can not be serialized you will have to mark them in this way "[NonSerialized] Button btn = new Button ();" I enclose a code fragment that could help you
IFormatter formatter = new BinaryFormatter();
String directorio = Environment.CurrentDirectory + "..\Listas";
PARA GUARDAR
saveFileDialog1.InitialDirectory = directorio;
saveFileDialog1.FileName = "";
saveFileDialog1.Filter = "(*.btn)|*.btn";
if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Stream stream = new FileStream(saveFileDialog1.FileName, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, "TU OBJETO DE LA CALSE VA AQUI");
stream.Close();
}
break;
PARA ABRIR
openFileDialog1.FileName = "";
openFileDialog1.Filter = "(*.btn)|*.btn";
openFileDialog1.InitialDirectory = directorio;
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
g.Clear(BackColor);
grafo.Clear();
Stream stream = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.None);
grafo = ("TU OBJETO DE LA CALSE VA AQUI")formatter.Deserialize(stream);
stream.Close();
"AQUI RECONSTRUYES TODOS TUS BOTONES, YA QUE UN OBJETO BOTON NO ES SERIALIZABLE"
Invalidate();
}