【发布时间】:2011-01-22 20:04:43
【问题描述】:
使用Serializable 属性和实现ISerializable 接口有什么区别?
【问题讨论】:
标签: c# inheritance attributes serialization iserializable
使用Serializable 属性和实现ISerializable 接口有什么区别?
【问题讨论】:
标签: c# inheritance attributes serialization iserializable
当您使用SerializableAttribute 属性时,您在编译时将属性放在字段上,这样在运行时,序列化工具将通过执行反射来知道基于属性序列化的内容类/模块/程序集类型。
[Serializable]
public class MyFoo { … }
上面表明序列化工具应该序列化整个类MyFoo,而:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
使用该属性可以选择性地选择需要序列化的字段。
当您实现ISerializable interface 时,通过覆盖GetObjectData 和(并提供SetObjectDataMyFoo(SerializationInfo info, StreamingContext context) 形式的构造函数),序列化有效地被自定义版本覆盖,将对数据的序列化进行更精细的控制。
另见this example of a custom serialization here on StackOverflow。它展示了如何使序列化与序列化数据的不同版本保持向后兼容。
希望这会有所帮助。
【讨论】:
Serializable 属性添加到属性? MSDN 说它只能应用于类、结构、枚举和委托。
SerializableAttribute装饰时,一个成员可以用NonSerializedAttribute标记被跳过,正如多人(和MSDN)所说,重建某个对象时在不同的环境中没有意义,明智的做法是不要序列化它......
SerializableAttribute 指示框架执行默认的序列化过程。如果您需要更多控制,可以实现ISerializable interface。然后你可以把你自己的代码序列化到GetObjectData方法中,并更新传递给它的SerializationInfo对象。
【讨论】:
ISerializable 接口允许您实现 自定义序列化 而非默认值。
实现ISerializable接口时,必须重写GetObjectData方法,如下
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
【讨论】:
ISerialize 强制你手动实现序列化逻辑,而通过 Serializable 属性标记(你是这个意思吗?)会告诉二进制序列化器这个类可以序列化。它会自动完成。
【讨论】:
从 ISerializable 继承允许您自定义实现(反)序列化。仅使用 Serializable 属性时,(反)序列化只能由属性控制,灵活性较差。
【讨论】: