2011年11月23日 星期三

物件的序列化

開發語言:C# 2010( .NET Framework 4.0 )
先來講一下為什麼要把物件做 "序列化" 的動作.

以我的認知來講 : 如果網路要傳送某些特定的資訊 ( 例如 : 網頁的聊天室 ) , 以這個例子來講 , 如果一開始要先傳遞目前在這個聊天室的人或者是一些基本資訊 , 一開始先想到的方法當然是直接把物件的狀態變成特定的格式 ( 例如 : #AAA , qq@aa.com , .... , #BBB , zz@xx.com .... ) 這種的資訊送到進來聊天室的客戶端 , 再以特定的方式來解伺服器端送來的資料 ( 自己定義的協定之類的 , 像是上面所舉的例子 , 以#符號當成一個人資料的起頭 , 那麼客戶端就直接對#來作切割 , 切割之後就可以得知目前聊天室有誰 , 每個人的email等等等... ) ; 再假設某個人傳了什麼訊息出來 , 那麼伺服器.客戶端的資訊交換的協定又要被定義出來 , 這樣來做實在是頗為麻煩 , 那麼序列化這種技術就隨之產生 .


物件序列化要幹麻 : 送端把某一個物件表示成一種特定的格式 , 接收端收到這個資訊就把這個再經過解序列化來得知這個物件的屬性.狀態...之類的 , 這樣來做就會省去自己要定義某個協定來傳送與接收 , 只要知道目前傳的物件是哪一個 , 再透過解序列化就可以得到要傳的物件的狀態 , 經過這些動作就可以把繁雜的事情變簡單 .

序列化的動作 ( 以.net裡面的 xml serialization來實做 , 還有其他的序列化方式 , 例如 : json ) :

1.定義出物件 ( 要傳送的屬性要為 public [公有] )
  例如 : 要描述聊天室人的基本資料

public class Person {
      public String Name , email ;
      public bool sex ;
}
2.new 出要序列化的物件
   ex : Person p1 = new Person() ;
         p1.Name = "小小小" ;
         p1.email = "aa@zz.com" ;
         p1.sex = true ;

3.序列化這個物件
   ex : XmlSerializer serializer = new XmlSerializer(p1.GetType());
         StringWriter sw = new StringWriter();
         serializer.Serialize(sw, p1);
         String oText = sw.ToString();
         sw.close() ;

反序列化
   ex : XmlDocument xdoc = new XmlDocument();
         xdoc.LoadXml(oText);
         XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
         Person p1c = (student)serializer.Deserialize(reader);
  p1c就會得到跟p1一樣的物件屬性

原始碼下載 : 點我

雖然原始碼跟以上文章有些差異 , 可是概念上是一樣的..
參考網址1 : json for .NET ( http://json.codeplex.com/ )
參考網址2 : json ( http://blog.darkthread.net/post-2010-06-05-json-net-jobject-example.aspx )
參考網址3 : c#的物件序列化 ( http://www.dotblogs.com.tw/yc421206/archive/2009/01/26/6949.aspx )

提出一點點看法 , 如果有錯誤請提出意見與多多包含 .

沒有留言: