程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .NET序列化的一點技巧(附Demo)

.NET序列化的一點技巧(附Demo)

編輯:C#入門知識

閱讀目錄

  • 介紹
  • 詳細
  • 處理
  • 結論
  • Demo下載

 

介紹

  序列化是將對象狀態轉換為可保持或傳輸的形式的過程。序列化的補集是反序列化,後者將流轉換為對象。這兩個過程一起保證數據易於存儲和傳輸。

.NET Framework 提供了兩個序列化技術:

  • 二進制序列化保持類型保真,這對於多次調用應用程序時保持對象狀態非常有用。例如,通過將對象序列化到剪貼板,可在不同的應用程序之間共享對象。您可以將對象序列化到流、磁盤、內存和網絡等。遠程處理使用序列化,“按值”在計算機或應用程序域之間傳遞對象。

  • XML 序列化只序列化公共屬性和字段,並且不保持類型保真。當您希望提供或使用數據而不限制使用該數據的應用程序時,這一點非常有用。由於 XML 是開放式的標准,因此它對於通過 Web 共享數據來說是一個理想選擇。SOAP 同樣是開放式的標准,這使它也成為一個理想選擇。

詳細

  具體命名空間:

  • System.Runtime.Serialization

  包含可用於序列化和反序列化對象的類。(包括System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,還有WCF中用到的DataContractAttribute, DataMemberAttribute)

  • System.Xml.Serialization

  包含可用於將對象序列化為 XML 格式的文檔或流的類。

  WCF大家很熟悉,一般的書籍都對基礎的東西有很多內容的講解,這裡就對非WCF的一些序列化技巧拋個磚。

一:序列化標記

  

特性“Serializable”只在“class, struct, enum, delegate”聲明中有效。所以只能在類,結構體等上面標記。

不需要序列化:[NonSerialized]也可以寫成[NonSerializedAttribute]

特性“NonSerialized”只在“field”聲明中有效。所以只能在字段上標記,連屬性器都不行。

二:特殊情況:

  

[field: NonSerializedAttribute()],需要加入field標記。

  

其實我們叫的屬性是屬性器,是一對Get,Set方法。既然是方法,當然不是字段了,所以是不能序列化標記或者排除的,那我們怎麼去處理某些屬性不需要序列化的情況列。方法也是有的,需要把屬性器中的Get,Set方法寫實,即該有的字段還是得定義,不能偷懶,然後在該有的字段上面標記為不需要序列化。

三:序列化的特殊用法

  學過C#的時候,大家都知道了個的概念,也可能知道了ICloneable這個接口,這個克隆接口可以復制對象,如實例化個student,然後調用Clone()即可以得到該對線的淺層副本。

  淺層克隆就是只把改對象的值類型和引用類型的地址復制了,但是,原來對象中的被引用類型的對象發生改變,比如:student類中有個classroom,classroom中的某個字段發生改變,這樣克隆後的對線的classroom的值也是會變的。除非classroom這個類也實現ICloneable接口。

  序列化克隆的好處就是不用考慮淺層復制,深層復制,直接將要克隆的對象序列化,然後反序列化得到的對象就是我們期望的結果。

處理

  按照上面的說明,代碼如下:

Student類

                              
                                       
                                       
                                      
                       
                                
                  param =       }

         
                                       
                                           }

ExParam類

                                                  }

Util類

                  [] SerializeObject(               (obj ==                    
              (MemoryStream memory =                   BinaryFormatter formatter =                   memory.Position =                  [] read =                   memory.Read(read,                      
 
            DeserializeObject(               obj =               (data ==                   
              (MemoryStream memory =                   memory.Position =                  BinaryFormatter formatter =                  obj =                         }

主窗體

    Form1_Load(              Student student =                   ID =                  Name =                  Room =                       Name =                      Address = 
                  Param =                       Name = 
   
             [] data = 
             Student student1 = Util.DeserializeObject(data)  
    
                         info =.Format(
                          ,  + student.GetHashCode().ToString() +  
                          , student.ID +   + student.Name +  
                          , student.Room !=  ? student.Room.Name +   + student.Room.Address +  +student.Room.GetHashCode().ToString()+  : 
                          , student.Param !=  ? student.Param.Name : 
           }


結論

  上述代碼輸出:

   

從上述代碼輸出的結果我們可以看出

 

Demo下載

源碼下載

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved