使用Serializable属性和amp;之间的区别是什么?实现ISerializable?

时间:2010-03-02 17:16:47

标签: c# inheritance attributes serialization iserializable

使用Serializable属性和实现ISerializable界面有什么区别?

5 个答案:

答案 0 :(得分:41)

当您使用SerializableAttribute属性时,您将在编译时在字段上放置一个属性,以便在运行时,序列化工具将根据属性通过执行来知道要序列化的内容对类/模块/汇编类型的反思。

[Serializable]
public class MyFoo { … }

以上表明序列化工具应序列化整个类MyFoo,而:

public class MyFoo
{
    private int bar;

    [Serializable]
    public int WhatBar
    {
       get { return this.bar; }
    }
}

使用该属性,您可以有选择地选择需要序列化的字段。

当您实施ISerializable interface时,通过覆盖GetObjectData SetObjectData (并提供一个构造函数),可以有效地使用自定义版本覆盖序列化形式MyFoo(SerializationInfo info, StreamingContext context)),对数据的序列化有更好的控制。

另见this example of a custom serialization here on StackOverflow。它显示了如何使序列化向后兼容序列化数据的不同版本。

希望这有帮助。

答案 1 :(得分:20)

SerializableAttribute指示框架执行默认的序列化过程。如果您需要更多控制权,可以实施ISerializable interface。然后,您可以使用自己的代码序列化GetObjectData方法中的对象,并更新传递给它的SerializationInfo对象。

答案 2 :(得分:3)

ISerializable界面允许您实现默认以外的自定义序列化。 实现ISerializable接口时,必须覆盖GetObjectData方法,如下所示

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}

答案 3 :(得分:1)

ISerialize强制你手动实现序列化逻辑,同时用Serializable属性标记(你的意思是吗?)会告诉二进制序列化器这个类可以被序列化。它会自动完成。

答案 4 :(得分:0)

继承自ISerializable允许您自定义实现(反)序列化。仅使用Serializable属性时,(de)序列化只能由属性控制,并且灵活性较差。