创建对象的序列化文件 - SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较...
序列化本身就是要將對(duì)象轉(zhuǎn)換成為數(shù)據(jù)流, 這樣便于存儲(chǔ)和傳輸.
SoapFormatter和binaryFormatter都是一種Formatter,原本我以為XmlSerializer也是繼承了IFormatter接口,后來(lái)發(fā)現(xiàn)不是.
關(guān)于formatter和Iformatter,可以到命名空間 System.Runtime.Serialization.Formatters 查看
關(guān)于使用比較
// create a file stream to write the file
FileStream fileStream = new FileStream("DoSum.bin", FileMode.Create);
// use the CLR binary formatter
BinaryFormatter binaryFormatter = new BinaryFormatter();
// serialize to disk
binaryFormatter.Serialize(fileStream, sObj);
fileStream.Close();
xmlSerializer 比較不同
// create a file stream to write the file
??????????? FileStream fileStream = new FileStream("DoSum.xml", FileMode.Create);
??????????? // use the CLR binary formatter
??????????? System.Xml.Serialization.XmlSerializer
??????????????? formatter = new XmlSerializer(typeof(SumOf));
??????????? // serialize to disk
??????????? formatter.Serialize(fileStream, sObj);
??????????? fileStream.Close();
?
可以使用(定義)不同的格式器來(lái)創(chuàng)建對(duì)象的序列化.
比如 SoapFormatter, binaryFormatter
當(dāng)然也可以完全繼承一個(gè)Formatter來(lái)定義自己的格式化器.
SoapFormatter, binaryFormatter 是無(wú)法繼承的,它們是實(shí)現(xiàn)了 IFormatter接口, 而xmlSerializer沒(méi)有實(shí)現(xiàn)接口IFormatter,但我們可以定義類繼承于它
序列化導(dǎo)出內(nèi)容的不同.
如果我們想控制序列化出來(lái)的內(nèi)容,我們有兩個(gè)途徑來(lái)控制, 一個(gè)是定義自己的格式化器,另一個(gè)則是被序列化對(duì)象實(shí)現(xiàn)接口 System.Runtime.Serialization.ISerializable.
格式化器里面有一個(gè)方法:
public override void Serialize(System.IO.Stream serializationStream, object graph)
ISerializable 里面有一個(gè)方法:
public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
需要注意的是, 盡管對(duì)象實(shí)現(xiàn)了ISerializable, 如果使用xmlSerializer導(dǎo)出內(nèi)容仍然不變.
注意以下文字
序列化過(guò)程的步驟
在格式化程序上調(diào)用 serialize 方法時(shí),對(duì)象序列化按照以下規(guī)則進(jìn)行:
檢查格式化程序是否有代理選取器。如果有,檢查代理選取器是否處理指定類型的對(duì)象。如果選取器處理此對(duì)象類型,將在代理選取器上調(diào)用 iserializable.getobjectdata。
如果沒(méi)有代理選取器或有卻不處理此類型,將檢查是否使用 serializable 屬性對(duì)對(duì)象進(jìn)行標(biāo)記。如果未標(biāo)記,將會(huì)引發(fā) serializationexception。
如果對(duì)象已被正確標(biāo)記,將檢查對(duì)象是否實(shí)現(xiàn)了 iserializable。如果已實(shí)現(xiàn),將在對(duì)象上調(diào)用 getobjectdata。
如果對(duì)象未實(shí)現(xiàn) serializable,將使用默認(rèn)的序列化策略,對(duì)所有未標(biāo)記為 nonserialized 的字段都進(jìn)行序列化。
?
關(guān)于對(duì)象序列化,可以在網(wǎng)上搜索一下這篇文章<<.NET 中的對(duì)象序列化>>
?
我這里有一個(gè)問(wèn)題, 最近傳送一個(gè)dataset的時(shí)候,我直接使用的 datatset.getxml()獲取的序列文件,是否可以自己定義一個(gè)formatter來(lái)序列它呢?
總結(jié)
以上是生活随笔為你收集整理的创建对象的序列化文件 - SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二十年最强悍病毒排行榜
- 下一篇: 利用ASP.NET输出指定内容的WORD