国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-17 03:11:30
字體:
供稿:網(wǎng)友

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

閱讀目錄

  • 介紹
  • 詳細(xì)
  • 處理
  • 結(jié)論
  • Demo下載

介紹

  序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)男问降倪^程。序列化的補(bǔ)集是反序列化,后者將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過程一起保證數(shù)據(jù)易于存儲(chǔ)和傳輸。

.NET Framework 提供了兩個(gè)序列化技術(shù):

  • 二進(jìn)制序列化保持類型保真,這對(duì)于多次調(diào)用應(yīng)用程序時(shí)保持對(duì)象狀態(tài)非常有用。例如,通過將對(duì)象序列化到剪貼板,可在不同的應(yīng)用程序之間共享對(duì)象。您可以將對(duì)象序列化到流、磁盤、內(nèi)存和網(wǎng)絡(luò)等。遠(yuǎn)程處理使用序列化,“按值”在計(jì)算機(jī)或應(yīng)用程序域之間傳遞對(duì)象。

  • xml 序列化只序列化公共屬性和字段,并且不保持類型保真。當(dāng)您希望提供或使用數(shù)據(jù)而不限制使用該數(shù)據(jù)的應(yīng)用程序時(shí),這一點(diǎn)非常有用。由于 XML 是開放式的標(biāo)準(zhǔn),因此它對(duì)于通過 Web 共享數(shù)據(jù)來說是一個(gè)理想選擇。SOAP 同樣是開放式的標(biāo)準(zhǔn),這使它也成為一個(gè)理想選擇。

詳細(xì)

  具體命名空間:

  • System.Runtime.Serialization

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

  • System.Xml.Serialization

  包含可用于將對(duì)象序列化為 XML 格式的文檔或流的類。

  WCF大家很熟悉,一般的書籍都對(duì)基礎(chǔ)的東西有很多內(nèi)容的講解,這里就對(duì)非WCF的一些序列化技巧拋個(gè)磚。

一:序列化標(biāo)記

  需要序列化:[Serializable]也可以寫成[SerializableAttribute]

特性“Serializable”只在“class, struct, enum, delegate”聲明中有效。所以只能在類,結(jié)構(gòu)體等上面標(biāo)記。

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

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

二:特殊情況:

  事件的標(biāo)記:

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

  屬性的標(biāo)記:

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

三:序列化的特殊用法

  學(xué)過C#的時(shí)候,大家都知道了個(gè)值類型,引用類型的概念,也可能知道了ICloneable這個(gè)接口,這個(gè)克隆接口可以復(fù)制對(duì)象,如實(shí)例化個(gè)student,然后調(diào)用Clone()即可以得到該對(duì)線的淺層副本

  淺層克隆就是只把改對(duì)象的值類型和引用類型的地址復(fù)制了,但是,原來對(duì)象中的被引用類型的對(duì)象發(fā)生改變,比如:student類中有個(gè)classroom,classroom中的某個(gè)字段發(fā)生改變,這樣克隆后的對(duì)線的classroom的值也是會(huì)變的。除非classroom這個(gè)類也實(shí)現(xiàn)ICloneable接口。

  序列化克隆的好處就是不用考慮淺層復(fù)制,深層復(fù)制,直接將要克隆的對(duì)象序列化,然后反序列化得到的對(duì)象就是我們期望的結(jié)果。

處理

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

Student類

 1     [Serializable] 2     public class Student 3     { 4         [field: NonSerializedAttribute()] 5         public event EventHandler Changed; 6         [NonSerialized] 7         PRivate ExParam param; 8  9         public string ID10         {11             get;12             set;13         }14 15         public string Name16         {17             get;18             set;19         }20 21         public ClassRoom Room22         {23             get;24             set;25         }26 27         public ExParam Param28         {29             get30             {31                 return param;32             }33             set34             {35                 param = value;36             }37         }38     }

ClassRoom類

 1     [Serializable] 2     public class ClassRoom 3     { 4  5         public string Name 6         { 7             get; 8             set; 9         }10 11         public string Address12         {13             get;14             set;15         }16     }

ExParam類

1     public class ExParam2     {3         public string Name4         {5             get;6             set;7         }8     }

Util類

 1     public class Util 2     { 3         public static byte[] SerializeObject(object obj) 4         { 5             if (obj == null) 6                 return null; 7  8             using (MemoryStream memory = new MemoryStream()) 9             {10                 BinaryFormatter formatter = new BinaryFormatter();11                 formatter.Serialize(memory, obj);12                 memory.Position = 0;13                 byte[] read = new byte[memory.Length];14                 memory.Read(read, 0, read.Length);15                 memory.Close();16                 return read;17             }18         }19 20 21         public static object DeserializeObject(byte[] data)22         {23             object obj = null;24             if (data == null)25                 return obj;26 27             using (MemoryStream memory = new MemoryStream(data))28             {29                 memory.Position = 0;30                 BinaryFormatter formatter = new BinaryFormatter();31                 obj = formatter.Deserialize(memory);32                 memory.Close();33                 return obj;34             }35         }36     }

主窗體

 1  private void Form1_Load(object sender, EventArgs e) 2         { 3             Student student = new Student() 4             { 5                 ID = "201401", 6                 Name = "攻城獅", 7                 Room = new ClassRoom() 8                 { 9                     Name = "博客園",10                     Address = "小山村"11                 },12                 Param = new ExParam()13                 {14                     Name = "程序猿"15                 }16             };17 18             byte[] data = Util.SerializeObject(student);19 20             Student student1 = Util.DeserializeObject(data) as Student;21 22             Print(student);23             Print(student1);24         }25 26         private void Print(Student student)27         {28             string info =string.Format("{0}{1}{2}{3}"29                          , "hashcode:" + student.GetHashCode().ToString() + " "30                          , student.ID + " " + student.Name + " "31                          , student.Room != null ? student.Room.Name + " " + student.Room.Address + " "+student.Room.GetHashCode().ToString()+" " : "room is null "32                          , student.Param != null ? student.Param.Name : "param is null"33                          );34             listPrint.Items.Add(info);35         }

結(jié)論

  上述代碼輸出:

  

從上述代碼輸出的結(jié)果我們可以看出

  • student是被序列化的,student1是用student的序列化的二進(jìn)制反序列化出來的,兩個(gè)的hashcode不一樣,所以是兩個(gè)對(duì)象。
  • 標(biāo)記了序列化的字段都被序列化了,沒標(biāo)記的序列化字段Param是空的。
  • student中的屬性Room是引用類型,標(biāo)記為序列化,student和student1的Room里的值內(nèi)容一樣但是hashcode不一樣,所以這Room也是我們期望的兩個(gè)對(duì)象。

Demo下載

源碼下載


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 合作市| 江安县| 应用必备| 砚山县| 古蔺县| 玉树县| 石狮市| 普陀区| 和静县| 平果县| 石屏县| 太仆寺旗| 米脂县| 印江| 万源市| 清涧县| 柯坪县| 图片| 玉田县| 东海县| 河北区| 安岳县| 桦甸市| 景谷| 大足县| 遵化市| 大厂| 遂川县| 晋州市| 普宁市| 瑞金市| 肃宁县| 南召县| 三明市| 闽侯县| 库车县| 峨山| 榆树市| 昌乐县| 剑川县| 玉林市|