Изменение свойства во ViewModel, делающее модель неосериализуемой? - PullRequest
0 голосов
/ 26 августа 2010

Хорошо, я немного озадачен этим.Изменение несвязанного свойства int в моей ViewModel, по-видимому, делает мою модель неосериализуемой.

У меня есть объект, который отслеживает наилучшее время для контакта с кем-либо.Это может быть установлено на Anyday, будни, вечера, SpecificDays и на Anytime, утром, днем, вечером и SpecificTimes.Когда объект сохраняется, он сериализуется и отправляется на сервер WCF.

По сути, объект представляет собой набор из 7 дней.Каждый день содержит целое число для дня недели, коллекцию TimeSpans, которые определяют хорошие часы вызова для этого дня, коллекцию логических флагов, которые определяют, какие «горячие» группы времени были выбраны (Утро, День, Вечер и т. Д.).

Я использую MVVM и имею виртуальную машину для обработки этого класса.Единственное свойство, которое содержит виртуальная машина, кроме коллекции дней, - это значение типа int, для которого определена группа ярлыков для рабочих дней (Weekdays, Weekends и т. Д.).

Все работает абсолютно нормально, пока я не установил для группы «Ярлыки» для «Будни» значение «SpecificDays».При сохранении я получаю сообщение об ошибке при попытке передать объект на сервер WCF.Ошибка говорит, что она не может сериализовать параметр с внутренним исключением, показанным ниже (имейте в виду, что ошибки WCF очень общие и часто вообще не указывают на проблему).Вот скриншот того, что я пытаюсь сделать:

Sample Image

Это не имеет смысла для меня, потому что ShortcutWeekday вообще не отправляется на сервер WCF.Единственное, что идет, это сбор Дней.И еще одна загадочная вещь, щелкнув радиокнопку «Определенные дни», а затем вернувшись к другому выбору, вызовет сбой вызова WCF.Кроме того, если бы проблема была с моим классом, не потерпел бы он неудачу в любое время, а не только в определенные дни?Я дважды проверил значения свойств коллекции Days, используя приведенный выше пример, и свойства объекта установлены точно так же.

Внутреннее исключение:

"Type 'System.DelegateSerializationHolder+DelegateEntry' with data contract name 
'DelegateSerializationHolder.DelegateEntry:http://schemas.datacontract.org/2004/07/System' 
is not expected. Consider using a DataContractResolver or add any types not known 
statically to the list of known types - for example, by using the KnownTypeAttribute 
attribute or by adding them to the list of known types passed to DataContractSerializer."

Свойства ViewModel:

// Used to track which Radio Button is selected
private int _selectedWeekdayGroup = 0;

// Object holding the current BestContactTime
private BestContactTime _bestContactTime;

// Shortcut to multiple Days in BestContactTime
public int SelectedWeekdayGroup
{
    get { return _selectedWeekdayGroup; }
    set
    {
        //UpdateCallableDays(value); // This updates the BestContactTime.Days collection
        _selectedWeekdayGroup = value;
        //OnPropertyChanged("SelectedTimesGroups"); // This property is just which set of ShortcutTimes are displayed in checkboxes 
    }
}

BestContactTime:

// Should always have only 7 objects, one per day of week
public ObservableCollection<ContactDay> Days;

Contact Day:

public int WeekDay;
public SortableObservableCollection<TimeSpan> CallableTimes;
public SortableObservableCollection<bool> CallableTimeGroups;

SortableObservableCollection - это просто класс, который наследуется от ObservableCollection с некоторыми дополнительными методами, такими как Sorting и AddRange.

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

Вы можете использовать мой sertool , чтобы убедиться в этом, но я подозреваю, что это всего лишь случай не-сериализуемой привязки к событию в вашей модели, и поэтому сериализация не удалась.

Вы можете исправить с помощью:

[field:NonSerialized]

на оскорбительные события.

2 голосов
/ 26 августа 2010

Похоже, установка свойства вызывает добавление обработчика событий.
Попробуйте добавить [field: NonSerialized] к событию.

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