簡介
用途
Marshalling被用於實現不同的遠程過程調用(RPC)機制,這必須用到進程間的數據傳輸。Microsoft的組件對象模型(COM)中,當跨COM的套間(apartment)傳遞接口指針時,接口指針必須被marshalled。在.NET Framework下,在非受管(unmanaged)類型與CLR類型間,例如P/Invoke過程,必須做marshalling。例如,C#程式調用C語言寫的DLL,其中函式參數使用字元串,就需要做marshalling。
使用Mozilla應用程式框架的XPCOM的腳本或應用程式,廣泛使用marshalling。
例子
Microsoft Windows系列作業系統,Direct3D設備驅動程式是核心態驅動程式。DirectX運行時處理用戶態API。用戶態執行系統調用來執行核心態操作,需要CPU切換為核心態,這將耗費微秒級的時間來完成。在此期間,CPU不能執行任何操作。為最佳化性能,必須極小化CPU這種模式切換。 LinuxOpenGL驅動程式分為兩部分:核心驅動與用戶空間驅動。用戶空間驅動把所有OpenGL命令翻譯為機器碼提交給GPU。為減少系統調用,用戶空間驅動實現marshalling。當GPU的命令緩衝區(command buffer)裝滿了繪圖數據,API簡單地把請求繪製的調用存放在一個臨時緩衝區;當命令緩衝區接近為空,執行核心模式切換一次性增加被存儲的命令。
與序列化的比較
序列化一個對象意味著把它的狀態轉化為位元組流,使這個位元組流能反向轉化為該對象的一個副本。
術語“marshal”被Python標準庫認為與“序列化”同義。但與Java相關的RFC 2713不認為二者是同義:
"marshal"一個對象意味著記錄下它的狀態與codebase(s)在這種方式,以便當這個marshal對象在被"unmarshalled"時,可以獲得最初代碼的一個副本,可能會自動裝入這個對象的類定義。可以marshal任何能被序列化或遠程(即實現java.rmi.Remote接口)。Marshalling類似序列化,除了marshalling也記錄codebases。Marshalling不同於序列化是marshalling特別處理遠程對象。
JBoss的Marshalling序列化框架
JBoss Marshalling是一個Java對象序列化包,對JDK默認的序列化框架進行了最佳化,但又保持跟java.io.Serializable接口的兼容,同時增加了一些可調的參數和附加的特性,這些參數和特性可通過工廠類進行配置。
編解碼工廠類:
服務端代碼示例:
客戶端代碼示例:
運行結果:
服務端結果:
客戶端結果: