天天看點

序列化與反序列化,及Json序列化反序列化

序列化是将對象狀态轉換為可保持或可傳輸的格式的過程,反序列化則過程相反。用于存儲和傳輸資料。

(一)asp.net序列化與反序列化

.net提供多種序列化類

(1)BinaryFormatter 類

名字空間:System.Runtime.Serialization.Formatters.Binary

這個類用于以二進制格式将對象或整個連接配接對象圖形序列化和反序列化

構造器兩個:

BinaryFormatter()

BinaryFormatter(ISurrogateSelector, StreamingContext)

介紹它的兩個主要方法:

1 Serialize方法

将對象或連接配接對象圖形序列化為給定流

它有兩個重載:

Serialize(Stream, Object)

Serialize(Stream, Object,Header[])

類Customer

public class Customer

{

    public int Unid { get; set; }

    public string Name { get; set; }

    public string Call { get; set; }

}

下邊通過示例來測試序列化方法Serialize

public void TestSerialize()

    Customer customer = new Customer {Unid=1,Name="宋江",Call="89589689" };

    FileStream fs = new FileStream("test.dat", FileMode.Create); 

    BinaryFormatter formatter = new BinaryFormatter();

    try

    {

        formatter.Serialize(fs, customer);

    }

    catch

    { }

    finally

        fs.Close();

測試時,這個會抛出異常:類型“SerializeTest.Customer”未标記為可序列化。是以要在Customer類上添加修飾标簽

[Serializable]

測試,在bin\debug檔案夾中可以看到test.dat檔案。

2 Deserialize方法

将流反序列化為對象圖形,它也有兩個重載

Deserialize(Stream) 

Deserialize(Stream, HeaderHandler)

通過示例來測試從流進行反序列化

public void TestDeserialize()

    Customer customer = new Customer();

    FileStream fs = new FileStream("test.dat", FileMode.Open);

    customer= formatter.Deserialize(fs) as Customer;

    fs.Close();

    Console.WriteLine(customer.Name);

結果輸出:宋江

(2)SoapFormatter類

名字空間:System.Runtime.Serialization.Formatters.Soap

以 SOAP 格式将對象或整個連接配接對象的圖形序列化和反序列化。

SOAP就是simple object access protocol的縮寫,簡單對象傳輸協定。是一種輕量的,簡單的,基于xml的協定。

這個要添加對System.Runtime.Serialization.Formatters.Soap.dll的引用

構造器:

SoapFormatter xx=new  SoapFormatter()

SoapFormatter(ISurrogateSelector, StreamingContext)

主要介紹其中2個方法

Serialize(Stream, Object) 

Serialize(Stream, Object, Header[]

public void TestSoapSerialize()

    Customer customer = new Customer { Unid = 1, Name = "宋江", Call = "89589689" };

    FileStream fs = new FileStream("soaptest.dat", FileMode.Create);

    SoapFormatter formatter = new SoapFormatter();

打開bin\debug中的soaptest.dat檔案,這就是soap格式。

反序列化soap格式

其它的不多說了。

public void TestSoapDeserialize()

    FileStream fs = new FileStream("soaptest.dat", FileMode.Open);

    customer = formatter.Deserialize(fs) as Customer;

(3)XmlSerializer類

将對象序列化到 XML 文檔中和從 XML 文檔中反序列化對象

名字空間:System.Xml.Serialization

構造方法太多,不列舉了,可以參考幫助

拿出一個來說:

public void Serialize(XmlWriter xmlWriter,Object o)

public void TestXmlSerialize()

    FileStream fs = new FileStream("xmltest.xml", FileMode.Create);

    XmlSerializer formatter = new XmlSerializer(typeof(Customer));

    formatter.Serialize(fs, customer);

結果可以到debug\bin裡檢視。

public void TestXmlDeserialize()

    FileStream fs = new FileStream("xmltest.xml", FileMode.Open);

(二)Json序列化與反序列化

Json相關可見:

<a href="http://www.cnblogs.com/jams742003/category/225387.html" target="_blank">http://www.cnblogs.com/jams742003/category/225387.html</a>

Json序列化和反序列化指的是:對象序列化為JSON,并可用于從 JSON 反序列化對象

在.net 3.5中

名字空間:System.Runtime.Serialization.Json

但程式集是: System.ServiceModel.Web.dll

(1)DataContractJsonSerializer類

構造方法很多。

介紹這個類其中2個方法:

1 WriteObject方法

有好種重載,這裡測試一個:

public override void WriteObject(Stream stream,Object graph)

測試:

public void TestJsonSerialize()

    DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(Customer)); 

    FileStream fs = new FileStream("json.txt", FileMode.Create);

    ds.WriteObject(fs, customer);

進行Json序列化時,類型不必添加修飾标簽

在bin\debug裡可以看到json串。

有關json串請見:

<a href="http://www.cnblogs.com/jams742003/archive/2009/12/29/1634764.html" target="_blank">http://www.cnblogs.com/jams742003/archive/2009/12/29/1634764.html</a>

2 ReadObject方法

重載很多。

public override Object ReadObject(Stream stream)

public void TestJsonDeserialize()

    DataContractJsonSerializer ds = 

        new DataContractJsonSerializer(typeof(Customer)); 

    FileStream fs = new FileStream("json.txt", FileMode.Open);

    var cc = ds.ReadObject(fs);

(2)JavaScriptSerializer類

為啟用 AFAX 的應用程式提供序列化和反序列化功能

名字空間:System.Web.Script.Serialization

程式集:System.Web.Extensions(在 System.Web.Extensions.dll 中)

說其中2個方法

Serialize(Object)

Serialize(Object, StringBuilder)

public void TestJsSerialize()

    JavaScriptSerializer js = new JavaScriptSerializer(); 

    Console.WriteLine(js.Serialize(customer));

輸出串:{"Unid":1,"Name":"宋江","Call":"89589689"}

public void TestJsDeserialize()

    string str = File.ReadAllText("jsjson.txt");

    JavaScriptSerializer js = new JavaScriptSerializer();

    Customer customer = js.Deserialize&lt;Customer&gt;(str); 

(3)Json.net

這是一個第三方工具

名字空間:Newtonsoft.Json

添加Newtonsoft.Json.dll程式集

其中2個方法:

1 SerializeObject方法

public void TestJsonnetSerialize()

    string strJson=JsonConvert.SerializeObject(customer);

    StreamWriter sw = File.CreateText("jsonnet.txt");

    sw.Write(strJson);

    sw.Close();

2 DeserializeObject方法

public void TestJsonnetDeserialize()

    string str = File.ReadAllText("jsonnet.txt");

    Customer customer = JsonConvert.DeserializeObject&lt;Customer&gt;(str);

更多關于json.net的請見:

<a href="http://www.cnblogs.com/jams742003/archive/2009/11/04/1595737.html" target="_blank">http://www.cnblogs.com/jams742003/archive/2009/11/04/1595737.html</a>

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園