1. 程式人生 > >深入C#學習:序列化(Serialize)、…

深入C#學習:序列化(Serialize)、…

序列化又稱序列化,是.NET執行時環境用來支援使用者定義型別的流化的機制。其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從一個地方傳輸到另一個地方。
    .NET框架提供了兩種序列化的方式:1、是使用BinaryFormatter進行序列化;2、使用SoapFormatter進行序列化;3、使用XmlSerializer進行序列化。第一種方式提供了一個簡單的二進位制資料流以及某些附加的型別資訊,而第二種將資料流格式化為XML儲存;第三種其實和第二種差不多也是XML的格式儲存,只不過比第二種的XML格式要簡化很多(去掉了SOAP特有的額外資訊)。
    可以使用[Serializable]屬性

將類標誌為可序列化的。如果某個類的元素不想被序列化,1、2可以使用[NonSerialized]屬性來標誌,2、可以使用[XmlIgnore]來標誌。
1、使用BinaryFormatter進行序列化
    下面是一個可序列化的類:

  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;
////// ClassToSerialize 的摘要說明
///

[Serializable]
publicclass ClassToSerialize
{
    
publicint id =100
;
    
publicstring name ="Name"
;
    [NonSerialized]
    
publicstring 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();
    }

    
publicvoid 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();
    }

呼叫上述兩個方法就可以看到序列化的結果:Sex屬性因為被標誌為[NonSerialized],故其值總是為null。

2、使用SoapFormatter進行序列化
    和BinaryFormatter類似,我們只需要做一下簡單修改即可:
    a.將using語句中的.Formatter.Binary改為.Formatter.Soap;
    b.將所有的BinaryFormatter替換為SoapFormatter.
    c.確保報存檔案的副檔名為.xml
    經過上面簡單改動,即可實現SoapFormatter的序列化,這時候產生的檔案就是一個xml格式的檔案。
3、使用XmlSerializer進行序列化
    關於格式化器還有一個問題,假設我們需要XML,但是不想要SOAP特有的額外資訊,那麼我們應該怎麼辦呢?有兩中方案:要麼編寫一個實現IFormatter介面的類,採用的方式類似於SoapFormatter類,但是沒有你不需要的資訊;要麼使用庫類XmlSerializer,這個類不使用Serializable屬性,但是它提供了類似的功能。
    如果我們不想使用主流的序列化機制,而想使用XmlSeralizer進行序列化我們需要做一下修改:
    a.新增System.Xml.Serialization名稱空間。
    b.Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行為與NoSerialized類似。
    c.XmlSeralizer要求類有個預設的構造器,這個條件可能已經滿足了。
    下面看示例:
    要序列化的類:

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]
publicclass
 Person
{
    
privatestring
 name;
    
publicstring
 Name
    
{
        
get

        
{
            
return
 name;
        }

        
set
        
{
            name 
=
 value;
        }

    }



    
publicstring Sex;
    
publicint Age =31
;
    
public
 Course[] Courses;

    
public
 Person()
    
{
    }

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

}

[Serializable]
publicclass Course
{
    
publicstring
 Name;
    [XmlIgnore]
    
publicstring
 Description;
    
public
 Course()
    
{
    }

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

}
  


    序列化和反序列化方法:

publicvoid XMLSerialize()
    
{
        Person c 
=new Person("cyj"
);
        c.Courses 
=new Course[2
];
        c.Courses[
0=new Course("英語""交流工具"
);
        c.Courses[
1=new Course("數學","自然科學"
);
        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();
    }

    
publicvoid XMLDeserialize()
    
{

相關推薦

深入C#學習序列(Serialize)

序列化又稱序列化,是.NET執行時環境用來支援使用者定義型別的流化的機制。其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從一個地方傳輸到另一個地方。     .NET框架提供了兩種序

Python全棧學習筆記day 20序列模組模組的匯入

  一、序列化模組 從資料型別 --> 字串的過程 :序列化 從字串 --> 資料型別的過程 :反序列化 json # 通用的序列化格式 # 只有很少的一部分資料型別(數字、字串、列表、字典、元組)能夠通過json轉化成字串 pickl

資料結構—堆的學習陣列堆的插入堆的刪除

原網頁:http://blog.csdn.net/morewindows/article/details/6709644 程式如下: //資料結構堆的建立(堆化陣列)、堆的插入和刪除 #include<stdio.h> #include <stdlib.h

學習Hadoop第十二課(Hadoop序列機制Linux安裝Eclipse及建立快捷圖示使用Maven開發)

我看的視訊就是這個,看到有人寫了,就轉過來了 上節課我們一起學習了MapReduce的一個簡單例項,這節課我們一起來學習Hadoop的序列化機制。        首先我們來學習一下,什麼叫做序列化,序列化是指把結構化物件轉換成位元組流,這樣做的目的當然是便於在網路中傳輸。

C#基礎系列序列效率比拼

      前言:作為開發人員,物件的序列化恐怕難以避免。樓主也是很早以前就接觸過序列化,可是理解都不太深刻,對於用哪種方式去做序列化更是隨波逐流——專案中原來用的什麼方式照著用就好了。可是這麼多年自己對於這東西還是挺模糊的,今天正好有時間,就將原來用過的幾種方式總結了下,也算是做一個記錄,順便做了下效能測

java基礎之序列 Java物件表示方式1序列序列和transient關鍵字的作用

轉載自https://www.cnblogs.com/szlbm/p/5504166.html     Java物件表示方式1:序列化、反序列化和transient關鍵字的作用   平時我們在Java記憶體中的物件,是無 法進行IO操作或者網路通訊的

大型分散式C++框架《三序列與反序列

原貼:http://www.cnblogs.com/ztteng/p/5381096.html 一、前言      個人感覺序列化簡單來說就是按一定規則組包。反序列化就是按組包時的規則來接包。正常來說。序列化不會很難。不會很複雜。因為過於複雜的序列化協議會導致較

C++物件Json序列最佳實踐(基於Rapidjson庫)C++記憶體物件和Json字串互相轉換

介紹:RapidjsonRapidjson庫是C++物件序列化到Json字串的非常好的工具,以效率著稱,騰訊的人寫的。這個庫的缺點(個人拙見):1 暴露的細節相對較多:容器,迭代器,型別,成員函式,序列化,反序列化,都有非常細緻的操作。這個給使用者帶來記憶負擔較重。至少需要同

C#中的序列和反序列是什麼有什麼作用使用方法詳解

什麼是序列化與反序列化??? 序列化和反序列化,我們可能經常會聽到,其實通俗一點的解釋,序列化就是把一個物件儲存到一個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。  當兩個程序在進行遠端通訊時,彼此可以傳送各種型別的資料。無論是何種

effectiveJava學習筆記序列

謹慎地實現Serializable 序列化:將一個物件編碼成一個位元組流,通過儲存或傳輸這些位元組流資料來達到資料持久化的目的; 反序列化:將位元組流轉換成一個物件; 1.序列化的含義和作用。 序列化用來將物件編碼成位元組流,反序列化就使將位元組流編碼重新構建物件。 

深入學習Java序列

類定義 all sstream tno object protocol text ans contain 前言 對於Java的序列化,一直只知道只需要實現Serializbale這個接口就可以了,具體內部實現一直不是很了解,正好這次在重復造RPC的輪子的時候涉及到序列化問題

C#網絡編程學習(7)---序列和反序列

mem serial 編程 length 格式 反序列化 formatter 序列化對象 種類 1、什麽是序列化和反序列化 當客戶端和服務器進行遠程連接時,互相可以發送各種類型的數據。但都要先把這些對象轉換為字節序列,才能在網絡上進行傳輸。 序列化:就是發送方 把對象轉換

19.DjangoRestFramework學習二之序列元件檢視元件

一 序列化元件   首先按照restful規範咱們建立一些api介面,按照下面這些形式寫吧:     Courses --- GET ---> 檢視資料----->返回所有資料列表[{},{},]     Courses--- POST --->新增資料 -----> 返回新增的資料{

【iOS開發-51】案例學習動畫新寫法刪除子視圖視圖順序延遲方法button多功能使用方法及icon圖標和啟動頁設置

無法查看 font targe 技術 value lstat tostring sta dict 案例效果: (1)導入所需的素材,然後用storyboard把上半截位置和大小相對固定的東西布局起來。當然,這些控件也要定義成對應地IBOutlet和IBActio

python3學習序列

python其他-->字符串,叫序列化字符串-->其他,叫反序列化有兩個模塊:json 可以處理python基本數據類型,字典,列表,元組,保存的文件是“明文的”pickle 可以處理python全部數據類型,專用於python,保存的文件是“加密的”jsonimport json l =

C# Json反序列 數據協定類型 無法反序列 由於未找到必需的數據成員

val object test 信息 span 屬性表 ble details space 背景今天在使用:C# Json 序列化與反序列化 反序列化的時候出現了以下的錯誤信息。System.Runtime.Serialization.SerializationExce

C#對象序列與反序列

space ros 個人信息 瀏覽器 特性 點名 文件名 屬性節點 派生 1.對象序列化的介紹 (1).NET支持對象序列化的幾種方式 二進制序列化:對象序列化之後是二進制形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Seri

Linux 7個運行級別(0關機,停機模式1單用戶模式2多用戶模式3完整的多用戶文本模式4系統未使用,保留一般不用5圖形模式6重啟模式)重置root密碼方法

oca alt 開機重啟 正常 說明 特殊情況 其中 ice root權限 init是Linux系統操作中不可缺少的程序之一。init進程,它是一個由內核啟動的用戶級進程。內核會在過去曾使用過init的幾個地方查找它,它的正確位置(對Linux系統來說)是/

C#語言-08.序列與反序列

clas 本質 cnblogs 語法 信息 字段 使用 serializa col a. 序列化:是將對象的狀態存儲到特定存儲介質中的過程 i. 語法:public void Serialize(序列化過程的文件流,保存的對象)

c# 類的序列,以及嵌套問題

serializa art per pep bytes 嵌套 spa 只需要 typeof 簡單的序列化,網上很多,但是突然想到一個問題,如果一個類裏用到了另一個,那麽怎麽辦,今天試了試,只需要加上序列號標簽就可以了 using System.Collection