Подтвердить что ты не робот

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

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

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

<NonSerialized()> Public Event PropertyValueChanged()

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

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

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

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

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

Спасибо.

4b9b3361

Ответ 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