我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类。在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发。在ice中,client和server只是相对于ice object的使用关系,client即使用代理远程调用ice object的一方,server相对就是为ice object提供执行servant的一方。并非我们传统意义上的c/s结构中的client和server。ice object既可以存在地c/s结构的server端,c/s结构的client端同样也可以提供ice object给server端远程调用。

我们先来看一下,slice对定义的空类和空接口如何生成代码,下面是生成的stub存根类和skeleton骨架类的类图。

上面分别在ice文件定义一个空类"Empty"和一个空接口"I",slice分别为我们在名字空间::IceProxy::Module和Module下都生成了class Empty和class I的类。

不论是类还是接口,对于空的定义目标,slice生成的stub存根类都只是重写(override)了静态方法ice_staticId和成员方法_newInstance。上图左边的两个类Empty和I则是stub存根类。再来看右边生成的skeleton骨架类,slice也几乎做了同样的处理,重写(override)了骨架类最小接口ice_id,ice_ids以及ice_isA,还有跟streaming流化相关两个实现函数_iceReadImpl和_iceWriteImpl。唯一不同的是对于定义为类的Empty,它的skeleton骨架类多了两个成员函数ice_clone和ice_factory。

当我们定义一个类或接口,slice就会最少为我们生成上面类图所示的函数。当我们再定义一对非空的类或接口,我们就可以观察到slice为我们生成了什么,下面的类图隐去上面给出的已知。

首先是定义一个有一个方法的简单接口Intf。

灰色的类是Ice项目内置的类,非slice生成的类。slice为我们针对这个接口的远程调用生成了上面的框架的代码。生成的代码比重偏于Stub存根类(即代理方)的使用(如何应用远程调用)上。Skeleton骨架类重写(override)_iceDispatch分派,开设一个待实现的接口方法函数。

然后是定义一个非空的类NotEmpty,简单地有一个成员,成员类型为我们开篇时定义的Empty。

与上面给出接口生成的类图相比,slice对类的生成框架代码主要集在实体端,并且都是与流化(streaming)相关的设施。而生成的Stub存根类和对Empty(空类)生成的Stub存根类一样,因为它并没有接口方法,可以提供给代理进行远程访问。

从上面可以看到不论类还是接口,在代码映射后都是一个类实体。在slice定义时,我们使用这些类或接口时,都看作一个类实体。而使用这些类或接口的指针时,则看作是它们的代理。我们看下面定义

class B;
interface A {
B b;
B* bprx;
}; class B {
};

A::b会映射成::IceInternal::Handle<B>,而A::bprx会映射成::IceInternal::ProxyHandle<B>。指针被看作是一个对象实体的代理(引用)。

不论是类实体还是代理,都可以进行流化(streamin)在远程调用过程中传递。当传递一个指针,就是在传递相对于某个对象实体的代理。通过代理在ice世界任何一处都可以使用远程调用访问目标的实体。但是传递一个实体而非代理时,就和我们的c++语言在函数中传递对象实体一样,会在传递的目的方进行实体的构造。所以在ice程序中,尽管有一方使用代理进行远程访问为主,但它同样需要依赖slice生成的skeleton骨架类的代码,stub存根类和skeleton骨架类的代码并不分开发给c/s两方的开发者。

下面是以ice代码项目的测试例子项目为例,cpp/test/objects。

slice中定义的类图

slice生成的Skeleton骨架类

ZeroC ICE的远程调用框架 class与interface的更多相关文章

  1. ZeroC ICE的远程调用框架 Slice如何帮助我们进行Ice异步编程(AMI,AMD)

    Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架. 当Slice不为我们生成代码时,我们仍然可以按 ...

  2. ZeroC ICE的远程调用框架 AMD

    继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...

  3. ZeroC ICE的远程调用框架

    想搞清楚slice为我们生成了什么样的框架代码,就先搞明白Ice的远程调用框架暗中为我们做了些什么? Ice将Ice Object的方法调用分为三个阶段(或步骤),分别是begin,process和e ...

  4. ZeroC ICE的远程调用框架 AMI与AMD -Why?

    在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...

  5. ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架

    Ice框架提供了不少回调设施,其中一些是使用Ice远程调用进行ami模式或amd模式的支撑.本篇来看一下用于代理端的回调设施. Ice代码中有好几个Callback相关命名的基类,并且slice还会为 ...

  6. ZeroC ICE的远程调用框架 ServantLocator与Locator

    ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...

  7. ZeroC ICE的远程调用框架 ThreadPool

    ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如 ...

  8. ZeroC ICE的远程调用框架 代理引用地址

    在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...

  9. ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator

    ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...

随机推荐

  1. LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)

    LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:h ...

  2. jQuery插件图片懒加载lazyload

    来自XXX的前言: 什么是ImageLazyLoad技术 在页面上图片比较多的时候,打开一张页面必然引起与服务器大数据量的 交互.尤其是对于高清晰的图片,占的几M的空间.ImageLazyLoad技术 ...

  3. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

    配置spring+shiro时,启动tomcat报错异常 严重: Context initialization failedorg.springframework.beans.factory.Bean ...

  4. JVM(8) 线程安全与锁优化

    面向过程编程:程序编写以算法为核心,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间的客体,程序代码则用于处理这些数据.这种思维方式直接站在计算机的角度去抽象问题和解决问题,称为面向过程 ...

  5. vue 父子组件通信详解

    这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...

  6. Java 读取properties 配置文件的几种方式

    基于ClassLoder读取配置文件 Properties properties = new Properties(); // 使用ClassLoader加载properties配置文件生成对应的输入 ...

  7. ManyToMany 字段的使用

    创建一个经典的多对多关系:一本书可以有多个作者,一个作者可以有多本书(如下,csdn复制的图片) 当进行数据迁移时,会生成三张表,了解就好 1,查询数据的操作 : 1.一本书的所有作者 b = Boo ...

  8. 为啥不能#define private public了?

    今天在写一个单元测试的时候出现了如下编译错误: 以前用gtest为了测试业务代码里的private函数和变量,一直是在单元测试代码通过#define private public这样的trick达到测 ...

  9. vue项目中v-for渲染失败

    在项目中,v-for渲染列表失败,无报错,数组有数据.上网查,好多说是因为动态绑定class的原因,但是经过几番测试,都无效果. 在经过不断尝试,搜索,终于找到原因所在. 问题原因:在v-for循环中 ...

  10. Java HashSet对txt文本内容去重(统计小说用过的字或字数)

    Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...