除了使用事件以外,还可以通过自定义序列化来完成这一过程。
自定义序列化只需要实现ISerializable接口就可以了。它位于using System.Runtime.Serialization;
SerializationInfo有点儿类似于BinaryWriter和BinaryReader,用于写入和读取对象的属性值。它主要包括一组AddValue()方法和一组Get<Type>()方法,还有其他一些属性用于获得程序集和类型的信息。StreamingContext则极少使用。
得到和前面类似结果:
注意:
1,需要定义一个在反序列化时候用于还原属性值的构造函数,并且函数前面的格式必须为<classname>(SerializationInfo info,StreamingContext context),它只有在反序列化时通过反射来调用,将其声明为protected可以避免改构造函数在其他情况下被调用;如果类型为sealed,那么也可以声明这个构造函数为private,但如果类型可以被继承,则声明这个构造函数为protected,以方便子类在反序列化时调用。
2,AddValue(string name,object value)和GetString(string name)中的参数name值必须保持一致,但不一定与类型的字段或属性名相同。
大多数情况下,类型会包含多个字段和属性,此时如果使用自定义序列化,可以预见要编写很多的AddValue,和get<Type>方法。因此,在这种情况下,最好像前面那样编写序列化事件处理方法。但是在一种情况下只能通过实行Iserializable来进行序列化和反序列化,这种情况就是继承自一个不可序列化的基类。
有了事件处理方法,在加上自定义序列化,我们就能很容易处理实体对象传递过程中的序列化过程了。