Как игнорировать член класса событий для двоичной сериализации?
Мне нужно избегать сериализации члена класса 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