1. 程式人生 > >c#序列化和反序列化

c#序列化和反序列化

序列化就是是將物件轉換為容易傳輸的格式的過程,一般情況下轉化打流檔案,放入記憶體或者IO檔案 中。例如,可以序列化一個物件,然後使用 HTTP 通過 Internet 在客戶端和伺服器之間傳輸該物件,或者和其它應用程式共享使用。反之,反序列化根據流重新構造物件。  

一、序列化的方式

1)二進位制序列化:是一種將資料寫到輸出流,以使它能夠用來自動重構成相應物件的機制。二進位制,其名字就暗示它的必要資訊是儲存在儲存介質上,而這些必要資訊要求建立一個物件的精確的二進位制副本。在二進位制(流)序列化中,整個物件的狀態都被儲存起來,而XML序列化只有部分資料被儲存起來。

string
strobj = "serialization"; FileStream stream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt", FileMode.Create, FileAccess.Write,FileShare.None); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, strobj); stream.Close(); FileStream readstream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt
", FileMode.Open, FileAccess.Read, FileShare.Read); string readdata = (string)formatter.Deserialize(readstream); readstream.Close(); Console.WriteLine(readdata); Console.ReadLine();

2)SOAP協議是一個在異構的應用程式之間進行資訊互動的理想的選擇。我們需要在應用程式中新增System.Runtime.Serialization.Formatters.Soap名字空間以便在.Net中使用SOAP序列化SOAP序列化

的主要優勢在於可移植性。SoapFormatter把物件序列化成SOAP訊息或解析SOAP訊息並重構被序列化的物件。

string strobj = "serialization";
FileStream stream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt", FileMode.Create, FileAccess.Write ,FileShare.None);
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(stream, strobj);
stream.Close();

FileStream readstream = new FileStream("C:\\Users\\JingWang\\Desktop\\11.txt", FileMode.Open , FileAccess.Read ,
FileShare.Read );
string readdata = (string)formatter.Deserialize(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();

3)XML序列化:將一個物件或引數的公開欄位和屬性以及方法的返回值轉換(序列化)成遵循XSD文件標準的XML流。因為XML是一個開放的標準,XML能被任何需要的程式處理,而不管在什麼平臺下,因此XML序列化被用到帶有公開的屬性和欄位的強型別類中,它的這些發生和欄位被轉換成序列化的格式(在這裡是XML)儲存或傳輸。”新增System.XML.Serialization引用以使用XML序列化。使用XML序列化的基礎是XmlSerializer

string strobj = "test string for serialization";
FileStream stream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt", FileMode.Create, FileAccess.Write ,FileShare.None);
XmlSerializer  xmlserializer = new XmlSerializer(typeof(string));
xmlserializer.Serialize(stream, strobj);
stream.Close();


FileStream readstream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt", FileMode.Open , FileAccess.Read ,FileShare.Read );
string readdata = (string)xmlserializer.Deserialize(readstream);
Console.WriteLine(readdata);
Console.ReadLine();

4)Json序列化:

string strobj = "test string for serialization";
FileStream stream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt", FileMode.Create, FileAccess.Write,FileShare.None);
DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(string));
formatter.WriteObject(stream, strobj);
stream.Close();

FileStream readstream = new FileStream("C:\\Users\\Jing\\Desktop\\11.txt", FileMode.Open, FileAccess.Read,FileShare.Read);
string readdata = (string)formatter.ReadObject(readstream);
readstream.Close();
Console.WriteLine(readdata);
Console.ReadLine();

在C#中,如果想要進行自定義類的序列化,只需要簡單地在定義類的時候新增Serializable標籤即可。除非類的成員標記了[NonSerializable],序列化會將類中的所有成員都序列化。

[Serializable]
public class Person
{
    public string name;
    public int age;
}

二、.NET物件和JSON物件之間的轉化-JSON.NET

使用JSONSerializer可以非常方便的實現.NET物件與Json資料之間的轉化,JSONSerializer會把.NET物件的屬性名轉化為Json資料中的Key,把物件的屬性值轉化為Json資料中的value。

示例:

Product product = new Product();
product.Name = "Apple";
product.Price = 3.99M;
var deserialize= JsonConvert.DeserializeObject<Product>(urlToJson);
var serialize= JsonConvert.SerializeObject(Product);