列集

列集

在微軟的COM(組件對象模型)中,列集是將參數打包與解包,使得遠程過程(remote procedure)可以進行的過程。[2] 當接口指針要跨越COM單元(apartment)邊界(也就是在COM庫的實例之間跨越)時,必須要對其進行列集操作。[1]

不同的參數以不同的方式進行列集。例如列集一個整形參數只需要簡單地將這個值複製到訊息快取中(即便是這么一個簡單的例子,也可能存在著跨計算機時需要處理的位元組順序)。列集一個數組是一個更複雜的過程。數組成員被以特定的順序複製,從而使另一端可以精確地重構數組。[2]

對於標準的列集方法(standard marshaling),代理對象(proxy)和存根代碼(stub)對於接口來說都是系統寬度(systemwide)的資源,並且它們使用遵循標準協定的通告進行互動與通信。

除了標準列集法還有另一個選擇,那就是自定義的列集方法(custom marshaling)。對於任何一個給定的接口,對象可以選擇COM提供的標準列集法或者是自定義列集法。一旦為給定的接口做出選擇,這種選擇將在一個對象的生命周期里一直保持不變。

組件之間的通信

列集用於組件的通信中。如右圖所示,在進程邊界的客戶端一側,客戶端的方法調用到達代理然後進入屬於COM庫的一部分的通道(channel)。通道將包含有列集過的參數的快取傳送到RPC運行時庫,RPC運行時庫隨後會將這些信息傳遞到進程邊界的另一側。

基本介紹

  • 中文名:列集
  • 外文名:Marshal
COM中的列集,.Net中的列集,Python中的列集,XPCOM中的列集,

COM中的列集

在微軟的COM(組件對象模型)中,列集是將參數打包與解包,使得遠程過程(remote procedure)可以進行的過程。當接口指針要跨越COM單元(apartment)邊界(也就是在COM庫的實例之間跨越)時,必須要對其進行列集操作。
不同的參數以不同的方式進行列集。例如列集一個整形參數只需要簡單地將這個值複製到訊息快取中(即便是這么一個簡單的例子,也可能存在著跨計算機時需要處理的位元組順序)。列集一個數組是一個更複雜的過程。數組成員被以特定的順序複製,從而使另一端可以精確地重構數組。
對於標準的列集方法(standard marshaling),代理對象(proxy)和存根代碼(stub)對於接口來說都是系統寬度(systemwide)的資源,並且它們使用遵循標準協定的通告進行互動與通信。
除了標準列集法還有另一個選擇,那就是自定義的列集方法(custom marshaling)。對於任何一個給定的接口,對象可以選擇COM提供的標準列集法或者是自定義列集法。一旦為給定的接口做出選擇,這種選擇將在一個對象的生命周期里一直保持不變。
列集用於組件的通信中。如右圖所示,在進程邊界的客戶端一側,客戶端的方法調用到達代理然後進入屬於COM庫的一部分的通道(channel)。通道將包含有列集過的參數的快取傳送到RPC運行時庫,RPC運行時庫隨後會將這些信息傳遞到進程邊界的另一側。
組件之間的通信組件之間的通信

.Net中的列集

在.Net Framework中,當P/Invoke進行不受託管的類型(unmanaged type)與CLR類型之間的轉換時,同樣需要列集。
.Net Framework中,MarshalByRefObject類表示必須通過引用進行列集(marshale)的對象;在.Net的世界裡,Windows控制項都是MarshalByRefObject對象,因為它們只在創建它們的進程中有效,必須通過引用才能在這個進程之外使用。

Python中的列集

Python標準庫中,列集(Marshal)一詞被認為與序列化同義。
Python中的列集模組包含可以用於以一種二進制格式讀寫Python變數的函式。這種格式特別用於Python,但獨立於機器的架構(比如,你可以將某個Python變數寫到PC上的一個檔案中,將這個檔案傳輸到Sun平台上,在那兒重新讀取它)。

XPCOM中的列集

列集同樣被廣泛套用於那些利用Mozilla Application Framework所提供的XPCOM技術的應用程式和腳本中。

相關詞條

熱門詞條

聯絡我們