Я пытаюсь разработать приложение для библиотеки на c #, но я застрял в сериализации класса ObservableCollection.
Тест функции:
[TestMethod]
public void saveFile_createTheFile()
{
var btn_saveFile = createA<WpfButton>("btn_saveToFile");
if (fileManager.saveFileExists())
return;
btn_saveFile.Click();
fileManager.saveFileExists().ShouldBeTrue();
}
Я думаю, что это автоматическиДокументально, легко понять.Я столкнулся с двумя проблемами: - после теста создается файл сохранения, но сообщение об ошибке теста говорит мне, что метод saveFileExists () возвращает false.- файл сохранения создан в правильном каталоге, но это пустой файл, я не знаю почему.
вот мой класс инструментов, посвященный управлению файлами:
public class FileManager
{
private string SAVEFILE = "datas.saved";
public string appDir = null;
public string pathToSaveFile = null;
public FileManager()
{
appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
pathToSaveFile = Path.Combine(appDir, SAVEFILE);
}
public Boolean saveFileExists()
{
return File.Exists(Directory.GetCurrentDirectory() + "\\" + SAVEFILE);
}
public void saveToFile(ObservableCollection<Book> books)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(SAVEFILE, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, books.ToArray());
stream.Close();
}
}
может кто-нибудь сказать мне, почему я получаю эти две ошибки?
спасибо
ps: при запуске коллекция содержит 2 книги. Класс Book является сериализуемым.
EDIT
Я нашел причину: при отладке я получил эту ошибку: в методе "formatter.Serialize (...)" возникает ошибка "PropertyChangeEventManager не сериализуем".Действительно, вот класс Book:
[Serializable]
public class Book : INotifyPropertyChanged
{
public string _title;
public string title
{
get { return _title; }
set
{
_title = value;
OnPropertyChanged("title");
}
}
public string _author;
public string author
{
get { return _author; }
set
{
_author = value;
OnPropertyChanged("author");
}
}
public string _editor;
public string editor
{
get { return _editor; }
set
{
_editor = value;
OnPropertyChanged("editor");
}
}
public string _isbn;
public string ISBN
{
get { return _isbn; }
set
{
_isbn = value;
OnPropertyChanged("ISBN");
}
}
public DateTime _bookAdded;
public DateTime bookAdded
{
get { return _bookAdded; }
set
{
_bookAdded = value;
OnPropertyChanged("bookAdded");
}
}
public Book(string isbn,string title,string author,string editor, DateTime bookAdded)
{
this.title = title;
this.ISBN = isbn;
this.author = author;
this.editor = editor;
this.bookAdded = bookAdded;
}
public Book()
{
bookAdded=DateTime.Today;
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
, это подкласс, и базовый класс, несомненно, добавил некоторые несериализуемые поля.Как я могу избежать этого?Я скорее новичок в wpf, но я думаю, что уведомления являются обязательными в Book, чтобы сообщить связанным компонентам окна, что изменение было сделано.