序列化與反序列化

2021-07-29 15:28:08 字數 2779 閱讀 5431

序列化就是把乙個物件儲存到乙個檔案或資料庫欄位中去,反序列化就是在適當的時候把這個檔案再轉化成原來的物件使用。

其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從乙個地方傳輸到另乙個地方。 .

net框架提供了兩種序列化的方式:

1、是使用binaryformatter進行序列化;

2、使用soapformatter進行序列化;

3、使用xmlserializer進行序列化。

第一種方式提供了乙個簡單的二進位制資料流以及某些附加的型別資訊

第二種將資料流格式化為xml儲存;

第三種其實和第二種差不多也是xml的格式儲存,只不過比第二種的xml格式要簡化很多(去掉了soap特有的額外資訊)。

可以使用[serializable]屬性將類標誌為可序列化的。如果某個類的元素不想被序列化,1、2可以使用[nonserialized]屬性來標誌,2、可以使用[xmlignore]來標誌。

1、使用binaryformatter進行序列化

下面是乙個可序列化的類:

[serializable]  

public class classtoserialize  

下面是序列化和反序列化的方法:

複製**

**如下:

public void serializenow()     

public void deserializenow()    

呼叫上述兩個方法可以看到序列化的結果:

***屬性因為被標誌為[nonserialized],故其值總是為null。

2、使用soapformatter進行序列化

和binaryformatter類似,我們只需要做一下簡單修改即可:

a.將using語句中的.formatter.binary改為.formatter.soap;

b.將所有的binaryformatter替換為soapformatter.

c.確保報存檔案的擴充套件名為.xml

經過上面簡單改動,即可實現soapformatter的序列化,這時候產生的檔案就是乙個xml格式的檔案。

c#序列化和反序列化3、使用xmlserializer進行序列化

關於格式化器還有乙個問題,假設我們需要xml,但是不想要soap特有的額外資訊,那麼我們應該怎麼辦呢?有兩中方案:要麼編寫乙個實現iformatter介面的類,採用的方式類似於soapformatter類,但是沒有你不需要的資訊;要麼使用庫類xmlserializer,這個類不使用serializable屬性,但是它提供了類似的功能。

如果我們不想使用主流的序列化機制,而想使用xmlseralizer進行序列化我們需要做一下修改:

a.新增system.xml.serialization命名空間。

b.serializable和noserialized屬性將被忽略,而是使用xmlignore屬性,它的行為與noserialized類似。

c.xmlseralizer要求類有個預設的構造器,這個條件可能已經滿足了。

下面看c#序列化和反序列化示例:

要序列化的類:

[serializable]  

public class person     

set    

}   

public string ***;  

public int age = 31;  

public course courses;  

public person()     

public person(string name)     

}  複製**

**如下:

[serializable]  

public class course     

public course(string name, string description)     

} c#序列化和反序列化方法:

public void xmlserialize()     

public void xmldeserialize()    

4、自定義序列化

如果你希望讓使用者對類進行序列化,但是對資料流的組織方式不完全滿意,那麼可以通過在自定義類中實現介面來自定義序列化行為。這個介面只有乙個方法,getobjectdata. 這個方法用於將對類物件進行序列化所需要的資料填進serializationinfo物件。你使用的格式化器將構造serializationinfo物件,然後在序列化時呼叫getobjectdata. 如果類的父類也實現了iserializable,那麼應該呼叫getobjectdata的父類實現。如果你實現了iserializable,那麼還必須提供乙個具有特定原型的構造器,這個構造器的引數列表必須與getobjectdata相同。這個構造器應該被宣告為私有的或受保護的,以防止粗心的開發人員直接使用它。

示例如下:

c#序列化和反序列化之實現iserializable的類:

[serializable]  

public class employee:iserializable     

private employee(serializationinfo info, streamingcontext ctxt)     

public void getobjectdata(serializationinfo info, streamingcontext ctxt)     

} c#序列化和反序列化方法:

public void otheremployeeclasstest()    

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

序列化與反序列化

把複雜的資料型別壓縮到乙個字串中 serialize 把變數和它們的值編碼成文字形式 unserialize 恢復原先變數 eg stooges array moe larry curly new serialize stooges print r new echo print r unserial...

序列化與反序列化

序列化是將物件處理為位元組流以儲存物件或傳輸到記憶體 資料庫或檔案。其主要目的是儲存物件的狀態,以便可以在需要時重新建立物件。相反的過程稱為反序列化。通過序列化,開發人員可以儲存物件的狀態,並在需要時重新建立該物件,從而提供物件的儲存以及資料交換。通過序列化,開發人員還可以執行類似如下的操作 通過 ...