Сериализация c # создает пустой файл - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь разработать приложение для библиотеки на 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, чтобы сообщить связанным компонентам окна, что изменение было сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...