Я должен постараться не сериализировать участника Класса событий, потому что, когда событие обрабатывается объектом, который не отмечен как сериализуемый, сериализация перестанет работать.
Я пытался использовать атрибут NonSerialized на участнике Класса событий, но ему не удается скомпилировать. Эта строка кода:
<NonSerialized()> Public Event PropertyValueChanged()
производит следующую ошибку:
К атрибуту 'NonSerializedAttribute' нельзя относиться 'PropertyValueChanged', потому что атрибут не допустим на этом типе объявления.
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:
[field: NonSerialized]
public event EventHandler PropertyValueChanged;
Как я делал это в прошлом для проектов, это реализовал интерфейс IXmlSerializable и управлял моей сериализацией вручную. Я считаю, что это значительно упрощает сериализацию элементов управления на основе графического интерфейса (с большим количеством событий).