使用Serializable
属性和实现ISerializable
界面有什么区别?
答案 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)序列化只能由属性控制,并且灵活性较差。