Сериализация моего класса терпит неудачу из-за обработчика событий - PullRequest
0 голосов
/ 20 октября 2010

Я не ожидал встретить эту ошибку. Я предполагаю, что я делаю что-то не так в другом месте.

У меня есть приложение MVVM.

Моя модель может сериализовать себя, используя BinaryFormatter. Это работало нормально.

Сегодня я добавил обработчик событий в свою модель, и модель представления, содержащая модель, подписывается на это событие.

Теперь, когда я пытаюсь сериализовать модель, я получаю сообщение об ошибке, потому что моя модель представления не является сериализуемой (по замыслу).

Я уверен, что речь идет о подписке на событие, потому что я удалил подписку (и только эту), и сериализация снова работает.

Я не могу применить атрибут [NonSerialized] к обработчику, потому что это не поле.

Есть ли способ обойти эту проблему?

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

вы можете сделать это:

[field:NonSerialized]
public event EventHandler MyEvent;
1 голос
/ 20 октября 2010

Вы можете сделать событие таким полем:

    [NonSerialized]
    private EventHandler _eventHandler;

    public event EventHandler MyEvent
    {
        add { _eventHandler += value; }
        remove { _eventHandler -= value; }
    }
0 голосов
/ 20 октября 2010

Я не знаю, насколько это полезно, но ...

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

[NonSerialized]
private EventHandler _nonSerializableeventHandler;
private EventHandler _eventHandler;

public event EventHandler MyEvent
{
    add
    {
        if (value.Method.DeclaringType.IsSerializable)
            _eventHandler += value;
        else
            _nonSerializableeventHandler += value;
    }
    remove
    {
        {
            if (value.Method.DeclaringType.IsSerializable)
                _eventHandler -= value;
            else
                _nonSerializableeventHandler -= value;
        }
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...