C#中的"序列化" Serializable 理解
比如用一個類描述一張合同,而這個類實例化後其中的字段保存着合同的信息,如果現在要把這個類的實例發送到另一臺機器、另一個窗體或是想保存這個類以便以後再取出來用(持久化對象),可以對這個類進行序列化(序列化實際上是一個信息流),傳送或保存,用的時候再反序列化重新生成這個對象
爲什麼您想要使用序列化?有兩個最重要的原因促使對序列化的使用:一個原因是將對象的狀態保持在存儲媒體中,以便可以在以後重新創建精確的副本;另一個原因是通過值將對象從一個應用程序域發送到另一個應用程序域中。例如,序列化可用於在 ASP.NET 中保存會話狀態並將對象複製到 Windows 窗體的剪貼板中。遠程處理還可以使用序列化通過值將對象從一個應用程序域傳遞到另一個應用程序域中。
序列化的是對象的狀態
也就是對象數據成員的值和方法是沒有關係的
跨應用程序域通信時,要用到序列化
以及用WEB服務時
一:BinaryFormatter序列化
序列化簡單點來理解就是把內存的東西寫到硬盤中,當然也可以寫到內存中(這個內容我會在後面寫一個例子).而反序列化就是從硬盤中把信息讀到內存中.就這麼簡單,呵呵,現在來看下面的例子吧!
在這篇文章中我將使用BinaryFormatter序列化類Book作爲例子,希望大家能從例子中深刻體會什麼是序列化.
定義類Book:
[Serializable]
public class Book
{
string name;
float price;
string author;
public Book(string bookname, float bookprice, string bookauthor)
{
name = bookname;
price = bookprice;
author = bookauthor;
}
}
在類的上面增加了屬性:Serializable.(如果不加這個屬性,將拋出SerializationException異常).
通過這個屬性將Book標誌爲可以序列化的.當然也有另一種方式使類Book可以序列化,那就是實行ISerializable接口了.在這裏大家要注意了:Serializable屬性是不能被繼承的咯!!!
如果你不想序列化某個變量,該怎麼處理呢?很簡單,在其前面加上屬性[NonSerialized] .比如我不想序列化
string author;
那我只需要
[NonSerialized]
string author;
好了,現在就告訴大家怎麼實現序列化:
我們使用namespace:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
首先創建Book實例,like this:
Book book = new Book("Day and Night", 30.0f, "Bruce");
接着當然要創建一個文件了,這個文件就是用來存放我們要序列化的信息了.
FileStream fs = new FileStream(@"C:\book.dat", FileMode.Create);
序列化的實現也很簡單,like this:
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, book);
很簡單吧!現在我列出整個原代碼,包括反序列化.
static void Main(string[] args)
{
Book book = new Book("Day and Night", 30.0f, "Bruce");
using(FileStream fs = new FileStream(@"C:\book.dat", FileMode.Create))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, book);
}
book = null;
using(FileStream fs = new FileStream(@"C:\book.dat", FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
book = (Book)formatter.Deserialize(fs);//在這裏大家要注意咯,他的返回值是object
}
}
序列化(Serialization)是.NET平臺最酷的特性之一。 1、爲什麼要序列化: 首先你應該明白系列化的目的就不難理解他了。系列化的目的就是能在網絡上傳輸對象,否則就無法實現面向對象的分佈式計算。比如你的客戶端要調用服務器上的一個方法獲得一個產品對象,比如方法爲:public Product findProduct(int product_id); 注意該方法返回一個Product對象,如果沒有系列化技術,客戶端就收不到返回的對象Product。而序列化的實現就是把對象變成一個可在網絡上傳輸的字節流。 2、利用序列化技術,可以實現對象的備份和還原。序列化可以將內存中的對象(或對象圖)序列化爲數據流,並保存到磁盤上進行持久化;還可以將數據流反序列化爲對象,實現對象的還原。序列化技術在分佈式系統的數據傳輸中得到充分的利用,如:XML Web Service 利用XML序列化實現跨平臺,.NET Remoting 則用到了二進制序列化和SOAP序列化。 .NET Compact Framework 2.0 支持XML序列化,不支持二進制序列化和SOAP序列化。而 .NET Compact Framework 1.0 連XML序列化都不支持。不過 OpenNETCF 1.x 爲 .NET CF 1.0 實現了一個XML序列化的類,這個類在 OpenNETCF.Xml.dll 程序集中可以找到。 序列化和反序列化用於將一個對象保存到文件,和從文件讀取。 using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable()]//可以序列化的類需要用這個屬性標記 public class ToBeSerialized { public int a; public string b; public ToBeSerialized(int a,string b) { this.a=a; this.b=b; } } public class Test { public void Serialize()//序列化 { ToBeSerialized tbs = new ToBeSerialized(22,"SOM"); Stream fs = File.Create("Serialized.txt"); BinaryFormatter serializer = new BinaryFormatter(); serializer.Serialize(fs, tbs); fs.Close(); } public void DeSerialize()//反序列化 { ToBeSerialized restore; Stream fs = File.OpenRead("Serialized.txt"); BinaryFormatter deserializer = new BinaryFormatter(); restore = (ToBeSerialized)(deserializer.Deserialize(fs));//反序列化得到的對象 fs.Close(); } }