Marshalling

z Wikipédie, slobodnej encyklopédie
Prejsť na: navigácia, hľadanie

Marshalling je pojem z oblasti programovania, používaný hlavne v oblasti COM a ActiveX.

Úvod[upraviť | upraviť zdroj]

V programátorskej praxi sa často vyskytuje, že je potrebné poslať nejakému programu alebo funkcii objekt, ktorý táto funkcia chce zmeniť, alebo zavolať jeho metódy.

Jednoduchá metóda je poslať pointer na tento objekt. V rámci jedného procesu to funguje vynikajúco a je to pre tento prípad aj najefektívnejšia možná metóda. To však nefunguje, keď tá funkcia beží v inom procese alebo na inom počítači. Tam je už daný pointer neplatný.

Ďalší prípad je, keď je potrebné zavolať metódu objektu, ktorý bol vytvorený v druhom threade. Tam je síce jeho pointer platný, ale metóda zbehne v prvom threade. Niekedy ale treba, aby táto metóda zbehla v threade, ktorému tento objekt patrí.

Tu nastupuje marshalling.

Proces[upraviť | upraviť zdroj]

COM a ActiveX[upraviť | upraviť zdroj]

COM a ActiveX riešia tento problém tak, že každý objekt beží v nejakej zóne, tzv. apartmente. V apartmente beží message loop. Ak niekto z iného apartmentu (iný thread, proces alebo počítač) zavolá metódu z jeho objektu, automaticky sa postará aby bola zavolaná a aj návratová hodnotu pošle späť.

Postup je približne takýto:

  1. Všetky parametre danej metódy zbalia do jedného streamu.
  2. Tento stream spolu s informáciou ktorú funkciu pošlú na RPC procesu alebo počítača, na ktorom sa tento objekt nachádza
  3. V RPC beží message loop ktorý dostane správu spolu s týmto streamom
  4. RPC tento strem rozbalí späť na parametre a zavolá metódu objektu, ku ktorému má priamy prístup
  5. Návratové hodnoty sa zabalia do streamu a pošlú naspäť volajúcemu apartmentu.

Ak v cieľovom apartmente nefunguje message loop, alebo nefunguje sieť, volanie sa nikdy nevykoná.

Tento proces je obyčajne transparentný, netreba robiť žiadne dodatočné operácie, z hľadiska programátora sa len zavolá objekt.