导航

自定义的序列化过程

Posted on 2006-03-28 12:59  老光  阅读(465)  评论(0编辑  收藏  举报
自定义的序列化过程
 最近,由于对象进行了扩展,原来序列化保存的东西都无法用了,于是考虑自定义的序列化.
 在实现ISerializable接口进行自定义的序列化中,最初我还纳闷那些const字段或者static字段的值需不需要在序列化的构造函数中赋值.
 试了一下,发现自定义的序列化的时候,会进行类的构造.而自动的序列化则不会.
 看以下例子:
  public class TestClass
   {
        [NonSerialized]
       private  float fa=1.0f;
       private ArrayList ary=new ArrayList();
       public TestClass()
       {
            ary.Add(0);
            ary.Add(1);
            ary.Add("0");
       }
   }
  
   很显然,反序列化后生成的实例,fa字段为0f;
  如果我们实现ISerializable接口.
   public class TestClass:ISerializable
  {
       [NonSerialized]//这时候,这个属性标识作用已经被忽略,失去了实际作用.
       private  float fa=1.0f;
       private ArrayList ary=new ArrayList();
       public TestClass()
       {
         ary.Add(0);
         ary.Add(1);
         ary.Add("0");
       }
       #region ISerializable 成员
       protected TestClass(SerializationInfo info,StreamingContext context)
       {
           ary=info.GetValue("ary",typeof(ArrayList)) as ArrayList;
       }
       public void GetObjectData(SerializationInfo info, StreamingContext context)
       {
        // TODO:  添加 TestClass.GetObjectData 实现
           info.AddValue("ary",ary,ary.GetType());
       }
  
       #endregion
  }
  
  通过单步跟踪,可以发现,在反序列化的时候,实际的构造过程是
    1-->private  float fa=1.0f;
    2-->private ArrayList ary=new ArrayList();
    3-->执行ary=info.GetValue....
    
    
  所以,自定义的序列化过程比自动的序列化灵活很多,完全可以帮助我们完成同一对象的不同版本的存取工作.