IDeserializationCallback vs OnDeserializedAttribute - PullRequest
12 голосов
/ 20 августа 2009

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

IDeserializationCallback:

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

Событие OnDeserialized:

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

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

Ответы [ 4 ]

9 голосов
/ 23 июня 2010

Эти два служат различным целям и не могут использоваться взаимозаменяемо. В большинстве случаев вам, вероятно, будет лучше обслуживать интерфейс.

Ищите здесь какое-нибудь объяснение: http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/311b2b57-6b0a-49ed-aa96-84f69d51da0f

7 голосов
/ 18 декабря 2012

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

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

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

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

2 голосов
/ 18 декабря 2012

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

1 голос
/ 20 сентября 2009

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

...