Как игнорировать элемент класса событий для двоичной сериализации?
-
24-09-2019 - |
Вопрос
Мне нужно избегать сериализации элемента класса событий, потому что когда событие обрабатывается объектом, который не помечен как сериализация, сериализация не удастся.
Я попробовал использовать неразрешенный атрибут на члене класса событий, но он не скомпенсируется. Эта линия кода:
<NonSerialized()> Public Event PropertyValueChanged()
производит следующую ошибку:
Атрибут «NonserializedTtribute» не может быть применен к «PropertyValueChangeded», потому что атрибут недействителен в этом типе объявления.
Public Event PropertyValueChanged() ' compiles but needs the extra handling described below
Есть ли другой способ избежать сериализации членов событий?
Это не проблема, если событие не обрабатывается, и я могу работать вокруг него, клонируя объекты (и игнорируя событие) перед их сериалом. Просто интересно, есть ли лучший способ.
Спасибо.
Решение
В C # вы можете сделать это, как показано ниже, так что я надеяться Это переводится идентично VB.
Обратите внимание, что это относится только к полевым событиям (т.е. где у вас нет собственного add
/remove
):
[field: NonSerialized]
public event EventType EventName;
В противном случае что-то вроде:
[NonSerialized]
EventType backingField;
public event EventType {
add { backingField += value; }
remove { backingField -= value; }
}
Другие советы
Он не работает, потому что компилятор на самом деле генерирует поле для события. Чтобы включить его, просто префикс своего атрибута с полем:
[field: NonSerialized]
public event EventHandler PropertyValueChanged;
Как я это сделал в прошлом для проектов, реализует IXMLSERializable интерфейс и контролировать мою сериализацию вручную. Я нахожу это делает сериализующие элементы управления на основе GUI (с большим количеством событий) намного проще.