Хотя я склонен не соглашаться с подходом (я бы просто пометил события как несериализированные, независимо от их количества), вы, вероятно, могли бы сделать это, используя суррогаты сериализации.
Идея состоит в том, что вы создаете объект, который реализует ISerializationSurrogate и в основном делает то, что вы уже делаете - ничего в методах GetObjectData и SetObjectData. Разница в том, что вы будете настраивать сериализацию делегата, а не класс, содержащий его.
Что-то вроде:
class DelegateSerializationSurrogate : ISerializationSurrogate {
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context) {
// do nothing
}
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context) {
// do nothing
return null;
}
}
Затем вы регистрируете это в программе форматирования, используя процедуры , описанные в этом столбце MSDN . Затем всякий раз, когда средство форматирования встречает делегата, оно использует суррогат вместо прямой сериализации делегата.