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

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

    • 分享

      C#序列化和反序列化 (BinaryFormatter、SoapFormatter、XML序列化)

       雄Frank 2011-10-23

      序列化和反序列化我們可能經(jīng)常會聽到,其實通俗一點的解釋,序列化就是把一個對象保存到一個文件或數(shù)據(jù)庫字段中去,反序列化就是在適當?shù)臅r候把這個文件再轉(zhuǎn)化成原來的對象使用。
      我想最主要的作用有:
      1、在進程下次啟動時讀取上次保存的對象的信息 
      2、在不同的AppDomain或進程之間傳遞數(shù)據(jù) 
      3、在分布式應(yīng)用系統(tǒng)中傳遞數(shù)據(jù)
      ......
      在C#中常見的序列化的方法主要也有三個:BinaryFormatter、SoapFormatter、XML序列化
      本文就通過一個小例子主要說說這三種方法的具體使用和異同點

      這個例子就是使用三種不同的方式把一個Book對象進行序列化和反序列化,當然這個Book類首先是可以被序列化的。
      Book類
      using System;
      using System.Collections;
      using System.Text;

      namespace SerializableTest
      {
          [Serializable]
          public class Book
          {
              public Book()
              {
                  alBookReader = new ArrayList();
              }

              public string strBookName;

              [NonSerialized]
              public string strBookPwd;

              private string _bookID;
              public string BookID
              {
                  get { return _bookID; }
                  set { _bookID = value; }
              }

              public ArrayList alBookReader;

              private string _bookPrice;
              public void SetBookPrice(string price)
              {
                  _bookPrice = price;
              }

              public void Write()
              {
                  Console.WriteLine(\"Book ID:\" + BookID);
                  Console.WriteLine(\"Book Name:\" + strBookName);
                  Console.WriteLine(\"Book Password:\" + strBookPwd);
                  Console.WriteLine(\"Book Price:\" + _bookPrice);
                  Console.WriteLine(\"Book Reader:\");
                  for (int i = 0; i < alBookReader.Count; i++)
                  {
                      Console.WriteLine(alBookReader[i]); [Page]
                  }
              }
          }
      }
      這個類比較簡單,就是定義了一些public字段和一個可讀寫的屬性,一個private字段,一個標記為[NonSerialized]的字段,具體會在下面的例子中體現(xiàn)出來

      一、BinaryFormatter序列化方式
      1、序列化,就是給Book類賦值,然后進行序列化到一個文件中
                  Book book = new Book();
                  book.BookID = \"1\";
                  book.alBookReader.Add(\"gspring\");
                  book.alBookReader.Add(\"永春\");
                  book.strBookName = \"C#強化\";
                  book.strBookPwd = \"*****\";
                  book.SetBookPrice(\"50.00\");
                  BinarySerialize serialize = new BinarySerialize();
                  serialize.Serialize(book);2、反序列化
       

      BinarySerialize serialize = new BinarySerialize();
                  Book book = serialize.DeSerialize();
                  book.Write();3、測試用的
      BinarySerialize類
      using System;
      using System.Collections.Generic;
      using System.Text;
      using System.IO;
      using System.Runtime.Serialization.Formatters.Binary;

      namespace SerializableTest
      {
          public class BinarySerialize
          {
              string strFile = \"c:\\\\book.data\";

              public void Serialize(Book book)
              {
                  using (FileStream fs = new FileStream(strFile, FileMode.Create))
                  {
                      BinaryFormatter formatter = new BinaryFormatter();
                      formatter.Serialize(fs, book);
                  }
              }

              public Book DeSerialize()
              {
                  Book book;
                  using (FileStream fs = new FileStream(strFile, FileMode.Open))
                  {
                      BinaryFormatter formatter = new BinaryFormatter(); [Page]
                      book = (Book)formatter.Deserialize(fs);
                  }
                  return book;
              }
          }
      }
      主要就是調(diào)用System.Runtime.Serialization.Formatters.Binary空間下的BinaryFormatter類進行序列化和反序列化,以縮略型二進制格式寫到一個文件中去,速度比較快,而且寫入后的文件已二進制保存有一定的保密效果。
      調(diào)用反序列化后的截圖如下:

      也就是說除了標記為NonSerialized的其他所有成員都能序列化

      二、SoapFormatter序列化方式
      調(diào)用序列化和反序列化的方法和上面比較類似,我就不列出來了,主要就看看SoapSerialize類
      SoapSerialize類
      using System;
      using System.Collections.Generic;
      using System.Text;
      using System.IO;
      using System.Runtime.Serialization.Formatters.Soap;

      namespace SerializableTest
      {
          public class SoapSerialize
          {
              string strFile = \"c:\\\\book.soap\";

              public void Serialize(Book book)
              {
                  using (FileStream fs = new FileStream(strFile, FileMode.Create))
                  {
                      SoapFormatter formatter = new SoapFormatter();
                      formatter.Serialize(fs, book);
                  }
              }

              public Book DeSerialize()
              {
                  Book book;
                  using (FileStream fs = new FileStream(strFile, FileMode.Open))
                  {
                      SoapFormatter formatter = new SoapFormatter();
                      book = (Book)formatter.Deserialize(fs);


                  }
                  return book;
              }
          }
      }
      主要就是調(diào)用System.Runtime.Serialization.Formatters.Soap空間下的SoapFormatter類進行序列化和反序列化,使用之前需要應(yīng)用System.Runtime.Serialization.Formatters.Soap.dll(.net自帶的)
      序列化之后的文件是Soap格式的文件(簡單對象訪問協(xié)議(Simple Object Access Protocol,SOAP),是一種輕量的、簡單的、基于XML的協(xié)議,它被設(shè)計成在WEB上交換結(jié)構(gòu)化的和固化的信息。 SOAP 可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議(HTTP),簡單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴充協(xié)議(MIME)。它還支持從消息系統(tǒng)到遠程過程調(diào)用(RPC)等大量的應(yīng)用程序。SOAP使用基于XML的數(shù)據(jù)結(jié)構(gòu)和超文本傳輸協(xié)議(HTTP)的組合定義了一個標準的方法來使用Internet上各種不同操作環(huán)境中的分布式對象。) [Page]
      調(diào)用反序列化之后的結(jié)果和方法一相同

      三、XML序列化方式
      調(diào)用序列化和反序列化的方法和上面比較類似,我就不列出來了,主要就看看XmlSerialize類
      XmlSerialize類
      using System;
      using System.Collections.Generic;
      using System.Text;
      using System.IO;
      using System.Xml.Serialization;

      namespace SerializableTest
      {
          public class XmlSerialize
          {
              string strFile = \"c:\\\\book.xml\";

              public void Serialize(Book book)
              {
                  using (FileStream fs = new FileStream(strFile, FileMode.Create))
                  {
                      XmlSerializer formatter = new XmlSerializer(typeof(Book));
                      formatter.Serialize(fs, book);
                  }
              }

              public Book DeSerialize()
              {
                  Book book;
                  using (FileStream fs = new FileStream(strFile, FileMode.Open))
                  {
                      XmlSerializer formatter = new XmlSerializer(typeof(Book));
                      book = (Book)formatter.Deserialize(fs);
                  }
                  return book;
              }
          }
      }
      從這三個測試類我們可以看出來其實三種方法的調(diào)用方式都差不多,只是具體使用的類不同
      xml序列化之后的文件就是一般的一個xml文件:
      book.xml
      <?xml version=\"1.0\"?>
      <Book xmlns:xsi=\"http://www./2001/XMLSchema-instance\" xmlns:xsd=\"http://www./2001/XMLSchema\">
        <strBookName>C#強化</strBookName>
        <strBookPwd>*****</strBookPwd>
        <alBookReader>
          <anyType xsi:type=\"xsd:string\">gspring</anyType>
          <anyType xsi:type=\"xsd:string\">永春</anyType>
        </alBookReader>
        <BookID>1</BookID>
      </Book>輸出截圖如下:

      也就是說采用xml序列化的方式只能保存public的字段和可讀寫的屬性,對于private等類型的字段不能進行序列化

      關(guān)于循環(huán)引用:
      比如在上面的例子Book類中加入如下一個屬性:
              public Book relationBook;
      在調(diào)用序列化時使用如下方法:
                  Book book = new Book();
                  book.BookID = \"1\"; [Page]
                  book.alBookReader.Add(\"gspring\");
                  book.alBookReader.Add(\"永春\");
                  book.strBookName = \"C#強化\";
                  book.strBookPwd = \"*****\";

                  book.SetBookPrice(\"50.00\");

                  Book book2 = new Book();
                  book2.BookID = \"2\";
                  book2.alBookReader.Add(\"gspring\");
                  book2.alBookReader.Add(\"永春\");
                  book2.strBookName = \".NET強化\";
                  book2.strBookPwd = \"*****\";
                  book2.SetBookPrice(\"40.00\");

                  book.relationBook = book2;
                  book2.relationBook = book;
                  BinarySerialize serialize = new BinarySerialize();
                  serialize.Serialize(book);這樣就會出現(xiàn)循環(huán)引用的情況,對于BinarySerialize和SoapSerialize可以正常序列化(.NET內(nèi)部進行處理了),對于XmlSerialize出現(xiàn)這種情況會報錯:\"序列化類型 SerializableTest.Book 的對象時檢測到循環(huán)引用。\"

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多