`

ICE笔记(03):客户端Slice到C++映射

 
阅读更多

colorado

按:本文是DPWI第6章的笔记。

客户端Slice到C++映射定义的是:怎样把Slice数据类型翻译成C++类型,客户怎样调用操作、传递参数、处理错误。C++映射线程安全,不存在内存管理问题。不建议查看slice2cpp生成的C++映射文件,但建议掌握C++映射规则。

1、模块映射
module M{...}
映射为
namespace M{...}

2、类型映射
⑴基本类型
Slice C++
bool → bool
byte → Ice::Byte
short → Ice::Short
int → Ice::Int
long → Ice::Long
float → Ice::Float
double → Ice::Double
string → std::string


⑵复杂类型
Slice C++
枚举 → 枚举
结构 → 结构,支持比较符,可用于Slice词典键类型,支持深度复制、赋值。
序列 → std::vector,可以映射为list,dequeue,数组,范围。
词典 → std::map。


3、异常映射
异常可映射为同名C++类,支持如下操作:
• ice_name  异常的名字。
• ice_clone 多态克隆异常,在不知道异常类型情况下复制异常。
• ice_throw 在不知道某个异常的确切运行时类型的情况下抛出它。
• ice_print 打印异常的名字,或直接使用重载的<<操作符:


try {
// ...
} catch (const Ice::Exception & e) {
cerr << e << endl;
}

出于效率上的考虑,总是通过const引用捕捉异常。这样,编译器就能够生成不调用异常复制构造器的代码(当然,同时也防止异常被切成基类型)。调用操作抛出异常时,该操作的out参数是否赋值无法确定,但是操作的返回值肯定没有返回。

一条异常路径:

• Ice::ConnectTimeoutException

• Ice::TimeoutException

• Ice::LocalException

• Ice::UserException

• Ice::Exception
很少需要以最深派生类型捕获运行时异常,而是以LocalException捕获它们;对细粒度异常处理感兴趣的,主要是Ice运行时实现。

4、接口映射
module M {
interface Simple {
void op();
};
};
客户端,接口映射到类:

namespace IceProxy {
namespace M {
class Simple;
}
}
namespace M{
class Simple; — 代理类
typedef IceInternal::ProxyHandle< ::IceProxy::M::Simple> SimplePrx; — 代理句柄
typedef IceInternal::Handle< ::M::Simple> SimplePtr;
}
namespace IceProxy {
namespace M {
class Simple : public virtual IceProxy::Ice::Object {
public:
typedef ::M::SimplePrx ProxyType;
typedef ::M::SimplePtr PointerType;
void op();
void op(const Ice::Context&);
//....
};
};
}
IceProxy::M::Simple是服务器Simple接口的客户端代理类,它继承自IceProxy::Ice::Object。接口中的每个操作,代理类都有两个重载的、同名的成员函数。其中一个函数的最后一个参数的类型是Ice::Context——Ice上下文,dictionary<string, string>结构,客户端向服务器发送请求时,将该结构一起发送。

客户端不能直接实例化代理类:
IceProxy::M::Simple s; ← 错误
客户端只能使用代理句柄SimplePrx访问代理类Simple。代理句柄能够自动管理内存,支持赋值和比较操作符:
SimplePrx prx1 = ...;
SimplePrx prx2(prx1);
prx1=prx2;
assert(prx1==prx2);
cout << prx1 << ';' << prx2 << endl; ← 等效方法 prx->ice_toString()
类似方法:communicator->proxyToString(prx);

BasePrx base = ...;
DerivedPrx derived = DerivedPrx::checkedCast(base); ← 检查转换:远程访问,失败时返回null。
derived = DerivedPrx::uncheckedCast(base); ← 不检查的转换:不进行远程访问,失败时行为不确定。

代理方法:
Ice::ObjectPrx base = communicator->stringToProxy(...);
HelloPrx hello = HelloPrx::checkedCast(base);
hello = hello->ice_timeout(10000);
hello->sayHello();

代理比较:
代理同一性比较:==,!=,<,<=,>,>=比较,布尔比较;
代理的对象同一性比较:
bool proxyIdentityLess(p1,p2);
bool proxyIdentityEqual(p1,p2);
bool proxyIdentityAndFacetLess(p1,p2);
bool proxyIdentityAndFacetEqual(p1,p2);

5、操作映射
对于所有被映射的Slice 类型而言都一样:你可以安全地忽略操作的返回值,不管它的类型是什么——返回值总是通过传值返回。如果你忽略返回值,不会发生内存泄漏,因为返回值的析构器会按照需要释放内存。

in 参数,使用传值或const引用传递;
out参数,使用引用传递。

支持链式调用:
p2->setName(p1->getName()); ← p1,p2为代理

6、异常处理
SimplePrx p = ...;
try {
p->op();
} catch (const SimpleError & t) {
cout << "Simple Error: " << t.reason << endl;
}
应该总是使用const引用捕捉异常。这样,编译器就能生成不调用异常复制构造器的代码,同时防止异常切成基类型。操作抛出异常后,操作的参数是否已改变不能确定;但是接收操作返回值的变量没有被改写。

7、类映射:
Slice类映射到同名C++类。
• 每个成员映射为C++类public成员;
• 每个操作映射为虚成员函数;
• 类继承自Ice::Object(代理类继承自Ice::ObjectPrx);
• 两个构造器,一个缺省,一个带有所有成员参数;
• 生成<class-name>Ptr智能指针(<class-name>Prx是代理句柄)。

类继承自Ice::Object基类的成员函数:
• ice_isA:是否支持指定类型ID
• ice_ping:类可达测试
• ice_ids:对象支持的类序列,从根类到最深派生类
• ice_id:类的实际ID
• ice_staticId:类的静态类型ID
• ice_hash:类的哈希值
• ice_clone:多态浅复制
• ice_preMarshal:整编本类前调用
• ice_postUnmarshal:解编本类后调用
• ice_dispatch:请求分派给服务者
• 比较操作符:== != < <= > >=

类成员可见性:
修改类成员的可见性,使用元数据指令:["protected"]

类的构造函数:
类的缺省构造函数,构造每个数据成员,简单内置类型不初始化,复杂类型使用该类型自己的缺省构造初始化。
类的非缺省构造函数,每个数据成员一个参数,可以用一条语句构造和初始化。所有参数按照基类到派生类的顺序,加入参数序列。

类的操作:
类的操作被映射为纯虚成员函数,必须创建派生类,实现这些操作,才能使用类。

类工厂:
有操作的类必须提供类工厂,无操作的类不必提供类工厂。
⑴实现类工厂
class SimpleFactory : public Ice::ObjectFactory {
public:
virtual Ice::ObjectPtr create(const std::string &) {
assert(type == M::Simple::ice_staticId());
return new SimpleI;
}
virtual void destroy() {}
};
⑵注册类工厂:
Ice::CommunicatorPtr ic = ...;
ic->addObjectFactory(new SimpleFactory, M::Simple::ice_staticId());
⑶使用类工厂:
现在,每当Ice实例化M::Simple类时,就会自动调用SimpleFactory的create方法,创建SimpleI类,客户端可以使用该类的op方法。

类的智能指针:
Slice 编译器会为每种类类型生成智能指针。对于Slice类<class-name>,编译器会生成叫作<class-name>Ptr 的C++ 智能指针:
TimeOfDayPtr tod = new TimeOfDayI;
不能在栈上分配类实例,也不能用静态变量定义类实例。类必须由new分配。

智能指针是异常安全的,当抛出异常时,智能指针能够安全地析构。但要注意:在构造器中抛出异常,可能使得智能指针不安全;循环引用的情况下,智能指针也会不安全,这种情况下,可以使用Ice::collectGarbage(); 收集因循环引用没有释放的对象。当然只有在循环引用的情况下,垃圾收集器才有用。在没有循环引用的情况下,使用垃圾收集器没有意义。把Ice.GC.Interval 设成5,收集器线程就会每5秒运行一次垃圾收集器。

智能指针的比较只会比较内存地址,即比较两个指针是否指向同一物理类实例。

分享到:
评论

相关推荐

    zeroc ice教程 ice环境配置 Ice中文教程 C++ ICE java ICE ICE入门 ice基础教程 ice开发文档

    从编程语言映射的角度看,文档深入讲解了Slice到C++和Java的映射机制。在C++映射章节中,文档涵盖了标识符映射、模块映射、简单内建类型映射、用户定义类型映射、接口映射、操作映射以及异常处理等。这些内容对开发...

    ICE框架 C++示例程序

    3. **接口定义语言(IDL)**:ICE使用称为“Slice”的接口定义语言来描述服务接口, Slice文件可以被编译成不同语言的客户端和服务器端代码。 4. **自动类型映射**:ICE支持基本数据类型和自定义类型的自动序列化和...

    一个ICE的简单应用(客户端,服务端都有)

    - `ICEtext`很可能是一个包含示例代码或说明文档的文件,它可能展示了如何在C++中创建一个简单的ICE客户端和服务端,包括如何定义Slice接口、编译Slice、创建代理、调用服务以及处理响应。 6. **调试和日志**: -...

    ICE客户端与服务端通信Demo

    平台编译环境:VS2017 ICE版本:3.7.7 ICEbuilder:5.0.9 源码中有两套程序: Server:启动服务器,等待连接 。连接后可双方通信 Client:连接服务器,与服务器通讯。...Slice: 手写几个接口即可。

    ICE中间件教程

    **4.2 客户端Slice到C++的映射** - **4.2.1 模块映射**:将Slice中的模块映射到C++命名空间。 - **4.2.2 类型映射**:将Slice中的数据类型映射到相应的C++类型。 - **4.2.3 异常映射**:将Slice中的异常映射到C++...

    ice分布式应用开发

    - **Ice**支持将Slice定义转换为C++或Java代码,从而简化了客户端和服务端的开发过程。映射规则主要包括: - 类型映射:将Slice中的类型映射为相应的C++或Java类型。 - 接口映射:将Slice接口映射为C++类或Java...

    zeroc ice微服务架构用户手册

    * 客户端响应:服务器端将响应结果返回到客户端。 Overview of the Ice Protocol Ice 协议是 Ice 架构模型中的一种通信协议,负责在客户端和服务器端之间传输数据。Ice 协议的主要特点包括: * 高性能:Ice 协议...

    ICE中文编程指南

    #### 五、客户端的Slice到语言映射 - **C++映射**: - Slice定义被转换成C++代码,包括头文件和实现文件。 - 映射规则包括标识符、类型、异常等方面的转换。 - **Java映射**: - Slice定义同样被转换成Java代码...

    Ice-1.3.0-中文文档.pdf

    7. 客户端映射: - 书籍讨论了如何将Slice定义映射到C++和Java客户端代码。 - 涉及了标识符映射、模块映射、类型映射以及如何处理异常等。 - 提供了slice2cpp和slice2java命令行选项的说明。 8. 具体应用示例: -...

    ice分布式程序设计中文版

    第三部分专注于客户端的Slice-to-C++映射和Slice-to-Java映射。对于C++的映射,书中讲解了标识符的映射、模块、内建类型、用户定义类型、异常处理、接口、操作的映射以及slice2cpp命令行选项。而对Java映射,则包括...

    Zeroc ICE中间件slice2java的ant脚本

    Ice支持多种编程语言,包括Java,C++,Python等,使得应用程序能够轻松地进行网络通信和数据交换。在分布式系统中,中间件起到桥梁的作用,简化了不同组件之间的通信。 “slice2java”是Ice工具集的一部分,用于将 ...

    Ice 分布式程序设计(马维达译)

    - **操作映射**:客户端和服务端的操作映射是通过 Slice 生成的代码自动完成的,简化了开发流程。 - **异常处理**:Ice 提供了一套异常处理机制,可以处理各种通信错误和业务逻辑错误。 #### 知识点五:Hello World...

    ice入门例子

    **Ice入门例子详解** Ice(又称为ZeroC Ice)是一种高性能、跨平台的...通过这个ice入门例子,你可以了解到Ice的基本架构、工作原理和实际应用。随着对Ice的深入理解和实践,你将能够构建出高效、可靠的分布式系统。

    ICE分布式程序设计(中文版).pdf 本人亲测 内部资料

    - **Slice 到 C++ 和 Java 的映射**:ICE 提供了从 Slice 语言到具体编程语言(如 C++ 和 Java)的转换工具,帮助开发者更容易地进行分布式系统的开发工作。 - **C++ 映射**:书中详细介绍了 Slice 语言中的概念...

    ice源码(Ice-3.4.1.tar.gz)

    ICE提供了一种中间件解决方案,支持C++、Java、Python等多种语言,并且通过其“ Slice”接口定义语言,实现跨语言的序列化和通信。ICE 3.4.1是其稳定的一个版本,包含了大量的优化和改进,为开发者提供了更高效、...

    zeroc_ice-3.7.6 for python win_amd64

    Internet 通信引擎 (Ice) 为开发任务关键型网络应用程序提供了一个强大的、经过验证的平台。让 Ice 处理所有底层细节,例如网络连接、序列化和并发性,以便您可以专注于应用程序逻辑。...从 Slice 到 Python 的直观映射

Global site tag (gtag.js) - Google Analytics