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

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

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

<NonSerialized()> Public Event PropertyValueChanged()

производит следующую ошибку:

К атрибуту 'NonSerializedAttribute' нельзя относиться 'PropertyValueChanged', потому что атрибут не допустим на этом типе объявления.

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

Там другой путь состоит в том, чтобы не сериализировать участников События?

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

Спасибо.

16
задан Paul Sasik 12 October 2011 в 19:15
поделиться

3 ответа

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

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

[field: NonSerialized]
public event EventType EventName;

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

[NonSerialized]
EventType backingField;
public event EventType {
    add { backingField += value; }
    remove { backingField -= value; }
}
34
ответ дан 30 November 2019 в 16:24
поделиться

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

[field: NonSerialized]
public event EventHandler PropertyValueChanged;
6
ответ дан 30 November 2019 в 16:24
поделиться

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

IXmlSerializable

0
ответ дан 30 November 2019 в 16:24
поделиться