Marshalling
Marshalling je pojem z oblasti programovania, ktorý predstavuje proces transformácie pamäťovej reprezentácie objektu do dátového formátu použiteľného na uchovávanie alebo prenos. Typicky sa používa v situáciách, keď je potrebné dáta presunúť medzi odlišnými časťami počítačového programu, prípadne z jedného programu do druhého. Marshalling je podobný serializácii. Opak marshallingu sa označuje ako unmarshalling (alebo demarshalling, podobne ako deserializácia).
Použitie
[upraviť | upraviť zdroj]Marshalling je používaný v rámci implementácie odlišných mechanizmov remote procedure call (RPC), keď je nutné prenášať dáta medzi procesmi a/alebo medzi vláknami. V technológii Microsoft Component Object Model (COM) musia byť ukazovatele na rozhrania transformované marshallingom, aby mohli prechádzať za hranice tzv. COM apartment (t. j. prechod medzi inštanciami COM knižnice). Ďalším príkladom akcie, ktorá vyžaduje použitie marshallingu, je konverzia medzi nemanažovaným typom a CLR typom, ako napr. pri procese P/Invoke, alebo v jazyku C /CLI.
Marshalling sa tiež značne používa v rámci skriptov a aplikácií, ktoré využívajú technológie XPCOM poskytované aplikačným frameworkom Mozilla.
Úvod
[upraviť | upraviť zdroj]V programátorskej praxi sa často vyskytuje potreba, poskytnúť nejakému programu alebo funkcii objekt, ktorý táto funkcia chce zmeniť, alebo zavolať jeho metódy. Bežne sa na tento účel poskytne ukazovateľ na tento objekt. Použitie tohto riešenia je ideálne, pokiaľ sú obe strany v rámci jedného procesu. Pokiaľ však druhá strana beží v rámci iného procesu alebo dokonca na inom počítači, ukazovateľ už nie je možné jednoducho, resp. vôbec použiť. V tomto prípade je nutné použiť operáciu marshallingu.
Ďalším príkladom je situácia, keď je potrebné zavolať metódu objektu, ktorý bol vytvorený v cudzom vlákne, avšak tak, aby metóda bežala v kontexte vlákna, ktorému tento objekt patrí a nie vlákna, ktoré ju zavolá.
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é vlákno, proces alebo počítač) zavolá metódu z jeho objektu, automaticky sa postará aby bola zavolaná a pošle späť aj návratovú hodnotu.
Rámcový postup je:
- Všetky parametre danej metódy sa zabalia do jedného prúdu.
- Tento prúd spolu s informáciou o požadovanej funkcii sa pošle RPC procesu alebo počítača, na ktorom sa tento objekt nachádza
- V RPC beží message loop, ktorý dostane správu spolu s týmto prúdom
- RPC tento prúd rozbalí späť na parametre a zavolá metódu objektu, ku ktorému má priamy prístup
- Návratové hodnoty sa zabalia do prúdu 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ý, nie je potrebné robiť žiadne dodatočné operácie. Z pohľadu programátora ide len o volanie objektu.