可序列化和自定義序列化

2022-08-19 11:06:09 字數 1713 閱讀 1985

序列化技術的主要兩個目的是:持久化儲存、按值封送。

.net framework支援三種序列化器:binary、xml、soap.他們各有優缺點,分別列如下

1. binary序列化是完全保真的,因為除非特殊宣告為nonserialized,那麼所有成員(包括私有的和公有的)都會被序列化。該序列化器的結果體積比較小,是二進位制格式儲存的。所以不便於平台復用。

2. xml序列化只序列化公有成員。它的結果是標準的xml文件,有利於跨平台。

3. soap序列化其實可以說是xml序列化的一種,但它的結果是特定的xml文件,遵從soap規範。xml web service技術缺省會呼叫該序列化器在客戶端與伺服器之間傳遞請求和資料。

要讓物件支援序列化,必須將其標記為可序列化(serializable),基本上不需要其他的操作,序列化器就可以知道該如何做。但有乙個問題需要注意,serializable是不可繼承的,也就是說即便父類是標記為可序列化的,那麼子類也仍然需要標記為可序列化。

對於那些明確不想序列化的成員,可以通過標記為不可序列化(nonserialized)來告訴序列化器。

如果想更加精確地控制序列化的過程,那麼可以為型別實現iserizlizable介面。該介面要求實現乙個方法getobjectdata,其實很簡單,依次把有關你想序列化的成員放進去即可(當然可以做一些特殊的處理,例如加密等),值得注意的是,除了實現該方法,還需要編寫乙個特殊的建構函式,該函式具有與getobjectdata方法一樣的簽名,在這個方法裡面依次把成員取出來即可。(該方法裡面當然可以做另外一些處理,例如解密等,它是在反序列化的時候自動被呼叫的)

public int id

public string description

public abscustomer()

public abscustomer(system.runtime.serialization.serializationinfo info, system.runtime.serialization.streamingcontext context)

#region iserializable 成員

public virtual void getobjectdata(system.runtime.serialization.serializationinfo info, system.runtime.serialization.streamingcontext context)

{info.addvalue("id", id);

info.addvalue("description", description);

#endregion

序列化過程的步驟

在格式化程式上呼叫 serialize 方法時,物件序列化按照以下規則進行:

檢查格式化程式是否有**選取器。如果有,檢查**選取器是否處理指定型別的物件。如果選取器處理此物件型別,將在**選取器上呼叫 iserializable.getobjectdata。 

如果沒有**選取器或有卻不處理此型別,將檢查是否使用serializable屬性對物件進行標記。如果未標記,將會引發 serializationexception。 

如果物件已被正確標記,將檢查物件是否實現了 iserializable。如果已實現,將在物件上呼叫 getobjectdata。 

如果物件未實現 serializable,將使用預設的序列化策略,對所有未標記為 nonserialized 的字段都進行序列化。

qt序列化自定義物件 Qt序列化

class painting public painting painting const qstring title,const qstring artist,int year qstring title const private qstring mytitle qstring myartist...

Python 序列化 反序列化自定義型別

內建json模組對於python內建型別序列化的描述 extensible json encoder for python data structures.supports the following objects and types by default python json dict obj...

Serializable 自定義序列化

序列化物件可以自定義序列化,也可以使用預設序列化 如何選擇呢?這就要從序列化的目的說起,序列化的目的簡單來說就是儲存,之後可以還原,這就是說只要我們能達到這個目的,都是ok的。如果都ok那麼就可以選擇更ok的形式。看下面這個例子 oddnum 這是乙個極其沒有道理的例子,只是為了說明問題 publi...