在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

.Net里的序列化

.Net里的序列化

更新時間:2021-11-16 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

什么是序列化?
---.net的運行時環(huán)境用來支持用戶定義類型的流化的機制。它是將對象實例的狀態(tài)存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉(zhuǎn)換為字節(jié)流,然后再把字節(jié)流寫入數(shù)據(jù)流。在隨后對對象進行反序列化時,將創(chuàng)建出與原對象完全相同的副本。

序列化的目的:
1、以某種存儲形式使自定義對象持久化;
2、將對象從一個地方傳遞到另一個地方。

實質(zhì)上序列化機制是將類的值轉(zhuǎn)化為一個一般的(即連續(xù)的)字節(jié)流,然后就可以將該流寫到磁盤文件或任何其他流化目標上。而要想實際的寫出這個流,就要使用那些實現(xiàn)了IFormatter接口的類里的Serialize和Deserialize方法。
在.net框架里提供了這樣兩個類:

一、BinaryFormatter

BinaryFormatter使用二進制格式化程序進行序列化。您只需創(chuàng)建一個要使用的流和格式化程序的實例,然后調(diào)用格式化程序的 Serialize 方法。流和要序列化的對象實例作為參數(shù)提供給此調(diào)用。類中的所有成員變量(甚至標記為 private 的變量)都將被序列化。

首先我們創(chuàng)建一個類:
[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
Serializable屬性用來明確表示該類可以被序列化。同樣的,我們可以用NonSerializable屬性用來明確表示類不能被序列化。
接著我們創(chuàng)建一個該類的實例,然后序列化,并存到文件里持久:
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "一些字符串";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();

而將對象還原到它以前的狀態(tài)也非常容易。首先,創(chuàng)建格式化程序和流以進行讀取,然后讓格式化程序?qū)ο筮M行反序列化。
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open,
FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();

// 下面是證明
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);

二、SoapFormatter

前面我們用BinaryFormatter以二進制格式來序列化。很容易的我們就能把前面的例子改為用SoapFormatter的,這樣將以xml格式化,因此能有更好的可移植性。所要做的更改只是將以上代碼中的格式化程序換成 SoapFormatter,而 Serialize 和 Deserialize 調(diào)用不變。對于上面使用的示例,該格式化程序?qū)⑸梢韵陆Y(jié)果。

<SOAP-ENV:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle=
"http://schemas.microsoft.com/soap/encoding/clr/1.0
http://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile">

<SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">一些字符串</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

在這里需要注意的是,無法繼承 Serializable 屬性。如果從 MyObject 派生出一個新的類,則這個新的類也必須使用該屬性進行標記,否則將無法序列化。例如,如果試圖序列化以下類實例,將會顯示一個 SerializationException,說明 MyStuff 類型未標記為可序列化。

public class MyStuff : MyObject
{
public int n3;
}

然而關(guān)于格式化器,還有個問題,假設(shè)我們只需要xml,但不需要soap特有的額外信息,那么該怎么做?有兩個方案:1、編寫一個實現(xiàn)IFormatter接口的類,采用的方式類似于SoapFormatter,但是可以沒有你不需要的信息;2、使用框架提供的類XmlSerializer。
XmlSerializer類和前兩個主流的序列化類的幾個不同點是:
1、不需要Serializable屬性,Serializable和NonSerializable屬性將會被忽略,但是使用XmlIgnore屬性,和NonSerializable屬性類似。
2、該類不能安全地訪問私有變成員,所以學要將私有成員改為公共成員,或者提供合適的公共特性。
3、要求被序列化的類要有一個默認的構(gòu)造器。

我們改一下前面的MyObject類為:

public class MyObject {
public int n1;
public String str;
public MyObject(){}
public MyObject(n1,str)
{
this.n1=n1;
this.str=str;
}
public override string ToString()
{
return String.Format("{0}:{1}",this.str,this.n1);
}
}

現(xiàn)在我們用XmlSerializer類來對修改后的MyObject進行序列化。因為XmlSerializer類的構(gòu)造器里有個Type參數(shù),所以XmlSerializer對象被明確的 連到該Type參數(shù)所表示的類了。XmlSerializer類也有Serialize和Deserialize方法:
MyObject obj = new MyObject(12,"some string...");
XmlSerializer formatter = new XmlSerializer(typeof(MyObject));
Stream stream = new FileStream("MyFile.xml", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
//下面是反序列化
stream.Seek(0,SeekOrigin.Begin)
MyObject obj_out=(MyObject)formatter.Deserialize(stream)
stream.Close();
Console.WriteLine(obj_out);

這個簡單的列子可以加以擴展,以便利用更多的XmlSerializer功能,包括使用屬性控制xml標記、使用xml模式和進行soap編碼。

自定義序列化

如果你希望讓用戶對類實現(xiàn)序列化,但是對數(shù)據(jù)流的組織方式不完全滿意,那么可以通過在對象上實現(xiàn) ISerializable 接口來自定義序列化過程。這一功能在反序列化后成員變量的值失效時尤其有用,但是需要為變量提供值以重建對象的完整狀態(tài)。除了必須將類申明為 Serializable 的同時,還要要實現(xiàn) ISerializable接口,需要實現(xiàn) GetObjectData 方法以及一個特殊的構(gòu)造函數(shù),在反序列化對象時要用到此構(gòu)造函數(shù)。在實現(xiàn) GetObjectData 方法時,最常調(diào)用的SerializationInfo的方法是AddValue,這個方法具有針對所有標準類型(int、char等等)的重載版本;而 StreamingContext 參數(shù)描述給定的序列化流的源和目標,這樣我們就可以知道我們是將對象序列化到持久性存儲還是在將他們跨進程或機器序列化。而在反序列化時,我們調(diào)用SerializationInfo提供的一組Getxxx方法,他們針對所有標準類型數(shù)據(jù)執(zhí)行各種AddValue重載版本的逆操作。下代碼示例說明了如何在前一部分中提到的 MyObject 類上實現(xiàn) ISerializable。

[Serializable]
public class MyObject : ISerializable
{
public int n1;
public int n2;
public String str;

public MyObject()
{
}

protected MyObject(SerializationInfo info, StreamingContext context)
{
n1 = info.GetInt32("i");
n2 = info.GetInt32("j");
str = info.GetString("k");
}

public virtual void GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue("i", n1);
info.AddValue("j", n2);
info.AddValue("k", str);
}
}
在序列化過程中調(diào)用 GetObjectData 時,需要填充方法調(diào)用中提供的 SerializationInfo 對象。只需按名稱/值對的形式添加將要序列化的變量。其名稱可以是任何文本。只要已序列化的數(shù)據(jù)足以在反序列化過程中還原對象,便可以自由選擇添加至 SerializationInfo 的成員變量。如果基對象實現(xiàn)了 ISerializable,則派生類應調(diào)用其基對象的 GetObjectData 方法。

需要強調(diào)的是,將 ISerializable 添加至某個類時,需要同時實現(xiàn) GetObjectData 以及特殊的具有特定原型的構(gòu)造函數(shù)--重要的是,該構(gòu)造函數(shù)的參數(shù)列表必須與GetObjectData相同,這個構(gòu)造函數(shù)將會在反序列化的過程中使用:格式化器從流中反序列化數(shù)據(jù),然后通過這個構(gòu)造函數(shù)對對象進行實列化。如果缺少 GetObjectData,編譯器將發(fā)出警告。但是,由于無法強制實現(xiàn)構(gòu)造函數(shù),所以,缺少構(gòu)造函數(shù)時不會發(fā)出警告。如果在沒有構(gòu)造函數(shù)的情況下嘗試反序列化某個類,將會出現(xiàn)異常。在消除潛在安全性和版本控制問題等方面,當前設(shè)計優(yōu)于 SetObjectData 方法。例如,如果將 SetObjectData 方法定義為某個接口的一部分,則此方法必須是公共方法,這使得用戶不得不編寫代碼來防止多次調(diào)用 SetObjectData 方法。可以想象,如果某個對象正在執(zhí)行某些操作,而某個惡意應用程序卻調(diào)用此對象的 SetObjectData 方法,將會引起一些潛在的麻煩。

在反序列化過程中,使用出于此目的而提供的構(gòu)造函數(shù)將 SerializationInfo 傳遞給類。對象反序列化時,對構(gòu)造函數(shù)的任何可見性約束都將被忽略,因此,可以將類標記為 public、protected、internal 或 private。一個不錯的辦法是,在類未封裝的情況下,將構(gòu)造函數(shù)標記為 protect。如果類已封裝,則應標記為 private。要還原對象的狀態(tài),只需使用序列化時采用的名稱,從 SerializationInfo 中檢索變量的值。如果基類實現(xiàn)了 ISerializable,則應調(diào)用基類的構(gòu)造函數(shù),以使基礎(chǔ)對象可以還原其變量。

如果從實現(xiàn)了 ISerializable 的類派生出一個新的類,則只要新的類中含有任何需要序列化的變量,就必須同時實現(xiàn)構(gòu)造函數(shù)以及 GetObjectData 方法。以下代碼片段顯示了如何使用上文所示的 MyObject 類來完成此操作。

[Serializable]
public class ObjectTwo : MyObject
{
public int num;

public ObjectTwo() : base(){ }

protected ObjectTwo(SerializationInfo si, StreamingContext context) : base(si,context)
{
num = si.GetInt32("num");
}

public override void GetObjectData(SerializationInfo si, StreamingContext context)
{
base.GetObjectData(si,context);
si.AddValue("num", num);
}
}
切記要在反序列化構(gòu)造函數(shù)中調(diào)用基類,否則,將永遠不會調(diào)用基類上的構(gòu)造函數(shù),并且在反序列化后也無法構(gòu)建完整的對象。

對象被徹底重新構(gòu)建,但是在反系列化過程中調(diào)用方法可能會帶來不良的副作用,因為被調(diào)用的方法可能引用了在調(diào)用時尚未反序列化的對象引用。如果正在進行反序列化的類實現(xiàn)了 IDeserializationCallback,則反序列化整個對象圖表后,將自動調(diào)用 OnSerialization 方法。此時,引用的所有子對象均已完全還原。有些類不使用上述事件偵聽器,很難對它們進行反序列化,散列表便是一個典型的例子。在反序列化過程中檢索關(guān)鍵字/值對非常容易,但是,由于無法保證從散列表派生出的類已反序列化,所以把這些對象添加回散列表時會出現(xiàn)一些問題。因此,建議目前不要在散列表上調(diào)用方法。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 高清一区二区视频| 看欧美ab黄色大片视频免费 | 日本在线播放一区二区| 欧美久久久久久久久久久久久| 佐佐木明希av| 91免费视频黄| 97超碰在线视| 777av视频| 大陆极品少妇内射aaaaa| 18禁男女爽爽爽午夜网站免费| www.av中文字幕| 黄页网站在线观看视频| 国产精品国产亚洲精品看不卡| 成人一区二区av| 久久精品国产sm调教网站演员| 国产av天堂无码一区二区三区| 少妇高潮毛片色欲ava片| 国模吧无码一区二区三区| 日韩精品视频久久| 日韩大片一区二区| 国产精品亚洲天堂| 黄网站欧美内射| 亚洲高清在线免费观看| 欧美日韩在线免费播放| 爱爱爱视频网站| 成人一区二区免费视频| 日本一极黄色片| 夜夜爽久久精品91| 欧美网站免费观看| 国产乱码一区二区三区四区| 青春草国产视频| 欧美亚洲日本在线观看| 亚洲成人动漫在线| 欧美一级黄色片视频| 香蕉精品视频在线| 大肉大捧一进一出好爽动态图| 9l视频白拍9色9l视频| 欧美午夜性视频| 999精彩视频| 夜夜添无码一区二区三区| xxxx一级片| 成人网站免费观看入口| 三级av免费看| 日av中文字幕| 97视频久久久| 国产又粗又长又爽视频| 久久99爱视频| 中文字幕无码不卡免费视频| 成年在线观看视频| 黄色小视频免费网站| 精品视频一区二区在线| 国产资源在线免费观看| 欧美 日韩 国产 在线观看| 91激情视频在线| 国产精品欧美激情在线观看| 欧美图片激情小说| 可以在线看黄的网站| 午夜av中文字幕| 91av视频免费观看| 蜜臀av免费观看| 激情 小说 亚洲 图片: 伦| 日韩a在线播放| 国产最新免费视频| 久久国产亚洲精品无码| 成人一对一视频| 欧美视频在线免费播放| 男人操女人逼免费视频| 国产深夜男女无套内射| 丰满少妇被猛烈进入高清播放| www精品久久| 18禁免费无码无遮挡不卡网站| 久久久久久免费看| av网站在线观看不卡| 91国视频在线| 在线免费av播放| 国产精品自在自线| 亚洲国产精品女人| 4444亚洲人成无码网在线观看| 日韩精品免费一区| 黄色一级片在线看| 少妇性饥渴无码a区免费| 欧美韩国日本在线| 欧美男女交配视频| 国产女人18毛片| 北条麻妃69av| www,av在线| 欧美成人精品免费| 国产精品免费入口| 91丨九色丨蝌蚪| 999久久欧美人妻一区二区| aa在线免费观看| 91aaa精品| 妞干网在线视频观看| 国产三级三级看三级| 日本一道在线观看| 男女曰b免费视频| 性鲍视频在线观看| 精品国产免费av| 极品粉嫩美女露脸啪啪| 日韩黄色片在线| 青青草原国产在线视频| 国产自产在线视频| 污视频网址在线观看| 欧美成人高潮一二区在线看| 99re6在线观看| 日本熟妇人妻xxxx| 超碰91在线播放| 激情综合网婷婷| 欧美三级午夜理伦三级老人| 成人在线免费观看av| 国产午夜精品视频一区二区三区| 国产超级av在线| 美女av免费观看| 国产精品亚洲天堂| 一区二区三区免费播放| 欧美国产亚洲一区| 国自产拍偷拍精品啪啪一区二区| 午夜免费一级片| 天堂av在线8| 免费看污黄网站| av无码精品一区二区三区| 国产www免费| 日韩欧美视频免费在线观看| 亚洲免费在线播放视频| 美女网站色免费| 91最新在线观看| 黑鬼大战白妞高潮喷白浆| 日本在线xxx| 亚洲午夜精品久久久久久人妖| 久久福利一区二区| 国产精品无码电影在线观看| 日日噜噜噜夜夜爽爽| 亚洲怡红院在线| 91视频福利网| 午夜在线视频免费观看| 尤物网站在线看| 法国空姐在线观看免费| 国内外成人激情免费视频| 欧美日韩激情四射| 日韩a级在线观看| 国产午夜福利100集发布| 日韩欧美一区二| 又色又爽又高潮免费视频国产| caopor在线视频| 超碰人人草人人| 国产高清不卡无码视频| 日韩国产一级片| 日韩无套无码精品| 日韩欧美亚洲另类| 91精品国产毛片武则天| 无码中文字幕色专区| 欧美aⅴ在线观看| 三级av免费观看| 欧美性受黑人性爽| 69堂免费视频| 五月天激情播播| 国产a级片网站| 天天综合网日韩| 日韩精品一区二区在线视频| 成年人视频网站免费观看| 国产理论在线播放| 亚洲免费av网| 东京热加勒比无码少妇| 亚洲精品在线网址| www在线观看免费| 91亚洲精品久久久蜜桃借种| 欧美黑人在线观看| 亚洲免费一级视频| 久久av综合网| 一级一片免费播放| 日韩欧美xxxx| 欧美视频在线观看视频| 91插插插插插插插插| 久久国产午夜精品理论片最新版本| 久草福利视频在线| 欧美亚洲黄色片| 日韩第一页在线观看| xxxx一级片| 少妇高潮喷水久久久久久久久久| 中文字幕av导航| 污污的网站18| 国产中文字幕免费观看| 久久久久久久久久伊人| 亚洲美女爱爱视频| 免费激情视频在线观看| 好吊妞无缓冲视频观看| 人人妻人人澡人人爽欧美一区双| 亚洲一级免费观看| 欧美成人免费在线观看视频| av在线免费观看国产| 成人高清在线观看视频| 在线观看免费不卡av| 成年人网站大全| 国产激情在线观看视频| 日韩免费毛片视频| 99免费视频观看| 手机在线免费观看毛片| 国产 porn| 色一情一区二区三区| 色呦色呦色精品|