一步一步學remoting之三:複雜物件
這裡說的複雜物件是比較複雜的類的例項,比如說我們在應用中經常使用的dataset,我們自己的類等,通常我們會給遠端的物件傳遞一些自己的類,或者要求物件返回處理的結果,這個時候通常也就是需要遠端物件有狀態,上次我們說了幾種啟用模式提到說只有客戶端啟用和singleton是有狀態的,而客戶端啟用和singleton區別在於singleton是共享物件的。因此我們可以選擇符合自己條件的啟用方式:
狀態 擁有各自例項
singleton 有 無
singlecall 無 有
客戶端啟用 有 有
在這裡,我們先演示自定義類的傳入傳出:
先說乙個概念:mbv就是按值編碼,物件儲存在資料流中,用於在網路另外一端建立物件副本。mbr就是按引用編組,在客戶機上建立**,遠端物件建立objref例項,例項被序列化傳遞。
我們先來修改一下遠端物件:
using
system;
namespace
remoteobject
public
mbv getmbv()
public
mbr getmbr()
public
void
setmbv(mbv mbv)
public
intusembv()
public
void
setmbr(mbr mbr)
public
intusembr()
} [serializable]
public
class
mbvpublic
intdata
set}
}public
class
mbr:marshalbyrefobject
public
intdata
set}}}
get方法用來從伺服器返回物件,set方法用於傳遞物件到伺服器,use方法用來測試遠端物件的狀態是否得到了儲存。
我們先來測試一下客戶端啟用模式:(伺服器端的設定就不說了)
=(remoteobject.myobject)activator.createinstance(
typeof
(remoteobject.myobject),
null
,new
object
);remoteobject.mbv mbv==
=new
remoteobject.mbv(
100//
mbr=new remoteobject.mbr(200);
////
console.readline();
依次顯示:100,200,100
前面2個100,200說明我們得到了伺服器端返回的物件(分別是mbv和mbr方式的),後面乙個100說明我們客戶端建立了乙個mbv的物件傳遞給了伺服器,因為客戶端啟用模式是有狀態的所以我們能使用這個物件從而輸出100,最後我們注釋了幾行,當開啟注釋執行後出現異常「由於安全限制,無法訪問型別 system.runtime.remoting.objref。」這個在【通道】一節中會講到原因。
好了,我們再來測試一下singleton(別忘記修改客戶端配置檔案中的uri哦)
=(remoteobject.myobject)activator.getobject(
typeof
"serviceurl
"]);//
後面的語句省略,執行後同樣出現100,200,100-》singleton也是能儲存狀態的。
再看一下.net內建的一些複雜物件,比如dataset,可能傳入傳出dataset和datatable在應用中比較普遍,一些不可序列話的類我們不能直接傳遞,比如datarow等,要傳遞的時候可以考慮放入datatable容器中。
遠端物件修改如下:
using
system;
using
system.data;
namespace
remoteobject
return
ds;}}}
客戶端修改如下:
=(remoteobject.myobject)activator.getobject(
typeof
"serviceurl
"]);
dataset ds
=new
dataset();
datatable dt
=new
datatable();
dt.columns.add(
newdatacolumn(
"test",
typeof
(system.string)));
datarow dr
=dt.newrow();
dr["
test"]
="data";
dt.rows.add(dr);
ds.tables.add(dt);ds=
0].rows[0][
"test
"].tostring());
console.readline();
執行後發現輸出data_ok了。在這裡不管用哪種模式來啟用都會得到data_ok,因為我們並沒有要求遠端物件來儲存狀態。
總結:所有必須跨越應用程式域的本地物件都必須按數值來傳遞,並且應該用[serializable]自定義屬性作標記,否則它們必須實現iserializable介面。物件作為引數傳遞時,框架將該物件序列化並傳輸到目標應用程式域,物件將在該目標應用程式域中被重新構造。無法序列化的本地物件將不能傳遞到其他應用程式域中,因而也不能遠端處理。通過從marshalbyrefobject匯出物件,可以使任一物件變為遠端物件。當某個客戶端啟用乙個遠端物件時,它將接收到該遠端物件的**。對該**的所有操作都被適當地重新定向,使遠端處理基礎結構能夠正確擷取和**呼叫。儘管這種重新定向對效能有一些影響,但 jit 編譯器和執行引擎 (ee) 已經優化,可以在**和遠端物件駐留在同乙個應用程式域中時,防止不必要的效能損失。如果**和遠端物件不在同乙個應用程式域中,則堆疊中的所有方法呼叫引數會被轉換為訊息並被傳輸到遠端應用程式域,這些訊息將在該遠端應用程式域中被轉換為原來的堆疊幀,同時該方法呼叫也會被呼叫。從方法呼叫中返回結果時也使用同一過程。
附msdn有關章節:
原創 一步一步學Remoting之一 從簡單開始
一步一步學remoting之一 從簡單開始 一 remoting的優缺點?優點 1 能讓我們進行分布式開發 2 tcp通道的remoting速度非常快 3 雖然是遠端的,但是非常接近於本地呼叫物件 4 可以做到保持物件的狀態 5 沒有應用程式限制,可以是控制台,winform,iis,windows...
原創 一步一步學Remoting之一 從簡單開始
一步一步學remoting之一 從簡單開始 一 remoting的優缺點?優點 1 能讓我們進行分布式開發 2 tcp通道的remoting速度非常快 3 雖然是遠端的,但是非常接近於本地呼叫物件 4 可以做到保持物件的狀態 5 沒有應用程式限制,可以是控制台,winform,iis,windows...
一步一步學Remoting系列文章
原創 一步一步學remoting之一 從簡單開始 原創 一步一步學remoting之二 啟用模式 原創 一步一步學remoting之三 複雜物件 原創 一步一步學remoting之四 承載方式 1 原創 一步一步學remoting之四 承載方式 2 原創 一步一步學remoting之五 非同步操作 ...