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

Когда следующий класс сериализуется с BinaryFormatter, любые объекты, подписавшиеся на событие Roar, также будут сериализованы, так как ссылки на эти объекты хранятся делегатом EventHandler.

[Serializable]
public class Lion
{
    public event EventHandler Roar;

    public string Name { get; set; }
    public float Fluffiness { get; set; }

    public Lion(string name, float fluffiness)
    {
        Name = name;
        Fluffiness = fluffiness;
    }

    public void Poke()
    {
        Roar(); // Could be null, etc..
    }
}

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

Включение атрибута [NonSerializable] в event не будет компилироваться.


Примечание. Я отвечаю на свой вопрос, так как думаю, что было бы полезно иметь информацию на сайте!

Часто задаваемые вопросы: Также прекрасно спросить и ответить на собственный вопрос, но притворяйтесь, что вы находитесь под угрозой: произнесите его в форме вопроса.

Ответы

Ответ 1

Вы должны включить "field:" как часть атрибута [NonSerialized] в event.

то есть:.

[field: NonSerialized]
public event EventHandler Roar;