JCE文件是TAF框架中客户端和服务端的通信协议;
JCE是一种类c++语言的标识符,用于生成具体的服务接口文件;
JCE文件的扩展名必须以.jce为扩展名;
对于结构定义,可以支持扩展字段,即可以增加字段而不影响以前结构的解析,可以在存储/协议等地方单独使用;
大小写敏感;
2.词法规则2.1注释采用c++的注释规范。//表示注释一行,/**/表示注释范围中的所有代码。
2.2标识符
所有标识符不能以’taf_’开头,且必须以字母开头,同时不能和关键字冲突。
3.关键字void,struct,bool,byte,short,int,double,float,long,string,vector,map,key,routekey,module,interface,out,require,optional,false,true,enum,const
4.基本类型支持的基本类型包括以下:void:只能在函数的返回值表示
bool
byte
short
int
long
float
double
string
vector:数组
map:关联map
说明:
可以自定义struct;
vector和map可以和任何类型嵌套
注意:如果传二进制的数据,请务必用vectorbyte传递,不要使用string,因为java中需要用byte[]传二进制,而不能用String(string在java中有字符集的概念)。
5.复杂类型5.1枚举枚举类型的定义如下:
enumTE
{
E1,
E2,
E3
};
说明:
枚举类型不支持在指定枚举变量的值,例如不支持:E1=1这种定义方式;
第一个定义的枚举类型值为0,这里E1的值为0;
枚举类型在jce文件定义后,通过jce2cpp或jce2java生成以后,除了会生成相应的enum定义之外,会生成etos和stoe函数,将枚举值转换成字符串,以及将字符串转换成枚举值,在代码调试时会非常方便。
建议jce文件中,所有接口都以int返回,且返回值在jce中以枚举来定义。
5.2常量Jce文件中可以定义常量,例如:
constinta=0;
conststrings=“abc”;
说明:
由于map,vector没有描述常量的值,因此不支持map,vector的常量定义;
5.3结构结构定义如下:
structKeyStruct
{
0requirestrings;
1optionalinti=23;
};
key[KeyStruct,s,i];
tag说明:
第一列数字表示该字段的标识(tag),无论结构增减字段,该字段得值都不变,必须和响应的字段对应;
Tag的值必须要=0且=
require表示该字段必选;
optional表示该字段可选;
对于optional字段,可以有一个缺省值;
Key说明:
key表示结构的小于比较符号,缺省时Struct是没有小于操作的,如果定义了key,则生成小于比较符,在需要将结构体作为key放入map时需要;
key详细说明:
key[Stuct,member…]:Struct表示结构的名称;Member表示该结构的成员变量,可以有多个;
生成的小于比较操作符,按照key中成员变量定义的顺序进行优先比较;
生成小于比较操作符以后,该结构就可以作为map的key;
其他说明:
对于结构而言,提供两个成员函数用于直接打印出结构的内容,可以用于调试和记录日志:
ostreamdisplay(ostream_os,int_level=0):直接打印结构的详细内容,主要用于调试;
ostreamdisplaySimple(ostream_os,int_level=0):所有成员变量自动按照顺序以
分隔打印出来,用于记录日志;
TAF框架中提供了日志宏,记录日志,可以直接使用,例如:
a.display(LOG-debug());
5.4序列序列用vector来定义,如下:
vectorintvi;
对应到c++中为:vectorint;
对应到java中为:int[]
5.5字典字典用map来定义,如下:
mapint,stringm;
说明:
对于struct,通常不能作为map的key,因此struct没有大小比较符号;
如果需要struct能够作为map的key,需要用less定义struct中成员变量的比较顺序;
对应到c++中为:mapint,string
对应到java中为:HashMapInteger,String
5.6嵌套任何struct,map,vector都可以嵌套;
6.名字空间所有的struct,interface必须在名字空间中,例如:moduleMemCache{structKey
{
0requirestrings;
};
structValue
{
0requirestrings;
};
interfaceMemCacheI
{
intget(Keyk,outValuev);
intset(Keyk,Valuev);
intsetDirty(Keyk,boolb,intt);
intcheckDirty(Keyk);
};
};
说明:
名字空间不能嵌套;
可以引用其他名字空间,例如:Demo1::Key
7.接口接口定义如下,例如:
interfaceDemo
{
intget(outvectormapint,stringv);
intset(vectormapint,stringv);
};
说明:
Out表示输出参数;
接口定义后,会自动生成同步接口和异步接口;
北京哪治疗白癜风好白癜风该如何治疗