Есть класс :
[Serializable]
public class UserAccount
{
public string Name { get; set; }
public string Surname { get; set; }
public string Login { get; set; }
public PasswordBox Password { get; set; }
public UserAccount(string _name, string _surname, string _login, PasswordBox _password)
{
Name = _name;
Surname = _surname;
Login = _login;
Password = _password;
}
}
Метод десериализации:
public void Deserialize()
{
try
{
FileStream fs = new FileStream("..\\..\\Accounts.dat", FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
listUsers = (List
catch
{
listUsers = new List
Ошибка:
Exception thrown: 'System.Windows.Markup.XamlParseException' in
PresentationFramework.dll
Additional information: 'The invocation of the constructor on type 'Gallery.ViewModels.LoginViewModel' that matches the specified
binding constraints threw an exception.' Line number '15' and line
position '10'.
Update
public class LoginViewModel : INotifyPropertyChanged
{
private List
public LoginViewModel()
{
_currentName = String.Empty;
_currentSurname = String.Empty;
_currentLogin = String.Empty;
_currentPasswordBox = new PasswordBox();
Deserialize();
}
private string _currentSurname;
public string CurrentSurname
{
get
{
return _currentSurname;
}
set
{
_currentSurname = value;
OnPropertyChanged();
}
}
private string _currentName;
public string CurrentName
{
get
{
return _currentName;
}
set
{
_currentName = value;
OnPropertyChanged();
}
}
private string _currentLogin;
public string CurrentLogin
{
get
{
return _currentLogin;
}
set
{
_currentLogin = value;
OnPropertyChanged();
}
}
private PasswordBox _currentPasswordBox;
public PasswordBox currentPassword
{
get { return _currentPasswordBox; }
set
{
_currentPasswordBox = value;
OnPropertyChanged();
}
}
private RegistrationCheckCommand checkReg;
public ICommand ButtonClick
{
get { return checkReg ?? (checkReg = new RegistrationCheckCommand(o => AddNewAccount())); }
}
private void AddNewAccount()
{
UserAccount user = new UserAccount(CurrentName, CurrentSurname, CurrentLogin, currentPassword);
listUsers.Add(user);
Serialize();
MessageBox.Show("Account adding!");
}
public void Serialize()
{
try
{
FileStream fs = new FileStream("..\\..\\Accounts.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, listUsers);
fs.Close();
}
catch
{
}
}
public void Deserialize()
{
//try
//{
FileStream fs = new FileStream("..\\..\\Accounts.dat", FileMode.Open);
BinaryFormatter formatter = new BinaryFormatter();
listUsers = (List
//catch
//{
// listUsers = new List
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Xaml
StackTrace
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler
handler, __BinaryParser serParser, Boolean fCheck, Boolean
isCrossAppDomain, IMethodCallMessage methodCallMessage)
at
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream
serializationStream, HeaderHandler handler, Boolean fCheck, Boolean
isCrossAppDomain, IMethodCallMessage methodCallMessage)
at
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream
serializationStream)
at Gallery.ViewModels.LoginViewModel.Deserialize() in
C:\Users\Константин\Documents\Visual Studio
2015\Projects\Gallery\Gallery\ViewModels\LoginViewModel.cs:line
121
Ответ
Замените тип данного свойства
public PasswordBox Password { get; set; }
на string или любой другой тип, не являющийся коллекцией и помеченный как сериализуемый.
PasswordBox - контрол, контролы не сериализуются с помощью стандартных сериализоторов, т.к. являются рекурсивной коллекцией, т.е. любой контрол содержит коллекцию дочерних котролов, пустую или нет - неважно.
После изменений, удалите файл данных, повторите сериализацию и десериализацию.
С ограничениями может быть использован специальный сериализатор либо ручная сериализация.
Комментариев нет:
Отправить комментарий