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