黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Mcad學(xué)習(xí)筆記之序列化(2進(jìn)制和Soap序列化)

系統(tǒng) 2514 0
我最近學(xué)習(xí)remoting和web服務(wù)時(shí),總是看到一個(gè)重要的字眼"序列化".
那什么是序列化呢?
以前我也模模糊糊.
?
為了搞清楚,請(qǐng)和我一起來序列化學(xué)習(xí)之旅吧.
?
讓我們先看看序列化的定義,以下是微軟的說明:
序列化可被定義為將對(duì)象的狀態(tài)存儲(chǔ)到存儲(chǔ)媒介中的過程。在此過程中,對(duì)象的公共字段和私有字段以及類的名稱(包括包含該類的程序集)都被轉(zhuǎn)換為字節(jié)流,然后寫入數(shù)據(jù)流。在以后反序列化該對(duì)象時(shí),創(chuàng)建原始對(duì)象的精確復(fù)本
?
序列化一般用在2種地方:
1.將數(shù)據(jù)保持到存儲(chǔ)中
例如:我知道在Asp.Net Forums中有.Net中序列化和反序列化的應(yīng)用
在Forums中,有些內(nèi)容是不固定的,如用戶資料,除了一些基本資料,可能還要MSN、個(gè)人主頁、簽名等.我們一般是一個(gè)屬性對(duì)應(yīng)于表中的一個(gè)字段,要是以后我們?cè)黾右恍┬聦傩裕偷迷黾颖碜侄危€要修改存儲(chǔ)過程,這樣其不麻煩?
在Asp.Net Forums中把用戶資料序列化為2進(jìn)制,這樣用一個(gè)表字段就可以解決問題,并且擴(kuò)展性好。
?
2.通過值將對(duì)象從一個(gè)應(yīng)用程序域發(fā)送到另一個(gè)應(yīng)用程序域中
remoting和web服務(wù)就是典型的應(yīng)用
?
說多了沒用,讓我們來一段代碼吧
先定義一個(gè)類
?1 using ?System;
?2
?3 namespace ?SerializTest
?4 {
?5 ????[Serializable]
?6 ???? public ? class ?Class2
?7 ???? {
?8 ???????? private ? string ?name;
?9 ????????[NonSerialized]
10 ???????? private ? int ?account;
11 ????????
12 ???????? public ?Class2( string ?name, int ?account)
13 ???????? {
14 ???????????? this .account = account;
15 ???????????? this .name = name;
16 ????????}

17
18 ???????? public ? int ?Account
19 ???????? {
20 ???????????? get
21 ???????????? {
22 ???????????????? return ?account;
23 ????????????}

24 ????????}

25
26 ???????? public ? string ?Name
27 ???????? {
28 ???????????? get
29 ???????????? {
30 ???????????????? return ?name;
31 ????????????}

32 ????????}

33 ????}

34 }

35
說明:
序列化一個(gè)類的最簡(jiǎn)單的方式是使用Serializable屬性
當(dāng)然還可以通過在對(duì)象上實(shí)現(xiàn)ISerializable接口,自定義序列化
標(biāo)記了Serializable屬性的類,類里面的所有成員都將被序列化,私有的變量也在內(nèi)
當(dāng)然我們也可以有選擇的序列化類里面的字段
例如類里面的一些敏感數(shù)據(jù),我們可以不對(duì)其進(jìn)行序列化
通過用NonSerialized屬性標(biāo)記成員變量,可以防止它們被序列化
NonSerialized屬性只可以用在類的某個(gè)字段上

好了,再來一段俺喜歡的控制臺(tái)來看看到底是怎么回事
?1 using ?System;
?2 using ?System.IO;
?3 using ?System.Runtime.Serialization;
?4 using ?System.Runtime.Serialization.Formatters.Binary;
?5 using ?System.Runtime.Serialization.Formatters.Soap;
?6
?7 namespace ?SerializTest
?8 {
?9 ???? class ?Class1
10 ???? {
11 ????????[STAThread]
12 ???????? static ? void ?Main( string []?args)
13 ???????? {
14 ???????????? string ?fileName = " MyFile.dat " ;
15 ????????????Class2?my = new ?Class2( " Serializ?TestSerializ " , 987 );?
16 ????????????Console.WriteLine( " 初始化Class2類的一個(gè)實(shí)例my,my的賬號(hào)=987,my的名字=Serializ?TestSerializ " );
17
18 ???????????? // 序列化過程開始,我們把Class2的實(shí)例二進(jìn)制序列化到文件MyFile.dat中
19 ????????????IFormatter?formatter1 = new ??BinaryFormatter();
20 ????????????Stream?stream1? = ? new ?FileStream(fileName,?FileMode.Create,?FileAccess.Write,FileShare.None);
21 ????????????formatter1.Serialize(stream1,my);
22 ????????????stream1?.Close();
23
24 ???????????? // 反序列化過程開始,我們把Class2的實(shí)例從文件MyFile.dat中取出來
25 ????????????IFormatter?formatter? = ? new ?BinaryFormatter();
26 ????????????Stream?stream? = ? new ?FileStream(fileName,?FileMode.Open,?FileAccess.Read,?FileShare.Read);
27 ????????????Class2?c2? = ?(Class2)?formatter.Deserialize(stream);
28 ????????????stream.Close();
29
30 ????????????Console.WriteLine( " c2的名字= " + ?c2.Name?);
31 ????????????Console.WriteLine( " c2的賬號(hào)= " + ?c2.Account.ToString()?);
32
33 ????????????Console.ReadLine();
34 ????????}

35 ????}

36 }
結(jié)果是

我們可以看到由于類Class2的account字段運(yùn)用了NonSerialized屬性
反序列化后我們是看不到Class2類實(shí)例的賬號(hào),只能看到名字

讓我們?cè)倏匆欢?同時(shí)序列化多個(gè)對(duì)象的代碼
?1 using ?System;
?2 using ?System.IO;
?3 using ?System.Runtime.Serialization;
?4 using ?System.Runtime.Serialization.Formatters.Binary;
?5 using ?System.Runtime.Serialization.Formatters.Soap;
?6
?7 namespace ?SerializTest
?8 {
?9 ???? class ?Class1
10 ???? {
11 ????????[STAThread]
12 ???????? static ? void ?Main( string []?args)
13 ???????? {
14 ???????????? string ?fileName = " MyFile.dat " ;
15 ????????????Class2[]?myClass = { new ?Class2( " a " , 123 ), new ?Class2( " b " , 456 ), new ?Class2( " c " , 789 )} ;
16
17 ???????????? // 序列化過程開始
18 ???????????? // 我們把類的幾個(gè)實(shí)例序列化到一個(gè)文件中,這樣比起分別序列化可以節(jié)約空間
19 ????????????IFormatter?formatter = new ?BinaryFormatter();
20 ????????????Stream?stream? = ? new ?FileStream(fileName,?FileMode.Create,?FileAccess.Write,FileShare.None);
21 ???????????? for ( int ?i = 0 ;i < myClass.Length;i ++ )
22 ???????????? {
23 ????????????????formatter.Serialize(stream,myClass[i]);
24 ????????????}

25 ????????????stream.Close();
26
27 ???????????? // 反序列化過程開始
28 ????????????IFormatter?formatter11 = new ??BinaryFormatter();
29 ????????????Stream?fs? = ? new ?FileStream(fileName,?FileMode.Open,?FileAccess.Read,FileShare.Read);
30 ???????????? long ?ii = ?fs.Length;
31 ????????????System.Collections.ArrayList?list = new ?System.Collections.ArrayList();
32 ???????????? // 從文件中逐個(gè)讀出Class2的實(shí)例并反序列化
33 ???????????? while ?(fs.Position != fs.Length)
34 ???????????? {
35 ????????????????list.Add(formatter11.Deserialize(fs));
36 ????????????}

37 ????????????fs.Close();
38 ????????????Console.WriteLine( " 反序列化結(jié)果: " );
39 ???????????? foreach ( object ?o? in ?list)
40 ???????????? {
41 ????????????????Class2?class2 = o? as ?Class2;
42 ???????????????? if ?(class2 != null )
43 ???????????????? {
44 ????????????????????Console.WriteLine( " 名字= " + ?class2.Name?);
45 ????????????????????Console.WriteLine( " 賬號(hào)= " + ?class2.Account.ToString());
46 ????????????????}

47 ????????????}

48
49 ????????????Console.ReadLine();
50 ????????}

51 ????}

52 }
結(jié)果是


其實(shí)數(shù)組也是可以序列化的類
那么我們可以把上面的代碼做些簡(jiǎn)化
?1 using ?System;
?2 using ?System.IO;
?3 using ?System.Runtime.Serialization;
?4 using ?System.Runtime.Serialization.Formatters.Binary;
?5 using ?System.Runtime.Serialization.Formatters.Soap;
?6
?7 namespace ?SerializTest
?8 {
?9 ???? class ?Class1
10 ???? {
11 ????????[STAThread]
12 ???????? static ? void ?Main( string []?args)
13 ???????? {
14 ???????????

Mcad學(xué)習(xí)筆記之序列化(2進(jìn)制和Soap序列化)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論