76

Serializable使用属性和实现ISerializable接口有什么区别?

4

5 回答 5

43

当您使用SerializableAttribute属性时,您在编译时将属性放在字段上,这样在运行时,序列化工具将通过对类/模块/程序集执行反射来知道要根据属性序列化什么类型。

[Serializable]
public class MyFoo { … }

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

public class MyFoo
{
    private int bar;

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

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

当您实现ISerializableinterface时,序列化有效地被自定义版本覆盖,通过覆盖(并通过提供 form 的构造函数),将对数据的序列化进行更好程度的控制。GetObjectData SetObjectDataMyFoo(SerializationInfo info, StreamingContext context)

另请参阅StackOverflow 上的自定义序列化示例。它展示了如何使序列化与序列化数据的不同版本保持向后兼容。

希望这可以帮助。

于 2010-03-02T17:48:28.227 回答
20

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

于 2010-03-02T17:20:43.197 回答
3

ISerializable接口允许您实现除默认之外的自定义序列化。实现ISerializable接口时,必须重写GetObjectData方法如下

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}
于 2010-03-02T17:25:13.283 回答
1

ISerialize 强制您手动实现序列化逻辑,而通过 Serializable 属性标记(您是认真的吗?)将告诉 Binary 序列化器该类可以序列化。它会自动完成。

于 2010-03-02T17:20:52.540 回答
0

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

于 2010-03-02T17:21:22.553 回答