powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не удаётся сериализовать объект, свойство которого единожды было указано как источник данн
3 сообщений из 3, страница 1 из 1
Не удаётся сериализовать объект, свойство которого единожды было указано как источник данн
    #36984249
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
====================
MS Visual Studio 2010
.Net Framewrk 3.5 SP1 x 86
Windows XP SP3 x86

====================

Добрый день.
Написал когда-то класс ObservableCollection<T> , т.к. в работе потребовался словарь, оповещающий о своём изменении.
Спустя некоторое время, решил на его основе создать механизм хранения настроек своих приложений. Для этого создал небольшой набор сериализуемых классов, которые позволяют решать данную задачу.
Всё это находится в одной библиотеке здесь (полный проект MS VS 2010).

Однако было бы удобно иметь некое графическое приложение, позволяющее работать с такими файлами настроек (они сериализуются в файлы). Сел писать WPF-приложение под это дело.

Это работает нормально:
Код: plaintext
1.
2.
3.
4.
//Создаю объект настроек
AppSettings sett = new AppSettings(Level.Common);
//Сериализую настройки во внешний файл
sett.Save(@"%AppData%\MyCAD\Settings\Common.xdat");

А вот это:
Код: plaintext
1.
2.
3.
4.
5.
//Создаю объект настроек
AppSettings sett = new AppSettings(Level.Common);
tree.ItemsSource = sett.Dictionary;//Элемент TreeView на окне
//Сериализую настройки во внешний файл
sett.Save(@"%AppData%\MyCAD\Settings\Common.xdat");
Выдаст ошибку:
MS VS 2010 SerializationException - не обработано
Тип "MS.Internal.Data.EnumerableCollectionView" в сборке "PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" не помечен как сериализуемый.


Т.е. если до сериализации свойство Dictionary моего класса я назначаю в качестве источника данных - сериализовать объект не удаётся. Не пойму почему.

Этот вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//Создаю объект настроек
AppSettings sett = new AppSettings(Level.Common);
tree.ItemsSource = sett.Dictionary;//Элемент TreeView на окне
...
tree.ItemsSource = null;//Это не спасёт
//Сериализую настройки во внешний файл
sett.Save(@"%AppData%\MyCAD\Settings\Common.xdat");
не спасает от возникновения указанной ошибки.

Чем может быть вызвана ошибка и как обойти это?
...
Рейтинг: 0 / 0
Не удаётся сериализовать объект, свойство которого единожды было указано как источник данн
    #36984400
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема решена:

Нужно было:
1. В классе
Код: plaintext
NoObservableDictionary<TValue> : NotifyPropertyChangedClass, INotifyCollectionChanged, IDictionary<string, TValue>
событие
Код: plaintext
public event NotifyCollectionChangedEventHandler CollectionChanged;
пометить атрибутом
Код: plaintext
[field: NonSerialized]
2. В классе
Код: plaintext
NotifyPropertyChangedClass : INotifyPropertyChanged
событие
Код: plaintext
public event PropertyChangedEventHandler PropertyChanged;
пометить атрибутом
Код: plaintext
[field: NonSerialized]

Тема закрыта.
...
Рейтинг: 0 / 0
Не удаётся сериализовать объект, свойство которого единожды было указано как источник данн
    #36984423
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне помогли на форуме МСДН. Полный ответ выглядит так:
PashaPashWPF создает обертку CollectionView для каждого IEnumerable, использованного в качестве датасорса. Обертка подписывается на события INotifyCollectionChanged.

При сериализации ты используешь BinaryFormatter, который сериализует все подряд, включая подписчиков на события. Поставь на поле события аттрибут NonSerializable:

[field:NonSerialized]
public event NotifyCollectionChangedEventHandler CollectionChanged;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Не удаётся сериализовать объект, свойство которого единожды было указано как источник данн
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]