2015年12月18日 星期五

序列化與反序列化

  序列化是指將物件實例的狀態儲存到儲存媒體上。此過程先將物件的公用欄位和私有欄位以及類別的名稱轉換為位元組流(Bitstream),然後再把位元組流寫入資料流程。在隨後對對象進行反序列化時,將建立出與原對象完全相同的副本。這個過程成為序列化與反序列化,又稱串列化與反串列化。
  序列化與反序列化主要目的在於減少網路流量,減輕伺服器的資料處理壓力,進而節省了登錄時間。
  為了讓物件支援.NET序列化服務,必須為每一個關聯的類別加上[Serializable]特性。如果認為給定的類別成員資料不能參與序列化的配置,則可以在成員資料之前加上[NonSerialized]的關鍵字,如下:
[Serializable]
public calss Login

   private string S_username;
   private string s_password;
   [NonSerialized]
   private string s_userid;

   public string UserName
   {
     get
      {
        return s_username;
       }
      set
      {
        this.s_username = value ;
       }
     }

     public string Password
     {
       get
       {
          return s_password ;
        }
       set
       {
          this.s_password = value ;
        }
       }
     public string Userid
     {
       get
       {
         return s_userid ;
        }
       set
       {
         this.s_serid = value ;
        }
      }
   }
 public class Test
 {
   //序列化使用 BinaryFormatte
    public void BinaryFormatterSerialize( )
    {
      Login login = new Login ( ) ;
      login.UserName = "admin" ;
      login.Password = "123456" ;
      login.UserID = "s1" ;
      FileStream fileStream = new FileStream ("c:\\User.dat" , FileMode.Create) ;
      BinaryFormatter b = new BinaryFormatter ( ) ;
      //將一個物件圖移位元組的順序持久化到一個指定資料流
   b.Serialize(fileStream, login) ;
     fileStream.Close( ) ;
    }

   // 反序列化
  public void BinaryFormatterDeSerialize( )
  {
    Login login = new Login( ) ;
    FileStream fileStream = new FileStream ("c:\\User.dat" , FileMode.Open,
           FileAccess.Read, FileShare.Read ) ;
    BinaryFormatter b = new BinaryFormatter ( ) ;
     //將一個持久化的位元組順序轉化為一個物件圖
  login = b.Deserialize (fileStream) as Login ;
    Console.WriteLine (login.UserName) ;
    Console.WriteLine (login.Password) ;
    Console.WriteLine (login.UserID) ;
    fileStream.Close ( ) ;
    }
    public static void Main ( )
    {
      Test test = new Test ( ) ;
      test.BinaryFormatterSerialize ( ) ;
      tes.DeBinaryFormatterSerialize ( ) ;
     }
   }
 }

 
上面的程式碼 Login類別被標記為[Serializable],而成員變數s_userid被標記為 [NonSerialized],因此s_userid不參與序列化。
C#提供了三種序列化的方式:
1.使用BinaryFormatter進行序列化
 using System.Runtime.Serialization.Formatters.Binary ;  
2.使用SoapFormatter進行序列化
    using System.Runtime.Serialization.Formatters.Soap ;
3.使用XmlSerial進行序列化
    using System.Xml.Serialization ;
三者差異在於BinaryFormatter可以完整保存欄位資料之外,對每一個類型的完整修飾名詞和定義組件的完整名稱都可以完整保留。而SoapFormatter與XmlSerial並不記錄完整的修飾名詞或起源組件,僅僅保留公共欄位或公共屬性,因為Xml具有開放性的原則,就不要保有完整的類型。


沒有留言:

張貼留言