C#序列化和反序列化

序列化和反序列化我們可能經常會聽到,其實通俗一點的解釋,序列化就是把一個對象保存到一個文件或數據庫字段中去,反序列化就是在適當的時候把這個文件再轉化成原來的對象使用。

  我想最主要的作用有:

  1、在進程下次啟動時讀取上次保存的對象的信息

  2、在不同的AppDomain或進程之間傳遞數據

  3、在分布式應用系統中傳遞數據

  ......

  在C#中常見的序列化的方法主要也有三個:BinaryFormatter、SoapFormatter、XML序列化

  本文就通過一個小例子主要說說這三種方法的具體使用和異同點

  這個例子就是使用三種不同的方式把一個Book對象進行序列化和反序列化,當然這個Book類首先是可以被序列化的。至于怎么使一個類可以序列化可以參見:C#強化系列文章一:ViewState使用兼談序列化

  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]的字段,具體會在下面的例子中體現出來

  一、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;

  }

  }

  }

  主要就是調用System.Runtime.Serialization.Formatters.Binary空間下的BinaryFormatter類進行序列化和反序列化,以縮略型二進制格式寫到一個文件中去,速度比較快,而且寫入后的文件已二進制保存有一定的保密效果。

  調用反序列化后的截圖如下:

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

  二、SoapFormatter序列化方式

  調用序列化和反序列化的方法和上面比較類似,我就不列出來了,主要就看看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;

  }

  }

  }

  主要就是調用System.Runtime.Serialization.Formatters.Soap空間下的SoapFormatter類進行序列化和反序列化,使用之前需要應用System.Runtime.Serialization.Formatters.Soap.dll(.net自帶的)

  序列化之后的文件是Soap格式的文件(簡單對象訪問協議(Simple Object Access Protocol,SOAP),是一種輕量的、簡單的、基于XML的協議,它被設計成在WEB上交換結構化的和固化的信息。 SOAP 可以和現存的許多因特網協議和格式結合使用,包括超文本傳輸協議(HTTP),簡單郵件傳輸協議(SMTP),多用途網際郵件擴充協議(MIME)。它還支持從消息系統到遠程過程調用(RPC)等大量的應用程序。SOAP使用基于XML的數據結構和超文本傳輸協議(HTTP)的組合定義了一個標準的方法來使用Internet上各種不同操作環境中的分布式對象。) [Page]

  調用反序列化之后的結果和方法一相同

  三、XML序列化方式

  調用序列化和反序列化的方法和上面比較類似,我就不列出來了,主要就看看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;

  }

  }

  }

  從這三個測試類我們可以看出來其實三種方法的調用方式都差不多,只是具體使用的類不同

  xml序列化之后的文件就是一般的一個xml文件:

  book.xml

  <?xml version="1.0"?>

  <Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/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等類型的字段不能進行序列化

  關于循環引用:

  比如在上面的例子Book類中加入如下一個屬性:

  public Book relationBook;

  在調用序列化時使用如下方法:

  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);這樣就會出現循環引用的情況,對于BinarySerialize和SoapSerialize可以正常序列化(.NET內部進行處理了),對于XmlSerialize出現這種情況會報錯:"序列化類型 SerializableTest.Book 的對象時檢測到循環引用。"

轉載于:https://www.cnblogs.com/ygzhong000/p/3619208.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273818.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273818.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python【進階】5.一等函數(注銷)

在 Python 中,函數是一等對象。編程語言理論家把“一等對象”定義為滿足下述條件的程 序實體: 在運行時創建能賦值給變量或數據結構中的元素能作為參數傳給函數能作為函數的返回結果 在 Python 中,所有函數都是一等對象。 5.1 把函數視作對象 >>> def d(n): ... …

進程狀態轉換(了解)

進程三個基本狀態&#xff1a;就緒、阻塞、運行 這個比較簡單&#xff0c;進程創建后進入就緒狀態、然后若CPU空閑或能打斷CPU正在執行的進程&#xff08;優先級低的&#xff09;&#xff0c;那么就緒狀態轉換成運行態&#xff0c;運行時&#xff0c;進程需要用到其他資源&…

rebuild online意外終止導致ora-8104錯誤的實驗

rebuild online意外終止導致ora-8104錯誤的實驗 SQL> !oerr ora 810408104, 00000, "this index object %s is being online built or rebuilt"// *Cause: the index is being created or rebuild or waited for recovering // from the online (re)build // *Act…

關于range方法,如果你覺得python很簡單就錯了

前言&#xff1a;在系統學習迭代器之前&#xff0c;我一直以為 range() 方法也是用于生成迭代器的&#xff0c;現在卻突然發現&#xff0c;它生成的只是可迭代對象&#xff0c;而并不是迭代器&#xff01; 1、range() 是什么&#xff1f; 對于 range() 函數&#xff0c;有幾個注…

centos下crontab的使用

1.作用使用crontab命令可以修改crontab配置文件&#xff0c;然后該配置由cron公用程序在適當的時間執行&#xff0c;該命令使用權限是所有用戶。2.格式crontab [-u user] {-l | -r | -e}3.crontab命令選項: -u指定一個用戶, -l列出某個用戶的任務計劃, -r刪除某個用戶的任務, -…

關于python3中的包operator(支持函數式編程的包)

文章目錄1.functools2.operator.itemgetter3.operator.attrgetter雖然 Guido 明確表明,Python 的目標不是變成函數式編程語言,但是得益于 operator 和 functools 等包的支持,函數式編程風格也可以信手拈來。接下來的兩節分別介紹這兩 個包。 1.functools 示例1 使用 reduce 函…

collections 中的namedtuple

文章目錄namedtuple 基本用法namedtuple特性_make(iterable)_asdict()_replace(**kwargs)_fields_fields_defaults參考&#xff1a;namedtuple 基本用法 Tuple還有一個兄弟&#xff0c;叫namedtuple。雖然都是tuple&#xff0c;但是功能更為強大。對于namedtuple&#xff0c;你…

abap 中modify 的使用

1、modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作區wa 中關鍵字的一條數據的 f1 f2字段會被wa中對應的字段值更新。 modify用于更新和新增數據&#xff0c;當表中沒有數據時就新增&#xff0c;有就修改。 2、在使用binary search 時一定要先排序&am…

python[進階] 6.使用一等函數實現設計模式

文章目錄6.1.1 經典的“策略”模式6.1.2 使用函數實現“策略”模式6.1.3 選擇最佳策略&#xff1a;簡單的6.1.4 找出模塊中的全部6.2 “命令”模式6.1.1 經典的“策略”模式 為抽象基類&#xff08;Abstract Base Class&#xff0c;ABC&#xff09;&#xff0c;這么做是為了使…

2014阿里巴巴校園招聘筆試題 - 中南站

轉載于:https://www.cnblogs.com/gotodsp/articles/3530329.html

python中一些特殊方法的作用

我們先暫且稱呼為特殊方法。 單下劃線開頭&#xff08;_foo&#xff09;雙下劃線開頭的&#xff08;__foo&#xff09;雙下劃線開頭和結尾的&#xff08; __foo__&#xff09;代表不能直接訪問的類屬性&#xff0c;需通過類提供的接口進行訪問&#xff0c;不能用“from xxx im…

Spring的IOC原理[通俗解釋一下]

1. IoC理論的背景 我們都知道&#xff0c;在采用面向對象方法設計的軟件系統中&#xff0c;它的底層實現都是由N個對象組成的&#xff0c;所有的對象通過彼此的合作&#xff0c;最終實現系統的業務邏輯。 圖1&#xff1a;軟件系統中耦合的對象 如果我們打開機械式手表的后蓋&am…

python爬蟲面試遇到的問題

文章目錄&#xff11;python基礎1.1 列表生成式和生成器的區別 &#xff1f;1.2 如何不用任何循環快速篩掉列表中的奇數元素 &#xff1f;1.3 map和reduce的用法1.4 裝飾器的作用1.5 Python中__new__與__init方法的區別1.6 python中的設計模式1.7 lambda函數&#xff0c;以及它…

ubuntu18 常用命令

文章目錄卸載和安裝卸載和安裝 1.打開一個終端&#xff0c;輸入dpkg --list ,按下Enter鍵&#xff0c;終端輸出以下內容&#xff0c;顯示的是你電腦上安裝的所有軟件。 2.安裝 dpkg –i name.deb 安裝一個 deb 包&#xff1b;在終端上輸入命令sudo apt-get --purge remove 包…

以嵌入式系統設計師考試成績,開始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 轉載于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介紹 1.2. SSH框架配置 所需資源下載&#xff1a; l jdk; 從Oracle官方網站&#xff1a;http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下載jdk&#xff0c;win7是默認安裝在C:\Program Files (x86)\Java\jdk1.6.0_25路徑下…

cookie,session的區別和聯系(補充token)

文章目錄1 http為什么是無狀態的2 cookie 和session 的區別詳解3 token參考&#xff1a;備注: 博客文章僅限于學習&#xff0c;禁止商用1 http為什么是無狀態的 2 cookie 和session 的區別詳解 這些都是基礎知識&#xff0c;不過有必要做深入了解。先簡單介紹一下。 二者的定…

庫函數和系統調用的區別

前言 這是一對非常容易混淆的概念。對于用戶( 應用程序開發者 )來說&#xff0c;并不一定要嚴格區分其意義。因為在用戶看來&#xff0c;它們都是以C函數的形式出現的。但了解二者的區別對我們掌握整個計算機系統有很大幫助。 區別 1. 一部分庫函數實現需要使用系統調用( 如 pr…

Flask 從入門到熟悉(不敢稱為精通)

文章目錄2.1 Flask介紹及其安裝2.2 Virtualenv3.1 一個最小的應用3.2 外部課件服務器3.3 調試模式4.1 路由介紹4.2 變量規則4.3 構建URL4.4 HTTP 方法4 總結5.1 靜態文件5.2 渲染模板5.3 練習66.1 接收請求數據6.2 請求對象6.3 文件上傳6.4 Cookies6 總結77.1 重定向和錯誤7.2 …

Ext JS 5 beta版發布

原文&#xff1a;Announcing Public Beta of Ext JS 5我們非常高興的宣布&#xff0c;Sencha Ext JS 5 beta版本開始進行公測了。這個beta版本可以讓你、我們Sencha社區來對我們的Ext JS 5的工作進度進行評測。對于所以Ext JS開發人員&#xff0c;這事一個很好的機會來協助完成…