一步一步學Remoting之三 複雜物件

2022-03-24 11:03:29 字數 2663 閱讀 7322

一步一步學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}}} 

=(remoteobject.myobject)activator.createinstance(

typeof

(remoteobject.myobject),

null

,new

object

);remoteobject.mbv mbv==

=new

remoteobject.mbv(

100//

mbr=new remoteobject.mbr(200);

////

console.readline();

=(remoteobject.myobject)activator.getobject(

typeof

"serviceurl

"]);

//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之三 複雜物件

這裡說的複雜物件是比較複雜的類的例項,比如說我們在應用中經常使用的dataset,我們自己的類等,通常我們會給遠端的物件傳遞一些自己的類,或者要求物件返回處理的結果,這個時候通常也就是需要遠端物件有狀態,上次我們說了幾種啟用模式提到說只有客戶端啟用和singleton是有狀態的,而客戶端啟用和sin...

原創 一步一步學Remoting之三 複雜物件

一步一步學remoting之三 複雜物件 這裡說的複雜物件是比較複雜的類的例項,比如說我們在應用中經常使用的dataset,我們自己的類等,通常我們會給遠端的物件傳遞一些自己的類,或者要求物件返回處理的結果,這個時候通常也就是需要遠端物件有狀態,上次我們說了幾種啟用模式提到說只有客戶端啟用和sing...

一步一步學Remoting系列文章

原創 一步一步學remoting之一 從簡單開始 原創 一步一步學remoting之二 啟用模式 原創 一步一步學remoting之三 複雜物件 原創 一步一步學remoting之四 承載方式 1 原創 一步一步學remoting之四 承載方式 2 原創 一步一步學remoting之五 非同步操作 ...