乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深入C#學(xué)習(xí)系列一:序列化(Serialize)、反序列化(Deserialize)

       franklinfj 2013-04-29
      深入C#學(xué)習(xí)系列一:序列化(Serialize)、反序列化(Deserialize)
      序列化又稱串行化,是.NET運(yùn)行時(shí)環(huán)境用來(lái)支持用戶定義類型的流化的機(jī)制。其目的是以某種存儲(chǔ)形成使自定義對(duì)象持久化,或者將這種對(duì)象從一個(gè)地方傳輸?shù)搅硪粋€(gè)地方。
      .NET框架提供了兩種串行化的方式:1、是使用BinaryFormatter進(jìn)行串行化;2、使用SoapFormatter進(jìn)行串行化;3、使用XmlSerializer進(jìn)行串行化。第一種方式提供了一個(gè)簡(jiǎn)單的二進(jìn)制數(shù)據(jù)流以及某些附加的類型信息,而第二種將數(shù)據(jù)流格式化為XML存儲(chǔ);第三種其實(shí)和第二種差不多也是XML的格式存儲(chǔ),只不過(guò)比第二種的XML格式要簡(jiǎn)化很多(去掉了SOAP特有的額外信息)。
      可以使用[Serializable]屬性將類標(biāo)志為可序列化的。如果某個(gè)類的元素不想被序列化,1、2可以使用[NonSerialized]屬性來(lái)標(biāo)志,2、可以使用[XmlIgnore]來(lái)標(biāo)志。
      1、使用BinaryFormatter進(jìn)行串行化
      下面是一個(gè)可串行化的類:
      using System;
      using
      System.Data;
      using
      System.Configuration;
      using
      System.Web;
      using
      System.Web.Security;
      using
      System.Web.UI;
      using
      System.Web.UI.WebControls;
      using
      System.Web.UI.WebControls.WebParts;
      using
      System.Web.UI.HtmlControls;
      using
      System.IO;
      using
      System.Runtime.Serialization.Formatters.Binary;
      /// <summary>
      /// ClassToSerialize 的摘要說(shuō)明
      /// </summary>

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


      下面是串行化和反串行化的方法:
      public void SerializeNow()
      {
      ClassToSerialize c
      = new
      ClassToSerialize();
      FileStream fileStream
      = new FileStream("c:\\temp.dat"
      , FileMode.Create);
      BinaryFormatter b
      = new
      BinaryFormatter();
      b.Serialize(fileStream, c);
      fileStream.Close();
      }

      public void DeSerializeNow()
      {
      ClassToSerialize c
      = new
      ClassToSerialize();
      c.Sex
      = "kkkk"
      ;
      FileStream fileStream
      = new FileStream("c:\\temp.dat"
      , FileMode.Open, FileAccess.Read, FileShare.Read);
      BinaryFormatter b
      = new
      BinaryFormatter();
      c
      = b.Deserialize(fileStream) as
      ClassToSerialize;
      Response.Write(c.name);
      Response.Write(c.Sex);
      fileStream.Close();
      }

      調(diào)用上述兩個(gè)方法就可以看到串行化的結(jié)果:Sex屬性因?yàn)楸粯?biāo)志為[NonSerialized],故其值總是為null。
      2、使用SoapFormatter進(jìn)行串行化
      和BinaryFormatter類似,我們只需要做一下簡(jiǎn)單修改即可:
      a.將using語(yǔ)句中的.Formatter.Binary改為.Formatter.Soap;
      b.將所有的BinaryFormatter替換為SoapFormatter.
      c.確保報(bào)存文件的擴(kuò)展名為.xml
      經(jīng)過(guò)上面簡(jiǎn)單改動(dòng),即可實(shí)現(xiàn)SoapFormatter的串行化,這時(shí)候產(chǎn)生的文件就是一個(gè)xml格式的文件。
      3、使用XmlSerializer進(jìn)行串行化
      關(guān)于格式化器還有一個(gè)問(wèn)題,假設(shè)我們需要XML,但是不想要SOAP特有的額外信息,那么我們應(yīng)該怎么辦呢?有兩中方案:要么編寫一個(gè)實(shí)現(xiàn)IFormatter接口的類,采用的方式類似于SoapFormatter類,但是沒(méi)有你不需要的信息;要么使用庫(kù)類XmlSerializer,這個(gè)類不使用Serializable屬性,但是它提供了類似的功能。
      如果我們不想使用主流的串行化機(jī)制,而想使用XmlSeralizer進(jìn)行串行化我們需要做一下修改:
      a.添加System.Xml.Serialization命名空間。
      b.Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行為與NoSerialized類似。
      c.XmlSeralizer要求類有個(gè)默認(rèn)的構(gòu)造器,這個(gè)條件可能已經(jīng)滿足了。
      下面看示例:
      要序列化的類:
      using System;
      using
      System.Data;
      using
      System.Configuration;
      using
      System.Web;
      using
      System.Web.Security;
      using
      System.Web.UI;
      using
      System.Web.UI.WebControls;
      using
      System.Web.UI.WebControls.WebParts;
      using
      System.Web.UI.HtmlControls;
      using
      System.Xml.Serialization;
      [Serializable]
      public class
      Person
      {
      private string
      name;
      public string
      Name
      {
      get

      {
      return
      name;
      }

      set
      {
      name
      =
      value;
      }

      }



      public string Sex;
      public int Age = 31
      ;
      public
      Course[] Courses;

      public
      Person()
      {
      }

      public Person(string Name)
      {
      name
      =
      Name;
      Sex
      = ""
      ;
      }

      }

      [Serializable]
      public class Course
      {
      public string
      Name;
      [XmlIgnore]
      public string
      Description;
      public
      Course()
      {
      }

      public Course(string name, string description)
      {
      Name
      =
      name;
      Description
      =
      description;
      }

      }


      序列化和反序列化方法:
      public void XMLSerialize()
      {
      Person c
      = new Person("cyj"
      );
      c.Courses
      = new Course[2
      ];
      c.Courses[
      0] = new Course("英語(yǔ)", "交流工具"
      );
      c.Courses[
      1] = new Course("數(shù)學(xué)","自然科學(xué)"
      );
      XmlSerializer xs
      = new XmlSerializer(typeof
      (Person));
      Stream stream
      = new FileStream("c:\\cyj.XML"
      ,FileMode.Create,FileAccess.Write,FileShare.Read);
      xs.Serialize(stream,c);
      stream.Close();
      }

      public void XMLDeserialize()
      {
      XmlSerializer xs
      = new XmlSerializer(typeof
      (Person));
      Stream stream
      = new FileStream("C:\\cyj.XML"
      ,FileMode.Open,FileAccess.Read,FileShare.Read);
      Person p
      = xs.Deserialize(stream) as
      Person;
      Response.Write(p.Name);
      Response.Write(p.Age.ToString());
      Response.Write(p.Courses[
      0
      ].Name);
      Response.Write(p.Courses[
      0
      ].Description);
      Response.Write(p.Courses[
      1
      ].Name);
      Response.Write(p.Courses[
      1
      ].Description);
      stream.Close();
      }

      這里Course類的Description屬性值將始終為null,生成的xml文檔中也沒(méi)有該節(jié)點(diǎn),如下圖:
      <?xml version="1.0"?>
      <Person xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:xsd="http://www./2001/XMLSchema">
      <Sex></Sex>
      <Age>31</Age>
      <Courses>
      <Course>
      <Name>英語(yǔ)</Name>
      <Description>交流工具</Description>
      </Course>
      <Course>
      <Name>數(shù)學(xué)</Name>
      <Description>自然科學(xué)</Description>
      </Course>
      </Courses>
      <Name>cyj</Name>
      </Person>

      4、自定義序列化
      如果你希望讓用戶對(duì)類進(jìn)行串行化,但是對(duì)數(shù)據(jù)流的組織方式不完全滿意,那么可以通過(guò)在自定義類中實(shí)現(xiàn)接口來(lái)自定義串行化行為。這個(gè)接口只有一個(gè)方法,GetObjectData. 這個(gè)方法用于將對(duì)類對(duì)象進(jìn)行串行化所需要的數(shù)據(jù)填進(jìn)SerializationInfo對(duì)象。你使用的格式化器將構(gòu)造SerializationInfo對(duì)象,然后在串行化時(shí)調(diào)用GetObjectData. 如果類的父類也實(shí)現(xiàn)了ISerializable,那么應(yīng)該調(diào)用GetObjectData的父類實(shí)現(xiàn)。
      如果你實(shí)現(xiàn)了ISerializable,那么還必須提供一個(gè)具有特定原型的構(gòu)造器,這個(gè)構(gòu)造器的參數(shù)列表必須與GetObjectData相同。這個(gè)構(gòu)造器應(yīng)該被聲明為私有的或受保護(hù)的,以防止粗心的開(kāi)發(fā)人員直接使用它。
      示例如下:
      實(shí)現(xiàn)ISerializable的類:
      using System;
      using
      System.Data;
      using
      System.Configuration;
      using
      System.Web;
      using
      System.Web.Security;
      using
      System.Web.UI;
      using
      System.Web.UI.WebControls;
      using
      System.Web.UI.WebControls.WebParts;
      using
      System.Web.UI.HtmlControls;
      using
      System.Runtime.Serialization;
      using
      System.Runtime.Serialization.Formatters.Binary;
      /// <summary>
      /// Employee 的摘要說(shuō)明
      /// </summary>

      [Serializable]
      public class
      Employee:ISerializable
      {
      public int EmpId=100
      ;
      public string EmpName="劉德華"
      ;
      [NonSerialized]
      public string NoSerialString = "NoSerialString-Test"
      ;
      public
      Employee()
      {
      //

      // TODO: 在此處添加構(gòu)造函數(shù)邏輯
      //
      }

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

      }

      public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
      {
      info.AddValue(
      "EmployeeId"
      , EmpId);
      info.AddValue(
      "EmployeeName"
      , EmpName);
      //info.AddValue("EmployeeString", NoSerialString);

      }

      }


      序列化和反序列化方法:
      public void OtherEmployeeClassTest()
      {
      Employee mp
      = new
      Employee();
      mp.EmpId
      = 10
      ;
      mp.EmpName
      = "邱楓"
      ;
      mp.NoSerialString
      = "你好呀"
      ;
      Stream steam
      = File.Open("c:\\temp3.dat"
      , FileMode.Create);
      BinaryFormatter bf
      = new
      BinaryFormatter();
      Response.Write(
      "Writing Employee Info:"
      );
      bf.Serialize(steam,mp);
      steam.Close();
      mp
      = null
      ;
      //反序列化

      Stream steam2 = File.Open("c:\\temp3.dat", FileMode.Open);
      BinaryFormatter bf2
      = new
      BinaryFormatter();
      Response.Write(
      "Reading Employee Info:"
      );
      Employee mp2
      =
      (Employee)bf2.Deserialize(steam2);
      steam2.Close();
      Response.Write(mp2.EmpId);
      Response.Write(mp2.EmpName);
      Response.Write(mp2.NoSerialString);
      }

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多