IDeserializationCallback vs OnDeserializedAttribut

2020-07-02 12:22发布

问题:

As far as I understand, the IDeserializationCallback interface and the OnDeserialized event can both be used when an object needs to perform some task after being deserialized.

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.
    }
}

Are there any specific pros/cons or scenarios where you would choose one over the other?

回答1:

I have wondered the same thing. As far as pros/cons go, I can only reason that the interface has an advantage in that it forces you to implement the correct method signature where-as the attribute version will happily let you compile your class regardless of what your method signature looks like.



回答2:

Those two serve different purposes and cannot be used interchangeably. In most of the cases you probably will be better served by the interface.

Look here for some explanation: http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/311b2b57-6b0a-49ed-aa96-84f69d51da0f



回答3:

Darren Headrick's post from above link (for completeness) :

DeserializationCallback.OnDeserialization "Runs when the entire object graph has been deserialized." (link).

The OnDeserialized event however "Use the OnDeserializedAttribute when you need to fix values on a deserialized object after it has been deserialized and before the graph is returned. This attribute can be used instead of the IDeserializationCallback interface." (link).

Since the OnDeserialized attribute can be used to modify the object graph, it gets called before OnDeserialization (which signifies the Object graph is in its final state).



回答4:

Further discussion on this blog post