Zhang Jiuan’ Notes

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.

返回顶部