.NET面试基础知识之序列化(Serialize)(二)
当调用formatter的Serialize方法时默认要用到反射,反射的性能较低。此时可以自定义序列化,完全由自己控制如何序列化
ISerializable, IDeserializableCallback
ISerializable必须实现GetObjectData和一个特殊的构造器,这个构造器会在Deserialize的时候调用
代码:
[Serializable]
public class SelfSerializable:ISerializable, IDeserializationCallback
{
public SelfSerializable()
{
}
private SerializationInfo m_siInfo;
public int Age {
set;
get;
}
public string Name {
set;
get;
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter =true)]
protected SelfSerializable(SerializationInfo info, StreamingContext context)
{
m_siInfo = info;
}
[SecurityCritical]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name",Name);
info.AddValue("Age",Age);
}
void IDeserializationCallback.OnDeserialization(object sender)
{
this.Age = m_siInfo.GetInt32("Age");
this.Name = m_siInfo.GetString("Name");
}
}
如果一个类的父类没有实现ISerializable接口,可以在该类的GetObjectData与特殊构造器中使用反射获得父类的所有字段,因为反射是可以跨越访问限制的。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。