利用ISerializable进行自定义序列化
上面那个例子中,是使用BinaryFormatter进行自动序列化,除了给User类增加了【Serializable】标签之外,没有书写任何代码,BinaryFormatter就自动将User类型的所有信息(公共字段和属性)进行了序列化和反序列化,这大大减少了我们进行代码开发的工作量,但是这种自动带来方便的同时,也使得我们无法对其序列化的过程进行任何干预和控制,而当我们想要对序列化的具体内容进行改变的时候,ISerializable就有它的用武之地了。
下面是ISerializable的定义,但是我们发现它只定义了一个接口函数“GetObjectData”,这个是序列化的时候使用的,而进行反序列化的函数却没有定义,这是为什么呢?从MSDN中看到,原来是实现ISerializable的类型如果需要进行反序列化,必须还定义一个以SerializationInfo和StreamingContext为参数的公共构造函数,各种格式化器将使用这个公共的构造函数来反序列对象。
namespace System.Runtime.Serialization为了便于理解自定义序列化功能的必要性,我们这里给User类又增加了两个公共成员:temp和saveTime,其中temp是一个临时变量,并不需要进行序列化,以便节省网络带宽或者存储空间;而saveTime则标识这个对象上次被序列化的时间。这样一来,我们序列化的需求就发生了改变,一个成员不需要序列化,而另外一个成员序列化的值是需要在序列化的时候才能够决定的。
{
// Summary:
// Allows an object to control its own serialization and deserialization.
[ComVisible(true)]
public interface ISerializable
{
// Summary:
// Populates a System.Runtime.Serialization.SerializationInfo with the data
// needed to serialize the target object.
//
// Parameters:
// context:
// The destination (see System.Runtime.Serialization.StreamingContext) for this
// serialization.
//
// info:
// The System.Runtime.Serialization.SerializationInfo to populate with data.
//
// Exceptions:
// System.Security.SecurityException:
// The caller does not have the required permission.
void GetObjectData(SerializationInfo info, StreamingContext context);
}
}
下面的代码演示了如何实现自定义序列化的功能