1、代表size的长度字段:
值小于255用1个字节标示,如果大于255则使用5个字节,第一个字节为255,后续的4个字节标示真实长度
2、基本数据类型按照小端序进行实际长度编码
3、字符串被编码成size加utf-8的实际内容,注意不包含结束字符
4、sequence被编码成size加实际元素编码
5、枚举值被按照元素个数来进行字节编码,枚举的第一个元素取值被编码成0
如果枚举元素个数小于128个,那么使用一个字节,小于32768则使用2个字节,否则使用4个字节
6、结构按照成员顺序进行编码
7、异常被按照如下的顺序进行编码:bool + (异常名 + 异常长度 + 异常内容)... + 类编码
(异常名 + 异常长度 + 异常内容)部分按照先子类异常后基类异常的方式进行编码
8、类的编码按照如下顺序进行:实例编号+(类名标示+类名/类编号+类长度+类内容)...
类名标示如果为0,则使用类名、否则使用类索引,按照类名出现的顺序从1开始编号
(类名标示+类名/类编号+类长度+类内容)按照先子类后基类方式编码,注意最后肯定有object基类
9、当碰到指针需要进行编码时,指针使用的实例编号为所指向实例的负值
10、代理被按照如下的方式进行编码:ID + facet + mode + secure + endpoints/adapterid
11、ICE使用如下5类消息:
A、请求消息(messageType:0)
struct RequestData
{
int requestId; // 请求序列号,和应答匹配,0标示单向调用无应答
Ice::Identity id; // 对象标示
Ice::StringSeq facet; // facet名称
string operation; // 操作标示
byte mode; // 调用模式(0=normal, 2=idempotent)
Ice::Context context; // 上下文
Encapsulation params; // 输入参数
};
B、批量请求消息(messageType:1)
struct BatchRequestData
{
Ice::Identity id;
Ice::StringSeq facet;
string operation;
byte mode;
Ice::Context context;
Encapsulation params;
};
C、应答消息(messageType:2)
struct ReplyData
{
int requestId;
byte replyStatus; // 0:成功 用户异常1 对象不存在2 facet不存在3 操作部存在4 未知本地异常5 未知用户异常6 未知异常7
Encapsulation body;
};
D、验证连接消息(messageType:3)
E、关闭连接消息(messageType:4)
12、所有类型消息的公共消息头部分结构如下:
struct HeaderData
{
int magic; // 固定:IceP
byte protocolMajor; // 版本号
byte protocolMinor;
byte encodingMajor;
byte encodingMinor;
byte messageType; // 消息类型
byte compressionStatus; // 压缩标记 0:未压缩 1:未压缩但可以接受压缩应答 2:已压缩可以接受压缩应答
int messageSize; // 消息长度
};
13、小于100个字节的消息是不会进行压缩处理的
值小于255用1个字节标示,如果大于255则使用5个字节,第一个字节为255,后续的4个字节标示真实长度
2、基本数据类型按照小端序进行实际长度编码
3、字符串被编码成size加utf-8的实际内容,注意不包含结束字符
4、sequence被编码成size加实际元素编码
5、枚举值被按照元素个数来进行字节编码,枚举的第一个元素取值被编码成0
如果枚举元素个数小于128个,那么使用一个字节,小于32768则使用2个字节,否则使用4个字节
6、结构按照成员顺序进行编码
7、异常被按照如下的顺序进行编码:bool + (异常名 + 异常长度 + 异常内容)... + 类编码
(异常名 + 异常长度 + 异常内容)部分按照先子类异常后基类异常的方式进行编码
8、类的编码按照如下顺序进行:实例编号+(类名标示+类名/类编号+类长度+类内容)...
类名标示如果为0,则使用类名、否则使用类索引,按照类名出现的顺序从1开始编号
(类名标示+类名/类编号+类长度+类内容)按照先子类后基类方式编码,注意最后肯定有object基类
9、当碰到指针需要进行编码时,指针使用的实例编号为所指向实例的负值
10、代理被按照如下的方式进行编码:ID + facet + mode + secure + endpoints/adapterid
11、ICE使用如下5类消息:
A、请求消息(messageType:0)
struct RequestData
{
int requestId; // 请求序列号,和应答匹配,0标示单向调用无应答
Ice::Identity id; // 对象标示
Ice::StringSeq facet; // facet名称
string operation; // 操作标示
byte mode; // 调用模式(0=normal, 2=idempotent)
Ice::Context context; // 上下文
Encapsulation params; // 输入参数
};
B、批量请求消息(messageType:1)
struct BatchRequestData
{
Ice::Identity id;
Ice::StringSeq facet;
string operation;
byte mode;
Ice::Context context;
Encapsulation params;
};
C、应答消息(messageType:2)
struct ReplyData
{
int requestId;
byte replyStatus; // 0:成功 用户异常1 对象不存在2 facet不存在3 操作部存在4 未知本地异常5 未知用户异常6 未知异常7
Encapsulation body;
};
D、验证连接消息(messageType:3)
E、关闭连接消息(messageType:4)
12、所有类型消息的公共消息头部分结构如下:
struct HeaderData
{
int magic; // 固定:IceP
byte protocolMajor; // 版本号
byte protocolMinor;
byte encodingMajor;
byte encodingMinor;
byte messageType; // 消息类型
byte compressionStatus; // 压缩标记 0:未压缩 1:未压缩但可以接受压缩应答 2:已压缩可以接受压缩应答
int messageSize; // 消息长度
};
13、小于100个字节的消息是不会进行压缩处理的