Как игнорировать член класса событий для двоичной сериализации?

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

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

<NonSerialized()> Public Event PropertyValueChanged()

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

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

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

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

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

Спасибо.

Ответы

Ответ 1

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

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

[field: NonSerialized]
public event EventType EventName;

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

[NonSerialized]
EventType backingField;
public event EventType {
    add { backingField += value; }
    remove { backingField -= value; }
}

Ответ 2

Он не работает, потому что компилятор действительно создает поле поддержки для события. Чтобы включить его, просто добавьте свой атрибут в поле:

[field: NonSerialized]
public event EventHandler PropertyValueChanged;

Ответ 3

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

IXmlSerializable