本文實例講述了C#序列化與反序列化的方法。分享給大家供大家參考。具體分析如下:
把“對象”轉換為“字節序列”的過程稱為對象的序列化。 把“字節序列”恢復為“對象”的過程稱為對象的反序列化。
序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace 序列化與反序列化
{
//序列化就是將對象轉換成二進制
//反序列化就是將二進制轉換成對象
//序列化與反序列化的作用就是:傳輸數據。
//我們在網絡中傳輸數據的時候只有二進制這個形態是可以被傳輸的。也就是說我們不管在網絡中傳輸什么內容,都會先把你要傳輸的內容序列化成二進制的數據,對方接收到的同樣就是一個二進制的數據,它需要再對這個二進制的數據進行反序列化成一個對象。
//我們要序列化一個類,第一步就要將類標記為可以被序列化的。用[Serializable]關鍵字。只有被[Serializable]標記的類創建出來的對象才能被序列化
[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)
{
//現在我們要將p這個對象,傳輸給對方的電腦?,F在沒有對方的電腦,那我就在自己的電腦上模擬一下:現在通過一個流將p這個對象轉換成二進制,寫到我的桌面上。然后我們再將這個二進制文件在通過反序列化成一個對象
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方法的第一個參數:是對象要序列化成的流文件,第二個參數是:要序列化的對象
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)
{
//現在我們再將剛剛寫到桌面的二進制流文件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方法的參數是:要反序列化的二進制流文件。它的返回值是一個object 所有我們要將這個object強轉成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文件通過反序列化,轉換成一個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
主要是為了實現下次啟動項目的時候能讀取上次保存的對象信息。通俗點就是把一個對象保存起來,在特別的時候在把這個還原出來。在C#中常見的序列化的方法主要也有三個:BinaryFormatter、SoapFormatter、XML序列化。今天涉及到的主要是XML序列化,就DataTable的內容序列化保存。
/// <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#程序設計有所幫助。