c#序列化和反序列化
序列化就是是將物件轉換為容易傳輸的格式的過程,一般情況下轉化打流檔案,放入記憶體或者IO檔案 中。例如,可以序列化一個物件,然後使用 HTTP 通過 Internet 在客戶端和伺服器之間傳輸該物件,或者和其它應用程式共享使用。反之,反序列化根據流重新構造物件。
一、序列化的方式
1)二進位制序列化:是一種將資料寫到輸出流,以使它能夠用來自動重構成相應物件的機制。二進位制,其名字就暗示它的必要資訊是儲存在儲存介質上,而這些必要資訊要求建立一個物件的精確的二進位制副本。在二進位制(流)序列化中,整個物件的狀態都被儲存起來,而XML序列化只有部分資料被儲存起來。
stringstrobj = "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序列化
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);