Как игнорировать член класса Event для двоичной сериализации? - PullRequest
16 голосов
/ 05 марта 2010

Мне нужно избегать сериализации члена класса Event, потому что когда событие обрабатывается объектом, не помеченным как Serializable, сериализация завершится неудачей.

Я пытался использовать атрибут NonSerialized для члена класса Event, но он не компилируется. Эта строка кода:

<NonSerialized()> Public Event PropertyValueChanged()

выдает следующую ошибку:

Атрибут 'NonSerializedAttribute' не может применяться к PropertyValueChanged, потому что атрибут недействителен на этом тип объявления.

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below

Есть ли другой способ избежать сериализации членов Event?

Это не проблема, если событие не обрабатывается, и я могу обойти его путем клонирования объектов (и игнорирования события) перед их сериализацией. Просто интересно, есть ли лучший способ.

Спасибо.

Ответы [ 3 ]

34 голосов
/ 05 марта 2010

В C # вы можете сделать это, как показано ниже, поэтому я надеюсь это переводит идентично VB.

Обратите внимание, что это применимо только к событиям, подобным полевым (т. Е. Там, где у вас нетваш собственный add / remove):

[field: NonSerialized]
public event EventType EventName;

В противном случае что-то вроде:

[NonSerialized]
EventType backingField;
public event EventType {
    add { backingField += value; }
    remove { backingField -= value; }
}
6 голосов
/ 05 марта 2010

Это не работает, потому что компилятор фактически генерирует вспомогательное поле для события. Чтобы включить его, просто добавьте ваш атрибут в поле:

[field: NonSerialized]
public event EventHandler PropertyValueChanged;
0 голосов
/ 05 марта 2010

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

IXmlSerializable

...