IDeserializationCallback vs OnDeserializedAttribute

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

IDeserializationCallback:

[Serializable]
public class Foo : IDeserializationCallback
{
    public void OnDeserialization(object sender)
    {
         // initialize unserialized fields etc.
    }
}

OnDeserialized event:

[Serializable]
public class Foo
{
    [OnDeserialized]
    public void OnDeserialized(StreamingContext context)
    {
         // initialize unserialized fields etc.
    }
}

Существуют ли какие-либо конкретные плюсы/минусы или сценарии, в которых вы бы выбрали один из них?

Ответ 1

Я задавался вопросом то же самое. Что касается плюсов и минусов, я могу только рассуждать о том, что интерфейс имеет преимущество в том, что он заставляет вас реализовать правильную сигнатуру метода, где, поскольку версия атрибута с радостью позволит вам скомпилировать ваш класс, независимо от того, как выглядит ваша подпись метода.

Ответ 3

Запись Даррена Хэдрика сверху (для полноты):

DeserializationCallback.OnDeserialization "Выполняется, когда весь объектный граф десериализован". (ссылка).

OnDeserialized event однако "Используйте OnDeserializedAttribute, когда вам нужно исправить значения на десериализованном объекте после его десериализации и перед возвратом графика. Этот атрибут можно использовать вместо интерфейса IDeserializationCallback". (ссылка).

Поскольку атрибут OnDeserialized может использоваться для изменения графа объекта, он вызывается перед OnDeserialization (что означает, что граф объекта находится в его конечном состоянии).

Ответ 4

Дальнейшее обсуждение этого сообщения