Marshal机制
原来想着写这篇文章来着,但因为时间紧,于是耽搁了。今天晚上还有点时间,于是想着补点吧。
背景:
有这样一些应用,那就是需要一些数据原样的从一台机器拷贝到其它机器上。这个过程是自动的,没有人为的干涉就可完成。数据可能是一些基本类型(int float char long char*),也可能是一些复杂类型:对象,接口,数组成。
Marshal机制:
在一个实际调用过程中,列集散集模块将Proxy对应的调用信息打成一个数据包,然后发送到另一进程的Stub进行还原。当然这里并不是绝对的数据还原,比如C语言里面是一个对象类型,到Java的一端要转换成相应的同一规范的等价类型,这些也要靠列集散集机制来完成。另外对每一种类型都用规定大小的内存进行处理,这里数据自描述信息就显的尤为重要了。
Marshal机制的设计:
整个Marshal打包过程中,就是按类型在数据包中分配相应的内存空间的过程,然后将对应的信息动态填入。当每填入一个数据,Idx就会标识到一个新的位置,用来说明已填的数据量。当然,对于字符串、指针、对象及内存地址相关数据的打包要比这里说的要麻烦的多。
Marshal机制的实现:
下面代码给出了与列集散集相关元数据的C语言定义。该部分元数据描述各个内核对象类、接口、方法的各自属性,以及它们之间的关系。用户程序调用内核对象服务的列集散集过程描述如下:
//file metadata.h
……
typedef struct _MethodEntry {
UINT8 paramNum;
CIBaseType *params;
} MethodEntry;
typedef struct _InterfaceEntry {
IID iid;
UINT16 methodNum;
MethodEntry *methods;
} InterfaceEntry;
typedef struct _ClassEntry {
CLSID clsid;
UINT16 interfaceNum;
InterfaceEntry *interfaces;
} ClassEntry;
Marshal机制的应用:
构件间的异步调用。
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!









No Comments, Comment or Ping
Reply to “Marshal机制”
You must be logged in to post a comment.