Ошибка сериализации ObservableCollection

Рейтинг: 0Ответов: 0Опубликовано: 29.05.2023

Приложение MVVM WPF, в нём имеется ListBox, который привязан (Binding) к ObservableCollection. Мне нужно, чтобы каждый раз при изменении этого ListBox он сериализовался. Для этого написал статический класс:

internal static class TaskDataManager
    {
        public static void SaveTaskCollection(ObservableCollection<Task> collection, DateTime date)
        {
            string fileName = Path.Combine(ApplicationPaths.DatesFolder, DateConverter.ConvertToSaveFormat(date));
            using (Stream stream = File.Open(fileName, FileMode.Create))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, collection);
            }
        }
    }

К коллекции в конструкторе прописал событие CollectionChanged:

public ObservableCollection<Task> MondayItems { get; set; }

MondayItems.CollectionChanged += CollectionChanged;

private void CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
    TaskDataManager.SaveTaskCollection((ObservableCollection<Task>)sender, FirstDayWeekDate);
}

Данный код успешно сериализует коллекцию с 0 либо 1 элементом в ней, но когда событие вызывается с коллекцией из 2 и более элементов строка formatter.Serialize(stream, collection); выбрасывает исключение System.Runtime.Serialization.SerializationException: "Serializing delegates is not supported on this platform.".

Пробежавшись по интернету и глянув пару похожих проблем ничего не подметил, так как вызваны они там другими факторами, по типу этого.

Однако если прописать в конструкторе следующий код, коллекция будет сохранятся с любым количеством элементов и ошибка выше воспроизводится не будет:

public ViewModelWeek()
        {
            //Генерация трёх элементов для ObservableCollection
            MondayItems = TaskLipsumGenerator.Next(3);

            //Успешное сохранение коллекции
            TaskDataManager.SaveTaskCollection(MondayItems, FirstDayWeekDate);
        }

Из оставшегося выходит, что ошибку может вызывать сам CollectionChanged, однако каким образом я так и не понял. Буду рад почитать ваши идеи по этому поводу.

Ответы

Ответов пока нет.