天天看點

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定義一個 wcf 終結點行為擴充,以在 wcf 中使用更高效的 binaryformatter 進行二進制序列化,并實作對是否使用傳統二進制序列化功能的可配置。

介紹

實作步驟

使用方法

效果

在 WCF 中使用高效的 BinaryFormatter 序列化
在 WCF 中使用高效的 BinaryFormatter 序列化

隻能在操作上添加二進制序列化的行為。這是因為 wcf 的擴充點中,隻有操作才支援設定 iclientmessageformatter 及 idispatchmessageformatter。

wcf 中,要實作替換操作的序列化器,最直接的方式應該是使用一個實作 ioperationbehavior 的特性(attribute),并将該特性直接标記到操作方法上。但是,這樣會導緻該方法在所有的終結點都使用 binaryformatter 來進行序列化。這并不是我們所想要的,是以隻能使用配置的方法來對 wcf 進行擴充。

封裝 binaryformatter

首先,需要對 binaryformatter 進行一個簡單的封裝。該類使用 binaryformatter 來實作對象到二進制流的序列化及反序列化。

添加 binaryformatteradapter

添加一個 binaryformatteradapter 類型,該類實作了從 wcf 序列化器到 binaryformatter 的甜适配。它實作 iclientmessageformatter 及 idispatchmessageformatter 兩個接口,并調用 serializer 來進行二進制序列化。

添加 binaryformatteroperationbehavior

添加 binaryformatteroperationbehavior 操作行為類。這個類會設定用戶端、服務端的操作的序列化器。

添加終結點行為 enablebinaryformatterbehavior

添加終結點行為 enablebinaryformatterbehavior,實作為該終結點下的所有操作添加 binaryformatteroperationbehavior 的邏輯。

添加行為擴充元素 enablebinaryformatterbehaviorelement

添加終結點行為擴充類,使得該類在配置檔案可以使用。它指定了對應的運作時行為類型是 enablebinaryformatterbehavior

要使用這個擴充,隻需要在用戶端、服務端做相應的配置即可:

在 system.servicemodel 中添加擴充及行為配置:

為服務終結點添加行為配置 behaviorconfiguration="enableremotingbinaryserialization"。

用戶端同樣添加相應的擴充及行為配置,并添加到服務終結點上即可。

效果圖:

在 WCF 中使用高效的 BinaryFormatter 序列化

以上是使用公司目前正在開發的系統的資料量進行測試的結果。可以看到,使用 wcf 直接二進制序列化時,32000 行資料序列化後大小是 28.34m(黃底),而啟用這個擴充進行序列化後大小是 13.89m(淺綠底)。當同時使用 wcf 二進制序列化及 binaryformatter 序列化後,資料大小是10.42 m(綠底)。

在 WCF 中使用高效的 BinaryFormatter 序列化

同時使用多次序列化,雖然資料量會更小,但是序列化時間卻增多。使用時,需要根據實際情況來調整。