C# 三種序列化方法分享
序列化是將一個(gè)對(duì)象轉(zhuǎn)換成字節(jié)流以達(dá)到將其長(zhǎng)期保存在內(nèi)存、數(shù)據(jù)庫(kù)或文件中的處理過(guò)程。它的主要目的是保存對(duì)象的狀態(tài)以便以后需要的時(shí)候使用。與其相反的過(guò)程叫做反序列化。
序列化一個(gè)對(duì)象
為了序列化一個(gè)對(duì)象,我們需要一個(gè)被序列化的對(duì)象,一個(gè)容納被序列化了的對(duì)象的(字節(jié))流和一個(gè)格式化器。進(jìn)行序列化之前我們先看看System.Runtime.Serialization名字空間。ISerializable接口允許我們使任何類(lèi)成為可序列化的類(lèi)。
如果我們給自己寫(xiě)的類(lèi)標(biāo)識(shí)[Serializable]特性,我們就能將這些類(lèi)序列化。除非類(lèi)的成員標(biāo)記了[NonSerializable],序列化會(huì)將類(lèi)中的所有成員都序列化。
序列化的類(lèi)型
•二進(jìn)制(流)序列化
•SOAP序列化
•XML序列化
二進(jìn)制(流)序列化:
二進(jìn)制(流)序列化是一種將數(shù)據(jù)寫(xiě)到輸出流,以使它能夠用來(lái)自動(dòng)重構(gòu)成相應(yīng)對(duì)象的機(jī)制。二進(jìn)制,其名字就暗示它的必要信息是保存在存儲(chǔ)介質(zhì)上,而這些必要信息要求創(chuàng)建一個(gè)對(duì)象的精確的二進(jìn)制副本。在二進(jìn)制(流)序列化中,整個(gè)對(duì)象的狀態(tài)都被保存起來(lái),而XML序列化只有部分?jǐn)?shù)據(jù)被保存起來(lái)。為了使用序列化,我們需要引入System.Runtime.Serialization.Formatters.Binary名字空間. 下面的代碼使用BinaryFormatter類(lèi)序列化.NET中的string類(lèi)型的對(duì)象。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace SerializationTest
{
class Program
{
static void Main(string[] args)
{
//Serialization of String Object
string strobj = "test string for serialization";
FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,
FileShare.None);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, strobj);
stream.Close();
//Deserialization of String Object
FileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,
FileShare.Read );
string readdata = (string)formatter.Deserialize(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();
}
}
}
SOAP序列化:
SOAP協(xié)議是一個(gè)在異構(gòu)的應(yīng)用程序之間進(jìn)行信息交互的理想的選擇。我們需要在應(yīng)用程序中添加System.Runtime.Serialization.Formatters.Soap名字空間以便在.Net中使用SOAP序列化。SOAP序列化的主要優(yōu)勢(shì)在于可移植性。SoapFormatter把對(duì)象序列化成SOAP消息或解析SOAP消息并重構(gòu)被序列化的對(duì)象。下面的代碼在.Net中使用SoapFormatter類(lèi)序列化string類(lèi)的對(duì)象。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap ;
namespace SerializationTest
{
class Program
{
static void Main(string[] args)
{
//Serialization of String Object
string strobj = "test string for serialization";
FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,
FileShare.None);
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(stream, strobj);
stream.Close();
//Deserialization of String Object
FileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,
FileShare.Read );
string readdata = (string)formatter.Deserialize(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();
}
}
}
XML序列化:
根據(jù)MSDN的描述,“XML序列化將一個(gè)對(duì)象或參數(shù)的公開(kāi)字段和屬性以及方法的返回值轉(zhuǎn)換(序列化)成遵循XSD文檔標(biāo)準(zhǔn)的XML流。因?yàn)閄ML是一個(gè)開(kāi)放的標(biāo)準(zhǔn),XML能被任何需要的程序處理,而不管在什么平臺(tái)下,因此XML序列化被用到帶有公開(kāi)的屬性和字段的強(qiáng)類(lèi)型類(lèi)中,它的這些發(fā)生和字段被轉(zhuǎn)換成序列化的格式(在這里是XML)存儲(chǔ)或傳輸。”
我們必須添加System.XML.Serialization引用以使用XML序列化。使用XML序列化的基礎(chǔ)是XmlSerializer。下面的代碼是在.Net中使用XmlSerializer類(lèi)序列化string對(duì)象。
using System;
using System.IO;
using System.Xml.Serialization;
namespace SerializationTest
{
class Program
{
static void Main(string[] args)
{
//Serialization of String Object
string strobj = "test string for serialization";
FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,
FileShare.None);
XmlSerializer xmlserializer = new XmlSerializer(typeof(string));
xmlserializer.Serialize(stream, strobj);
stream.Close();
//Deserialization of String Object
FileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,
FileShare.Read );
string readdata = (string)xmlserializer.Deserialize(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();
}
}
}
什么是格式化器?
一個(gè)格式化器用來(lái)確定一個(gè)對(duì)象的序列格式。它們目的是在網(wǎng)絡(luò)上傳輸一個(gè)對(duì)象之前將其序列化成合適的格式。它們提供IFormatter接口。在.NET里提供了兩個(gè)格式化類(lèi):BinaryFormatter和SoapFormatter,它們都繼承了IFormatter接口。
使用序列化
序列化允許開(kāi)發(fā)人員保存一個(gè)對(duì)象的狀態(tài)并在需要的時(shí)候重構(gòu)對(duì)象,同時(shí)很好地支持對(duì)象存儲(chǔ)和數(shù)據(jù)交換。通過(guò)序列化,開(kāi)發(fā)人員可以利用Web Service發(fā)送對(duì)象到遠(yuǎn)端應(yīng)用程序,從一個(gè)域傳輸對(duì)象到另一個(gè)域,以XML的格式傳輸一個(gè)對(duì)象并能通過(guò)防火墻,或者在應(yīng)用程序間保持安全性或用戶(hù)特定信息等等。
相關(guān)文章
C#中Timer定時(shí)器類(lèi)的簡(jiǎn)單使用
定時(shí)器就是經(jīng)過(guò)固定時(shí)間,執(zhí)行固定任務(wù),本文主要介紹了C#中Timer定時(shí)器類(lèi)的簡(jiǎn)單使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
C# Winform 調(diào)用系統(tǒng)接口操作 INI 配置文件的代碼
封裝了一小段代碼, 調(diào)用系統(tǒng)接口, 操作配置文件. 一般用于 .ini 文件, 或者其它鍵值對(duì)格式的配置文件2011-05-05
c#保存窗口位置大小操作類(lèi)(序列化和文件讀寫(xiě)功能)
這篇文章主要介紹了c#保存窗口位置大小操作類(lèi),其實(shí)就是把序列化和文件讀寫(xiě)合到一塊,大家參考使用2013-11-11
C#實(shí)現(xiàn)的自定義郵件發(fā)送類(lèi)完整實(shí)例(支持多人多附件)
這篇文章主要介紹了C#實(shí)現(xiàn)的自定義郵件發(fā)送類(lèi),具有支持多人多附件的功能,涉及C#郵件操作的相關(guān)技巧,需要的朋友可以參考下2015-12-12
解析C#設(shè)計(jì)模式編程中備忘錄模式的運(yùn)用
這篇文章主要介紹了C#設(shè)計(jì)模式編程中備忘錄模式的運(yùn)用,備忘錄模式用來(lái)保存與對(duì)象有關(guān)的數(shù)據(jù)用以在將來(lái)對(duì)對(duì)象進(jìn)行復(fù)原,需要的朋友可以參考下2016-02-02
C#中三種Timer計(jì)時(shí)器的詳細(xì)用法
這篇文章介紹了C#中三種Timer計(jì)時(shí)器的詳細(xì)用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

