成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#序列化和反序列化是什么

本篇內(nèi)容介紹了“C#序列化和反序列化是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、訥河ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的訥河網(wǎng)站制作公司

C#序列化和反序列化,兩者的程序處理方式基本一致,都是基于工廠模式的,所謂C#序列化就是是將對象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^程,一般情況下轉(zhuǎn)化打流文件,放入內(nèi)存或者IO文件中。例如,可以序列化一個對象,然后使用 HTTP 通過 Internet 在客戶端和服務(wù)器之間傳輸該對象,或者和其它應(yīng)用程序共享使用。相反的,反序列化根據(jù)流重新構(gòu)造對象。.NET自帶的有兩種序列化對象的方式,Xml和binary的,XML 序列化不轉(zhuǎn)換方法、索引器、私有字段或只讀屬性(只讀集合除外)。要序列化對象的所有字段和屬性(公共的和私有的),請使用 BinaryFormatter,而不要使用 XML 序列化。

C#序列化和反序列化的實例應(yīng)用剖析:

二進(jìn)制的C#序列化的方式:

例如我們有個對象:

[Serializable]public class ClassToSerialize{  public int id=100;  public string name="Name";  }

需要序列化該對象,必須在給該類加上Serializable的屬性,然后創(chuàng)建一個序列化寫入的流:FileStream fileStream = new FileStream("temp.dat", FileMode.Create);然后創(chuàng)建二進(jìn)制格式器:BinaryFormatter b=new BinaryFormatter();然后是序列化:b.Serialize(fileStream,c);,然后關(guān)閉保存流。(可以見下面的例子)

讀取一個已經(jīng)被序列化的對象的時候:操作方式一樣,只是

FileStream fileStream = new FileStream(  "temp.dat", FileMode.Open,   FileAccess.Read, FileShare.Read);  ClassToSerialize c =  (ClassToSerialize)b.Deserialize(fileStream);

然后就可以讀取了,完整的例子是:

using System;  using System.IO;  using System.Runtime.Serialization;  using System.Runtime.Serialization.Formatters.Binary;  public class SerialTest{  public void SerializeNow(){  ClassToSerialize c=new ClassToSerialize();  FileStream fileStream = new FileStream(  "temp.dat", FileMode.Create);   BinaryFormatter b=new BinaryFormatter();  b.Serialize(fileStream,c);  fileStream.Close();  }  public void DeSerializeNow(){  ClassToSerialize c=new ClassToSerialize();  FileStream fileStream = new FileStream(  "temp.dat", FileMode.Open,   FileAccess.Read,   FileShare.Read);  BinaryFormatter b=new BinaryFormatter();  //SoapFormatter  c=(ClassToSerialize)b.Deserialize(fileStream);  Console.WriteLine(c.name);  fileStream.Close();  }  public static void Main(string[] s){  SerialTest st=new SerialTest();  st.SerializeNow();  st.DeSerializeNow();  }  }  [Serializable]  public class ClassToSerialize{  public int id=100;  public string name="Name";  }

這就是自帶的序列化和反序列的操作,但是,很多情況下,一個對象比較大,而且很多私有的屬性和方法我們不需要,例如在原型模式里面序列化的話,只需要序列Clone方法和一些屬性,私有的方法無需要,還例如在讀取大規(guī)模的IO的時候,讀取操作完全不需要... 這時候就需要自己集成重寫序列的ISerializable接口:

實現(xiàn)該接口需要兩個注意的,一個就是構(gòu)造函數(shù),主要是為了反序列,另一個就是GetObjectData,主要是執(zhí)行序列化,例如我們現(xiàn)在有一個Employee類需要序列化

[Serializable()]  //Set this attribute to all the classes that want to serialize  public class Employee : ISerializable   //derive your class from ISerializable {  public int EmpId;  public string EmpName;  [NonSerialized()]  public string NoSerialString="NoSerialString-Test";   }

需要注意的是我這里的NoSerialString屬性前面有[NonSerialized()],就是說默認(rèn)并不序列化這個屬性,而是使用默認(rèn)值 。

首先是構(gòu)造函數(shù):

public Employee(SerializationInfo info, StreamingContext ctxt)  {  EmpId = (int)info.GetValue(  "EmployeeId", typeof(int));  EmpName = (String)info.GetValue(  "EmployeeName", typeof(string));  //NoSerialString =   //(String)info.GetValue("NoSerialString", typeof(string));  }

然后是C#序列化方法,就是當(dāng)寫入流的時候怎么保存的:

public void GetObjectData(SerializationInfo info, StreamingContext ctxt)  {  //You can use any custom name for your name-value pair.  // But make sure you  // read the values with the same name.  //For ex:- If you write EmpId as "EmployeeId"  // then you should read the same with "EmployeeId"  info.AddValue("EmployeeId", EmpId);  info.AddValue("EmployeeName", EmpName);  }

把上面兩個方法寫入到Employee類,然后寫個測試的程序:

public class ObjSerial{  public static void Main(String[] args){  Employee mp = new Employee();  mp.EmpId = 10;  mp.EmpName = "Omkumar";  mp.NoSerialString = "你好啊";      //C#序列化和反序列化之序列化  Stream stream = File.Open("EmployeeInfo.osl", FileMode.Create);  BinaryFormatter bformatter = new BinaryFormatter();   Console.WriteLine("Writing Employee Information");  bformatter.Serialize(stream, mp);  stream.Close();    mp = null;     //C#序列化和反序列化之反序列  stream = File.Open("EmployeeInfo.osl", FileMode.Open);  bformatter = new BinaryFormatter();   Console.WriteLine("Reading Employee Information");  mp = (Employee)bformatter.Deserialize(stream);  stream.Close();   Console.WriteLine(  "Employee Id: {0}",mp.EmpId.ToString());  Console.WriteLine(  "Employee Name: {0}",mp.EmpName);  Console.WriteLine(  "Employee NoSerialString: {0}",mp.NoSerialString);   }  }

C#序列化和反序列化程序執(zhí)行的結(jié)果是:

Writing Employee Information  Reading Employee Information  Employee Id: 10  Employee Name: Omkumar  Employee NoSerialString: NoSerialString-Test

看到Employee NoSerialString:屬性的值沒有,它保持默認(rèn)值,沒有序列化。

“C#序列化和反序列化是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

當(dāng)前名稱:C#序列化和反序列化是什么
文章鏈接:http://jinyejixie.com/article26/psppjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、手機(jī)網(wǎng)站建設(shè)、外貿(mào)建站、網(wǎng)站營銷、自適應(yīng)網(wǎng)站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
酉阳| 利津县| 连州市| 揭西县| 梨树县| 宁明县| 扎囊县| 武强县| 临漳县| 车险| 长武县| 沾化县| 康平县| 弥勒县| 襄樊市| 武清区| 三亚市| 永和县| 揭阳市| 咸阳市| 藁城市| 阿鲁科尔沁旗| 通化市| 南漳县| 罗山县| 黄平县| 得荣县| 中超| 郓城县| 丹寨县| 潮安县| 龙门县| 金阳县| 梁平县| 邹平县| 芜湖市| 伊金霍洛旗| 分宜县| 乌海市| 城口县| 磐安县|