.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与特殊构造器中使用反射获得父类的所有字段,因为反射是可以跨越访问限制的。

.NET面试基础知识之序列化(Serialize)(二),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。