本文将定義一個 wcf 終結點行為擴充,以在 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 直接二進制序列化時,32000 行資料序列化後大小是 28.34m(黃底),而啟用這個擴充進行序列化後大小是 13.89m(淺綠底)。當同時使用 wcf 二進制序列化及 binaryformatter 序列化後,資料大小是10.42 m(綠底)。
同時使用多次序列化,雖然資料量會更小,但是序列化時間卻增多。使用時,需要根據實際情況來調整。