Marshalling

Marshalling

Marshalling可譯作集結、結集、編碼、編組、編集、安整、數據打包等,是計算機科學中把一個對象的記憶體表示變換為適合存儲或傳送的數據格式的過程。典型用於數據必須在一個程式的兩個部分之間移動,或者必須從一個程式移動到另一個程式。Marshalling類似於序列化,可用於一個對象與一個遠程對象通信。逆過程被稱作unmarshalling。

簡介

用途

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接口的兼容,同時增加了一些可調的參數和附加的特性,這些參數和特性可通過工廠類進行配置。

編解碼工廠類:

服務端代碼示例:

客戶端代碼示例:

運行結果:

服務端結果:

客戶端結果:

相關詞條

熱門詞條

聯絡我們