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
Я задавался вопросом то же самое. Что касается плюсов и минусов, я могу только рассуждать о том, что интерфейс имеет преимущество в том, что он заставляет вас реализовать правильную сигнатуру метода, где, поскольку версия атрибута с радостью позволит вам скомпилировать ваш класс, независимо от того, как выглядит ваша подпись метода.
Ответ 2
Эти два служат различным целям и не могут использоваться взаимозаменяемо. В большинстве случаев вы, вероятно, лучше обслуживаете интерфейс.
Посмотрите здесь несколько объяснений:
http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/311b2b57-6b0a-49ed-aa96-84f69d51da0f
Ответ 3
Запись Даррена Хэдрика сверху (для полноты):
DeserializationCallback.OnDeserialization "Выполняется, когда весь объектный граф десериализован". (ссылка).
OnDeserialized event однако "Используйте OnDeserializedAttribute, когда вам нужно исправить значения на десериализованном объекте после его десериализации и перед возвратом графика. Этот атрибут можно использовать вместо интерфейса IDeserializationCallback". (ссылка).
Поскольку атрибут OnDeserialized может использоваться для изменения графа объекта, он вызывается перед OnDeserialization (что означает, что граф объекта находится в его конечном состоянии).
Ответ 4
Дальнейшее обсуждение этого сообщения