Serializable
使用属性和实现ISerializable
接口有什么区别?
5 回答
当您使用SerializableAttribute
属性时,您在编译时将属性放在字段上,这样在运行时,序列化工具将通过对类/模块/程序集执行反射来知道要根据属性序列化什么类型。
[Serializable]
public class MyFoo { … }
以上表明序列化工具应该序列化整个类MyFoo
,而:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
使用该属性,您可以有选择地选择需要序列化的字段。
当您实现ISerializable
interface时,序列化有效地被自定义版本覆盖,通过覆盖和(并通过提供 form 的构造函数),将对数据的序列化进行更好程度的控制。GetObjectData
SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
另请参阅StackOverflow 上的自定义序列化示例。它展示了如何使序列化与序列化数据的不同版本保持向后兼容。
希望这可以帮助。
SerializableAttribute指示框架执行默认的序列化过程。如果需要更多控制,可以实现ISerializable 接口。然后,您可以将自己的代码用于序列化GetObjectData
方法中的对象并更新SerializationInfo
传递给它的对象。
该ISerializable
接口允许您实现除默认之外的自定义序列化。实现ISerializable
接口时,必须重写GetObjectData
方法如下
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
ISerialize 强制您手动实现序列化逻辑,而通过 Serializable 属性标记(您是认真的吗?)将告诉 Binary 序列化器该类可以序列化。它会自动完成。
从 ISerializable 继承允许您自定义实现(反)序列化。仅使用 Serializable 属性时,(反)序列化只能由属性控制,灵活性较差。