C#序列化與反序列化實(shí)例
本文實(shí)例講述了C#序列化與反序列化的方法。分享給大家供大家參考。具體分析如下:
把“對(duì)象”轉(zhuǎn)換為“字節(jié)序列”的過程稱為對(duì)象的序列化。 把“字節(jié)序列”恢復(fù)為“對(duì)象”的過程稱為對(duì)象的反序列化。
序列化
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace 序列化與反序列化
{
//序列化就是將對(duì)象轉(zhuǎn)換成二進(jìn)制
//反序列化就是將二進(jìn)制轉(zhuǎn)換成對(duì)象
//序列化與反序列化的作用就是:傳輸數(shù)據(jù)。
//我們?cè)诰W(wǎng)絡(luò)中傳輸數(shù)據(jù)的時(shí)候只有二進(jìn)制這個(gè)形態(tài)是可以被傳輸?shù)摹R簿褪钦f我們不管在網(wǎng)絡(luò)中傳輸什么內(nèi)容,都會(huì)先把你要傳輸?shù)膬?nèi)容序列化成二進(jìn)制的數(shù)據(jù),對(duì)方接收到的同樣就是一個(gè)二進(jìn)制的數(shù)據(jù),它需要再對(duì)這個(gè)二進(jìn)制的數(shù)據(jù)進(jìn)行反序列化成一個(gè)對(duì)象。
//我們要序列化一個(gè)類,第一步就要將類標(biāo)記為可以被序列化的。用[Serializable]關(guān)鍵字。只有被[Serializable]標(biāo)記的類創(chuàng)建出來的對(duì)象才能被序列化
[Serializable] //這個(gè)[Serializable]的作用是:指示一個(gè)類可以序列化。無法繼承此類。
public class Person
{
public string Name { get; set; }
public int Age{get;set;}
public char Gender{get;set;}
public Person() { }
public Person(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
}
class Program
{
static void Main(string[] args)
{
//現(xiàn)在我們要將p這個(gè)對(duì)象,傳輸給對(duì)方的電腦?,F(xiàn)在沒有對(duì)方的電腦,那我就在自己的電腦上模擬一下:現(xiàn)在通過一個(gè)流將p這個(gè)對(duì)象轉(zhuǎn)換成二進(jìn)制,寫到我的桌面上。然后我們?cè)賹⑦@個(gè)二進(jìn)制文件在通過反序列化成一個(gè)對(duì)象
Person p = new Person("雪輝", 25, '女');
using (FileStream stream = new FileStream(@"C:\Users\凡斌\Desktop\11.txt", System.IO.FileMode.OpenOrCreate, FileAccess.Write))
{
//開始序列化對(duì)象。開始序列化對(duì)象需要一個(gè)類
BinaryFormatter bf = new BinaryFormatter();
//public void Serialize(Stream serializationStream, object graph); 這個(gè)Serialize方法的第一個(gè)參數(shù):是對(duì)象要序列化成的流文件,第二個(gè)參數(shù)是:要序列化的對(duì)象
bf.Serialize(stream, p);
}
Console.WriteLine("序列化完畢");
}
}
}
反序列化
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace 序列化與反序列化
{
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public char Gender { get; set; }
}
class Program
{
static void Main(string[] args)
{
//現(xiàn)在我們?cè)賹倓倢懙阶烂娴亩M(jìn)制流文件11.txt通過反序列化成一個(gè)對(duì)象
using (FileStream stream2 = new FileStream(@"C:\Users\凡斌\Desktop\11.txt", FileMode.Open, FileAccess.Read))
{
BinaryFormatter bf2 = new BinaryFormatter();
//public object Deserialize(Stream serializationStream);這個(gè)Deserialize方法的參數(shù)是:要反序列化的二進(jìn)制流文件。它的返回值是一個(gè)object 所有我們要將這個(gè)object強(qiáng)轉(zhuǎn)成Person類型。
Person p2=(Person) bf2.Deserialize(stream2);
Console.WriteLine("方序列化成功");
Console.WriteLine(p2.Name); //輸出:雪輝
Console.ReadKey();
}
}
}
}
序列化
將此類的一個(gè)實(shí)例序列化為一個(gè)文件:
【MyFile.bin 這個(gè)文件是把obj對(duì)象序列化后持久化存儲(chǔ)的文件】
obj.n1 = 1;
obj.n2 = 24;
obj.str = "一些字符串";
IFormatter formatter = new BinaryFormatter();
Stream MyStream = new FileStream("MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(MyStream, obj);
stream.Close();
反序列化
這里說的是將一個(gè)MyFile.bin文件通過反序列化,轉(zhuǎn)換成一個(gè)obj對(duì)象
【filestream 讀取這個(gè)文件流,然后用.net的序列化器反序列化成對(duì)象】
Stream MyStream = new FileStream("MyFile.bin", FileMode.Open,
FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(MyStream);
stream.Close();
xml
將此類的實(shí)例序列化成一個(gè)Xml文件
ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj);
反序列化
MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));
序列化DataTable
主要是為了實(shí)現(xiàn)下次啟動(dòng)項(xiàng)目的時(shí)候能讀取上次保存的對(duì)象信息。通俗點(diǎn)就是把一個(gè)對(duì)象保存起來,在特別的時(shí)候在把這個(gè)還原出來。在C#中常見的序列化的方法主要也有三個(gè):BinaryFormatter、SoapFormatter、XML序列化。今天涉及到的主要是XML序列化,就DataTable的內(nèi)容序列化保存。
/// DataTable序列化
/// </summary>
/// <param name="dt">需要序列化的DataTable</param>
/// <param name="path">路徑</param>
public void Serializer(DataTable dt,string path)
{
XmlSerializer serializer = new XmlSerializer(typeof(System.Data.DataTable));
System.Xml.XmlWriter writer= System.Xml.XmlWriter.Create(path);
serializer.Serialize(writer, dt);
}
//反序列化
private void InitData(string filePath)
{
XmlSerializer serializer = new XmlSerializer(typeof(System.Data.DataTable));
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None);
DataTable dt = (DataTable)serializer.Deserialize(fs);
for (int i = 0; i < dt.Rows.Count; i++)
{
int j = dgvDeviceInfo.Rows.Add();
dgvDeviceInfo.Rows[j].SetValues(dt.Rows[i]["設(shè)備ID"].ToString(),
dt.Rows[i]["序號(hào)"].ToString(),
dt.Rows[i]["設(shè)備名稱"].ToString(),
dt.Rows[i]["編號(hào)"].ToString(),
dt.Rows[i]["連接信息"].ToString(),
dt.Rows[i]["備注"].ToString(),
dt.Rows[i]["TagID"].ToString());
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#并發(fā)編程之a(chǎn)sync和await關(guān)鍵字詳解
對(duì)于?async?和?await?兩個(gè)關(guān)鍵字,對(duì)于一線開發(fā)人員再熟悉不過了,到處都是它們的身影,下面小編就來和大家記錄匯總下它們的使用吧2023-07-07
利用Aspose.Cells和Excel模板導(dǎo)出統(tǒng)計(jì)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了利用Aspose.Cells和Excel模板導(dǎo)出復(fù)雜的統(tǒng)計(jì)數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
C#程序中類數(shù)量對(duì)程序啟動(dòng)的影響詳解
這篇文章主要給大家介紹了關(guān)于C#程序中類數(shù)量對(duì)程序啟動(dòng)的影響的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
C#正則表達(dá)式(Regex類)用法實(shí)例總結(jié)
正則表達(dá)式的主要作用是驗(yàn)證字符串的值是否滿足一定的規(guī)則,在頁(yè)面輸入數(shù)據(jù)驗(yàn)證方面的應(yīng)用比較多,下面這篇文章主要給大家介紹了關(guān)于C#正則表達(dá)式(Regex類)用法的相關(guān)資料,需要的朋友可以參考下2022-08-08
C#監(jiān)測(cè)IPv4v6網(wǎng)速及流量的實(shí)例代碼
這篇文章主要介紹了C#監(jiān)測(cè)IPv4v6網(wǎng)速及流量的實(shí)例代碼,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C#獲取兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)示例
本文介紹了使用C#獲取兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)的示例,大家參考使用吧2014-01-01
C#拼接SQL語(yǔ)句 用ROW_NUMBER實(shí)現(xiàn)的高效分頁(yè)排序
C#拼接SQL語(yǔ)句,SQL Server 2005+,多行多列大數(shù)據(jù)量情況下,使用ROW_NUMBER實(shí)現(xiàn)的高效分頁(yè)排序2012-05-05
C#多線程同步不同實(shí)現(xiàn)方式小結(jié)
本文主要介紹了C#多線程同步不同實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
C#中Byte[]和String之間轉(zhuǎn)換的方法
很多朋友不清楚如何在Byte[]和String之間進(jìn)行轉(zhuǎn)換?下面小編給大家?guī)砹薭yte與string轉(zhuǎn)換的方法,感興趣的朋友參考下吧2016-08-08

