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 &)将每个字符串的大小和数据拷贝到缓冲区中,并改变缓冲区的位置。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值