OnSerializingAttribute vs ISerializable

Bil*_*ang 6 .net c# serialization

我在msdn上阅读自定义序列化文章:http://msdn.microsoft.com/en-us/library/ty01x675%28VS.80%29.aspx

它提到有两种实现自定义序列化的方法:
1,使用OnDeserializedAttribute, OnDeserializingAttribute, OnSerializedAttribute, OnSerializingAttribute
2,实现ISerializable接口

根据MSDN,方法#1是"最佳实践和最简单",但我不明白这两种方法是如何相同的.据我所知,这些OnSerializing|OnSerialized|etc属性允许您将方法挂钩到序列化的特定阶段,而ISerializable界面允许您直接修改进入和离开的内容SerializationInfo.它是否正确?

为了将我的困惑置于上下文中,如何实现OnSerializing以不同的名称序列化对象字段?像下面的代码:

public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
    info.AddValue("i", n1);
    info.AddValue("j", n2);
    info.AddValue("k", str);
}

更新:虽然Frederik Gheysels的答案并不完全正确(使用Serializable进行装饰是OnSerializing/OnDeserializing属性和ISerializable接口的先决条件),但他确实指出OnSerializing/OnDeserializing属性是ISerializable的补充,所以我是在这一点上接受他的回答.

Fre*_*els 5

OnSerializing/ OnDeserializingISerializable或补充SerializableAttribute.

换句话说:OnSerializing/ OnDeserializing不是ISerializable或替代SerializableAttribute.

这两个属性(OnSerializing/ OnDeserializing)允许您在序列化或反序列化对象时控制/执行额外操作.但是,为了能够执行此操作,应用这些属性的类型必须是可序列化的(因此实现ISerializable接口,或使用Serializable属性修饰).

在您所指的MSDN文章中也这样说: - OnSerializing和OnDeserializing用于在序列化期间和之后"更正"数据.

你可以很容易地测试它.创建这样的类型,并尝试序列化它:

public class Foo
{
    private int _bar = 5;

    [OnSerializing]
    public void OnSerializeFoo( StreamingContext context )
    {
        _bar = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,该类型没有实现ISerializable,也没有用它来装饰SerializableAttribute.尝试序列化该类型的实例,您将面临a SerializationException,因为Foo不可序列化.

因此,您可以使用这些属性(OnSerializing,OnDeserializing)来实现在序列化或反序列化某个类型的实例时应执行的其他逻辑.