打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ICE参数传递分析

ICE参数传递分析

       ICE由于涉及到不同进程甚至不同主机间的调用,所以需要对参数做些处理,下面以ICE自带的例子printer,并为他加入几个类型和函数进行分析。

 

       ICE为每个内置类型在IceInternal::BasicStream中写了readwrite函数,为stringvector<string>vector<T>也写了readwrite函数。如果参数类型为以上类型那么就直接使用。如果参数类型为复杂的STL类型,如vector< vector<string> >ICE在编译ice接口文件时会为该类型生成一对__read__write函数。如果内部使用了结构体,那么编译ice接口文件时会为该结构体生成一对__read__write函数,这两个函数将内部成员分别调用IceInternal::BasicStream中的readwrite函数。

 

       参数类型分三种,输入、输出和返回,但是返回和输出基本一样。

输入参数

结构体

       简单结构体为只有内置类型的机构体。ICE通过ice接口文件为结构体添加两个函数__read__write,读和写都通过这两个函数进行。这两个函数在调用IceInternal::BasicStream里每个基本类型的readwrite函数写到缓冲中。

 

string型输入参数

       下面以printString为例说明

l         客户端调用printString

l         调用IceProxy空间的printString函数

l         调用IceProxy空间的带Ice::ContextprintString函数

l         调用IceDelegateM空间的printString函数

l         调用IceInternal::BasicStream::write(string&),该函数会先写大小到缓冲区,然后将所有数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printString函数

l         调用IceInternal::BasicStream::read,该函数会先读取大小,然后通过一个临时的string对象交换到string

 

vector<string>型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

l         调用IceProxy空间的带Ice::ContextprintArray函数

l         调用IceDelegateM空间的printArray函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printArray函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

vector< vector<string> >型输入参数

下面以printArray为例说明

l         客户端调用printArray

l         调用IceProxy空间的printArray函数

l         调用IceProxy空间的带Ice::ContextprintArray函数

l         调用IceDelegateM空间的printArray函数

l         调用由ice接口文件生成的__write函数,先写vector的个数,然后依次调用IceInternal::BasicStream::write(vector<string> &)函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间的__printArray函数

l         调用由ice接口文件生成的__write函数,先读vector的个数,然后依次调用IceInternal::BasicStream::read(vector<string> &)函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

输出参数

string型输出参数

       getString为例说明

l         调用IceProxy空间的getString函数

l         调用IceProxy空间的带Ice::ContextgetString函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getString

l         实际调用具体的getString函数

l         调用IceInternal::BasicStream::write(string&),该函数会先写大小到缓冲区,然后将所有数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用IceInternal::BasicStream::read,该函数会先读取大小,然后通过一个临时的string对象交换到string

 

vector<string>型输出参数

       getArray为例说明

l         调用IceProxy空间的getArray函数

l         调用IceProxy空间的带Ice::ContextgetArray函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getArray

l         实际调用具体的getArray函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

 

vector< vector<string> >型输出参数

       getTable为例说明

l         调用IceProxy空间的getTable函数

l         调用IceProxy空间的带Ice::ContextgetTable函数

l         调用IceInternal::Outgoing::invoke()

 

l         调用到IceInternal::Incoming::invoke()

l         调用IceInternal空间的__dispatch函数

l         调用IceInternal空间___getTable

l         实际调用具体的getTable函数

l         调用由ice接口文件生成的__write函数,先写vector的个数,然后依次调用IceInternal::BasicStream::write(vector<string> &)函数

l         调用IceInternal::BasicStream::write(vector<string> &),该函数会先写大小(字符串个数)到缓冲区,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

l         返回到客户端

l         调用由ice接口文件生成的__write函数,先读vector的个数,然后依次调用IceInternal::BasicStream::read(vector<string> &)函数

l         调用IceInternal::BasicStream::read,该函数会先读取字符串个数大小,然后再依次调用迭代函数IceInternal::BasicStream::write(string &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【转】Zeroc ICE的示例(转载)
一步步学OpenGL(一)
make_shared()
STL模板总结
PHP错误处理的函数和相关信息
stringstream的用法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服