C#序列化與反序列化(Serialize,Deserialize)實例詳解
本文實例講述了C#序列化與反序列化(Serialize,Deserialize)實現(xiàn)方法。分享給大家供大家參考。具體分析如下:
如果要保存運行程序過程的數(shù)據(jù)要么保存到數(shù)據(jù)庫中,要么新建一個普通的文件,然后把數(shù)據(jù)保存進去.但是這兩者有個缺點就是,不能把原有數(shù)據(jù)的結(jié)構(gòu)也保存進去.比如一個類中的字段值保存進去后再讀取出來必須再解析下才行.序列化技術(shù)讓你省去了解析的過程.保存后再讀取時直接得到一個class
序列化的方式有三種:BinaryFormatter,SoapFormatter,XmlSerializer
1.BinaryFormatter
保存成二進制數(shù)據(jù)流.用法示例:
using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] //如果要想保存某個class中的字段,必須在class前面加個這樣attribute(C#里面用中括號括起來的標(biāo)志符) public class Person { public int age; public string name; [NonSerialized] //如果某個字段不想被保存,則加個這樣的標(biāo)志 public string secret; }
序列化:
classProgram { staticvoid Main(string[] args) { Person person = newPerson(); person.age = 18; person.name = "tom"; person.secret = "i will not tell you"; FileStream stream =newFileStream(@"c:\temp\person.dat",FileMode.Create); BinaryFormatter bFormat =newBinaryFormatter(); bFormat.Serialize(stream, person); stream.Close(); }
反序列化:
classProgram { staticvoid Main(string[] args) { Person person = newPerson(); FileStream stream =newFileStream(@"c:\temp\person.dat",FileMode.Open); BinaryFormatter bFormat =newBinaryFormatter(); person = (Person)bFormat.Deserialize(stream); //反序列化得到的是一個object對象.必須做下類型轉(zhuǎn)換 stream.Close(); Console.WriteLine(person.age + person.name + person.secret); //結(jié)果為18tom.因為secret沒有有被序列化. }
2.SoapFormatter
把數(shù)據(jù)保存成xml文件.里面除了保存的內(nèi)容還有些額外的Soap信息.它的用法和BinaryFormatter一樣.只要把BinaryFormatter都替換成SoapFormatter就行.
把文件名改為person.xml
另外就是添加名稱空間:using System.Runtime.Serialization.Formatters.Soap;
這個名稱空調(diào)對就的程序集有時VS沒有自動引用.你必須手動去引用.選中project,右擊選擇Add Reference.在.NET的標(biāo)簽下選擇
System.Runtime.Serialization.Formatters.Soap.然后點OK.
補充:SOAP(Simple Object Access Protocol )簡單對象訪問協(xié)議是在分散或分布式的環(huán)境中交換信息的簡單的協(xié)議,是一個基于XML的協(xié)議,它包括四個部分:SOAP封裝(envelop),封裝定義了一個描述消息中的內(nèi)容是什么,是誰發(fā)送的,誰應(yīng)當(dāng)接受并處理它以及如何處理它們的框架;SOAP編碼規(guī)則(encoding rules),用于表示應(yīng)用程序需要使用的數(shù)據(jù)類型的實例; SOAP RPC表示(RPC representation),表示遠程過程調(diào)用和應(yīng)答的協(xié)定;SOAP綁定(binding),使用底層協(xié)議交換信息。
3.XmlSerializer
也是保存成XML文件.但沒有其他額外信息.另外它只能保存public類型的字段.而其他兩種類型能保存所以類型的字段.
這里仍使用上面的Person類.
添加名稱空間:
using System.IO; using System.Xml.Serialization;
序列化:
classProgram { staticvoid Main(string[] args) { Person person = newPerson(); person.age = 18; person.name = "tom"; person.secret = "i will not tell you"; FileStream stream =newFileStream(@"c:\temp\xmlFormat.xml",FileMode.Create); XmlSerializer xmlserilize = newXmlSerializer(typeof(Person)); xmlserilize.Serialize(stream, person); stream.Close(); }
反序列化:
classProgram { staticvoid Main(string[] args) { Person person = newPerson(); FileStream stream =newFileStream(@"c:\temp\xmlFormat.xml",FileMode.Open); XmlSerializerxmlserilize = newXmlSerializer(typeof(Person)); person = (Person)xmlserilize.Deserialize(stream); stream.Close(); Console.WriteLine(person.age + person.name + person.secret); }
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
C#多線程學(xué)習(xí)之Thread、ThreadPool、Task、Parallel四者區(qū)別
這篇文章主要以一些簡單的小例子,簡述多線程的發(fā)展歷程:Thread,ThreadPool,Task,Parallel。文中的示例代碼講解詳細,對我們學(xué)習(xí)C#多線程有一定幫助,需要的朋友可以參考一下2021-12-12Unity中的PostProcessBuild實用案例深入解析
這篇文章主要為大家介紹了Unity中的PostProcessBuild實用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05Unity技術(shù)手冊之Slider滑動器使用實例詳解
這篇文章主要為大家介紹了Unity技術(shù)手冊之Slider滑動器使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11C# Winform實現(xiàn)表格復(fù)制粘貼效果
這篇文章主要為大家學(xué)習(xí)介紹了如何通過C# Winform實現(xiàn)表格復(fù)制粘貼效果,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下2023-07-07C#調(diào)用攝像頭實現(xiàn)拍照功能的示例代碼
這篇文章主要介紹了C#調(diào)用攝像頭實現(xiàn)拍照功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Winform?控件優(yōu)化LayeredWindow無鋸齒圓角窗體
這篇文章主要為大家介紹了Winform?控件優(yōu)化LayeredWindow實現(xiàn)無鋸齒圓角窗體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09