C#序列化與反序列化(Serialize,Deserialize)實(shí)例詳解
本文實(shí)例講述了C#序列化與反序列化(Serialize,Deserialize)實(shí)現(xiàn)方法。分享給大家供大家參考。具體分析如下:
如果要保存運(yùn)行程序過(guò)程的數(shù)據(jù)要么保存到數(shù)據(jù)庫(kù)中,要么新建一個(gè)普通的文件,然后把數(shù)據(jù)保存進(jìn)去.但是這兩者有個(gè)缺點(diǎn)就是,不能把原有數(shù)據(jù)的結(jié)構(gòu)也保存進(jìn)去.比如一個(gè)類(lèi)中的字段值保存進(jìn)去后再讀取出來(lái)必須再解析下才行.序列化技術(shù)讓你省去了解析的過(guò)程.保存后再讀取時(shí)直接得到一個(gè)class
序列化的方式有三種:BinaryFormatter,SoapFormatter,XmlSerializer
1.BinaryFormatter
保存成二進(jìn)制數(shù)據(jù)流.用法示例:
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
//如果要想保存某個(gè)class中的字段,必須在class前面加個(gè)這樣attribute(C#里面用中括號(hào)括起來(lái)的標(biāo)志符)
public class Person
{
public int age;
public string name;
[NonSerialized] //如果某個(gè)字段不想被保存,則加個(gè)這樣的標(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);
//反序列化得到的是一個(gè)object對(duì)象.必須做下類(lèi)型轉(zhuǎn)換
stream.Close();
Console.WriteLine(person.age + person.name + person.secret);
//結(jié)果為18tom.因?yàn)閟ecret沒(méi)有有被序列化.
}
2.SoapFormatter
把數(shù)據(jù)保存成xml文件.里面除了保存的內(nèi)容還有些額外的Soap信息.它的用法和BinaryFormatter一樣.只要把BinaryFormatter都替換成SoapFormatter就行.
把文件名改為person.xml
另外就是添加名稱(chēng)空間:using System.Runtime.Serialization.Formatters.Soap;
這個(gè)名稱(chēng)空調(diào)對(duì)就的程序集有時(shí)VS沒(méi)有自動(dòng)引用.你必須手動(dòng)去引用.選中project,右擊選擇Add Reference.在.NET的標(biāo)簽下選擇
System.Runtime.Serialization.Formatters.Soap.然后點(diǎn)OK.
補(bǔ)充:SOAP(Simple Object Access Protocol )簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議是在分散或分布式的環(huán)境中交換信息的簡(jiǎn)單的協(xié)議,是一個(gè)基于XML的協(xié)議,它包括四個(gè)部分:SOAP封裝(envelop),封裝定義了一個(gè)描述消息中的內(nèi)容是什么,是誰(shuí)發(fā)送的,誰(shuí)應(yīng)當(dāng)接受并處理它以及如何處理它們的框架;SOAP編碼規(guī)則(encoding rules),用于表示應(yīng)用程序需要使用的數(shù)據(jù)類(lèi)型的實(shí)例; SOAP RPC表示(RPC representation),表示遠(yuǎn)程過(guò)程調(diào)用和應(yīng)答的協(xié)定;SOAP綁定(binding),使用底層協(xié)議交換信息。
3.XmlSerializer
也是保存成XML文件.但沒(méi)有其他額外信息.另外它只能保存public類(lèi)型的字段.而其他兩種類(lèi)型能保存所以類(lèi)型的字段.
這里仍使用上面的Person類(lèi).
添加名稱(chēng)空間:
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);
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C#實(shí)現(xiàn)XML序列化與反序列化
- C#對(duì)Json進(jìn)行序列化和反序列化
- C#中關(guān)于序列化與反序列化的三種方法
- C# 解析XML和反序列化的示例
- C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例
- C#中Json反序列化的實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)XML與實(shí)體類(lèi)之間相互轉(zhuǎn)換的方法(序列化與反序列化)
- c#對(duì)象反序列化與對(duì)象序列化示例詳解
- C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼
- 深入理解C#序列化與反序列化的詳解
- C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程
相關(guān)文章
C# 中類(lèi)型轉(zhuǎn)換方式之顯式轉(zhuǎn)換和 as 運(yùn)算符
在 C# 中,有兩種常見(jiàn)的類(lèi)型轉(zhuǎn)換方式:顯式轉(zhuǎn)換和as 運(yùn)算符,它們用于在不同類(lèi)型之間進(jìn)行轉(zhuǎn)換,以下是對(duì)這兩種轉(zhuǎn)換方式的詳細(xì)解釋和示例說(shuō)明,感興趣的朋友跟隨小編一起看看吧2024-05-05
C#窗體讀取EXCEL并存入SQL數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#窗體讀取EXCEL并存入SQL數(shù)據(jù)庫(kù)的方法,實(shí)例簡(jiǎn)述了實(shí)現(xiàn)讀取excel及寫(xiě)入SQL數(shù)據(jù)庫(kù)的原理與技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
C#判斷程序是否是管理員權(quán)限運(yùn)行的方法代碼示例
這篇文章主要介紹了C#判斷程序是否是管理員權(quán)限運(yùn)行的方法代碼示例,本文直接給出實(shí)現(xiàn)代碼例子,需要的朋友可以參考下2015-03-03
Silverlight實(shí)現(xiàn)跑馬燈動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Silverlight實(shí)現(xiàn)跑馬燈動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
如何用WindowsForm給窗口添加一些簡(jiǎn)單的動(dòng)畫(huà)效果
這篇文章主要介紹了如何用WindowsForm給窗口添加一些簡(jiǎn)單的動(dòng)畫(huà)效果,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C#并發(fā)編程之a(chǎn)sync和await關(guān)鍵字詳解
對(duì)于?async?和?await?兩個(gè)關(guān)鍵字,對(duì)于一線開(kāi)發(fā)人員再熟悉不過(guò)了,到處都是它們的身影,下面小編就來(lái)和大家記錄匯總下它們的使用吧2023-07-07
基于WPF實(shí)現(xiàn)帶蒙版的MessageBox消息提示框
這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)帶蒙版的MessageBox消息提示框,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-08-08
C#基礎(chǔ)教程之類(lèi)class與結(jié)構(gòu)struct的區(qū)別
struct是值類(lèi)型,創(chuàng)建一個(gè)struct類(lèi)型的實(shí)例被分配在棧上,class是引用類(lèi)型,創(chuàng)建一個(gè)class類(lèi)型實(shí)例被分配在托管堆上,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)教程之類(lèi)class與結(jié)構(gòu)struct區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-11-11

