Вообще, я бы сделал бы модель данных, привязал бы ее к контролам через DataBindings и сохранял/загружал бы уже именно ее.
Пример с формой входа (на форме два текстовых поля, txtUserName и txtPassword, и две кнопки, buttonSave и buttonLoad):
Формаpublic partial class Form1 : Form
{
private readonly LoginViewModel viewModel;
public Form1()
{
InitializeComponent();
viewModel = new LoginViewModel();
txtUserName.DataBindings.Add(new Binding("Text", viewModel, "UserName", false, DataSourceUpdateMode.OnPropertyChanged));
txtPassword.DataBindings.Add(new Binding("Text", viewModel, "Password", false, DataSourceUpdateMode.OnPropertyChanged));
}
private void buttonSave_Click(object sender, EventArgs e)
{
var file = GetFilePath();
using (var buffer = File.OpenWrite(file))
{
var formatter = new BinaryFormatter();
formatter.Serialize(buffer, viewModel);
}
}
private void buttonLoad_Click(object sender, EventArgs e)
{
var model = LoadContent() as LoginViewModel;
if (model != null)
{
viewModel.Password = model.Password;
viewModel.UserName = model.UserName;
}
}
private static object LoadContent()
{
var file = GetFilePath();
if (!File.Exists(file))
return null;
using (var buffer = File.OpenRead(file))
{
var formatter = new BinaryFormatter();
try
{
return formatter.Deserialize(buffer);
}
catch
{
//TODO Add error handling
return null;
}
}
}
private static string GetFilePath()
{
var directory = Path.GetDirectoryName(typeof(Form1).Assembly.Location);
return Path.Combine(directory, "store.txt");
}
}
Модель:[Serializable]
public class LoginViewModel : INotifyPropertyChanged
{
private string _userName;
private string _password;
public string UserName
{
get { return _userName; }
set
{
_userName = value;
NotifyPropertyChanged(nameof(UserName));
}
}
public string Password
{
get { return _password; }
set
{
_password = value;
NotifyPropertyChanged(nameof(Password));
}
}
private void NotifyPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
[field: NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
}
Как такого прямого процесса сериализации и десереализации формы нет, т.к. там очень много вещей в бэкграунде (свойства, события и т.п.), которые мешают этому процессу.
Один из вариантов обхода, это именно DataBindings, как я показал на примере.