国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#序列化與反序列化實例

2019-10-29 21:43:53
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C#序列化與反序列化的實現(xiàn)方法,實例分析了序列化與反序列化的原理與實現(xiàn)技巧,需要的朋友可以參考下
 

本文實例講述了C#序列化與反序列化的方法。分享給大家供大家參考。具體分析如下:

把“對象”轉(zhuǎn)換為“字節(jié)序列”的過程稱為對象的序列化。     把“字節(jié)序列”恢復為“對象”的過程稱為對象的反序列化。
序列化

復制代碼代碼如下:
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.IO;  
using System.Runtime.Serialization.Formatters.Binary;  
  
namespace 序列化與反序列化  
{  
    //序列化就是將對象轉(zhuǎn)換成二進制  
    //反序列化就是將二進制轉(zhuǎn)換成對象  
  
    //序列化與反序列化的作用就是:傳輸數(shù)據(jù)。   
    //我們在網(wǎng)絡中傳輸數(shù)據(jù)的時候只有二進制這個形態(tài)是可以被傳輸?shù)摹R簿褪钦f我們不管在網(wǎng)絡中傳輸什么內(nèi)容,都會先把你要傳輸?shù)膬?nèi)容序列化成二進制的數(shù)據(jù),對方接收到的同樣就是一個二進制的數(shù)據(jù),它需要再對這個二進制的數(shù)據(jù)進行反序列化成一個對象。  
  
    //我們要序列化一個類,第一步就要將類標記為可以被序列化的。用[Serializable]關(guān)鍵字。只有被[Serializable]標記的類創(chuàng)建出來的對象才能被序列化  
  
    [Serializable] //這個[Serializable]的作用是:指示一個類可以序列化。無法繼承此類。  
    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這個對象,傳輸給對方的電腦?,F(xiàn)在沒有對方的電腦,那我就在自己的電腦上模擬一下:現(xiàn)在通過一個流將p這個對象轉(zhuǎn)換成二進制,寫到我的桌面上。然后我們再將這個二進制文件在通過反序列化成一個對象  
            Person p = new Person("雪輝", 25, '女');  
            using (FileStream stream = new FileStream(@"C:/Users/凡斌/Desktop/11.txt", System.IO.FileMode.OpenOrCreate, FileAccess.Write))  
            {   
                //開始序列化對象。開始序列化對象需要一個類  
                BinaryFormatter bf = new BinaryFormatter();  
  
                //public void Serialize(Stream serializationStream, object graph); 這個Serialize方法的第一個參數(shù):是對象要序列化成的流文件,第二個參數(shù)是:要序列化的對象  
                bf.Serialize(stream, p);  
            }  
            Console.WriteLine("序列化完畢");  
        }  
    }  
}

 

反序列化

復制代碼代碼如下:
using System;  
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)在我們再將剛剛寫到桌面的二進制流文件11.txt通過反序列化成一個對象
            using (FileStream stream2 = new FileStream(@"C:/Users/凡斌/Desktop/11.txt", FileMode.Open, FileAccess.Read))  
            {  
                BinaryFormatter bf2 = new BinaryFormatter();  
  
                //public object Deserialize(Stream serializationStream);這個Deserialize方法的參數(shù)是:要反序列化的二進制流文件。它的返回值是一個object 所有我們要將這個object強轉(zhuǎn)成Person類型。  
                Person p2=(Person) bf2.Deserialize(stream2);  
  
                Console.WriteLine("方序列化成功");  
                Console.WriteLine(p2.Name); //輸出:雪輝  
                Console.ReadKey();  
            }  
        }  
    }  
}

 

序列化  
  
將此類的一個實例序列化為一個文件:  
【MyFile.bin  這個文件是把obj對象序列化后持久化存儲的文件】  

復制代碼代碼如下:
MyObject obj = new MyObject();   
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();

 

反序列化  
  
這里說的是將一個MyFile.bin文件通過反序列化,轉(zhuǎn)換成一個obj對象  
【filestream 讀取這個文件流,然后用.net的序列化器反序列化成對象】  

復制代碼代碼如下:
IFormatter formatter = new BinaryFormatter();   
Stream MyStream = new FileStream("MyFile.bin", FileMode.Open,   
FileAccess.Read, FileShare.Read);   
MyObject obj = (MyObject) formatter.Deserialize(MyStream);   
stream.Close();

 

xml

將此類的實例序列化成一個Xml文件  

復制代碼代碼如下:
XmlSerializer ser = new XmlSerializer(obj.GetType());    
ser.Serialize(new FileStream(@"users.xml", FileMode.Create), obj);

 

反序列化  

復制代碼代碼如下:
XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));
MyObject my=(MyObject)serializer.Deserialize(new FileStream(@"users.xml",FileMode.Open));

 

序列化DataTable

主要是為了實現(xiàn)下次啟動項目的時候能讀取上次保存的對象信息。通俗點就是把一個對象保存起來,在特別的時候在把這個還原出來。在C#中常見的序列化的方法主要也有三個:BinaryFormatter、SoapFormatter、XML序列化。今天涉及到的主要是XML序列化,就DataTable的內(nèi)容序列化保存。

復制代碼代碼如下:
/// <summary>  
/// 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]["設備ID"].ToString(),  
            dt.Rows[i]["序號"].ToString(),  
            dt.Rows[i]["設備名稱"].ToString(),  
            dt.Rows[i]["編號"].ToString(),  
            dt.Rows[i]["連接信息"].ToString(),  
            dt.Rows[i]["備注"].ToString(),  
            dt.Rows[i]["TagID"].ToString());  
    }  
}

 

希望本文所述對大家的C#程序設計有所幫助。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 抚顺市| 凉山| 德昌县| 铁力市| 云梦县| 鸡泽县| 平遥县| 贵南县| 新营市| 河曲县| 德庆县| 星座| 大余县| 富川| 崇信县| 鹤壁市| 会昌县| 柳河县| 东明县| 鹤峰县| 南宁市| 古田县| 瓦房店市| 陈巴尔虎旗| 刚察县| 塔河县| 巴南区| 辽宁省| 华阴市| 班玛县| 革吉县| 中山市| 读书| 江孜县| 抚州市| 淮北市| 中宁县| 五峰| 正阳县| 宁安市| 达州市|