原创链接构建应用场景:1).首先,让我们定义一下thrift的简单结构。命名空间javammxf.thrift;structPair{ 1:requiredstringkey 2:requiredstringvalue}requiredmodifier你肯定能猜到它的意思,但是你有没有这样的疑惑,这些数字标识符“1”、“2”是什么意思“?它在序列化机制中起什么作用?编译并执行thrift-genjava2)。编写测试代码privateStringdatafile="1.dat";//*)将对象写入文件publicvoidwriteData()throwsIOException,TException{Pairpair=newPair();pair.setKey("rowkey").setValue("column-family");FileOutputStreamfos=newFileOutputStream(新文件(数据文件));pair.write(newTBinaryProtocol(newTIOStreamTransport(fos)));fos.close();} 调用writeData(),将对象写入文件1.datpair{key=>rowkey,value=>column-family}3).如果我重新定义pair结构,调整数列structPair{ 2:requiredstringkey 1:requiredstringvalue}点评:这里2对应key,1对应value。重新编译thrift-genjava4).然后读取数据privateStringdatafile="1.dat";//*)从文件中恢复对象publicvoidreadData()throwsTException,IOException{ FileInputStreamfis=newFileInputStream(newFile(datafile)); Pairpair=newPair(); pair.read(newTBinaryProtocol(newTIOStreamTransport(fis))); System.out.println("key=>"+pair.getKey()); System.out.println("value=>"+pair.getValue()); fis.close();}调用readData(),从文件1.dat中恢复Pair对象得到结果:key=>column-familyvalue=>rowkeyisitwithyou出乎意料的是,似乎属性名不起作用,id标识在thrift的序列化/反序列化中起着非常重要的作用带着这些疑惑,我们进一步详细解释序列化机制Thrift数据格式说明官网文档说明:http://thrift.apache.org/stat...Thrift中的版本控制是通过字段标识符实现的。Thrift中每个结构成员的字段标头都使用唯一的字段标识符进行编码。该字段标识符及其类型说明符的组合用于唯一标识该字段。Thrift定义语言支持字段标识符的自动分配,但它是一个很好的编程习惯始终明确指定字段标识符。翻译:thrift的向后兼容(Version)是通过属性标识(编号编号id+属性类型type)实现的,可以理解为序列化后(属性数据以field_name:field_value=>id+type:field_value存储)),这也解释了上述场景的原因。前面定义的Pair结构体的代码解释:publicvoidread(org.apache.thrift.protocol.TProtocoliprot,Pairstruct){ //*)读取结构体结束标记 iprot.readStructBegin(); while(iprotisstop){//*)读取Field属性开始标签 schemeField=iprot.readFieldBegin(); //*)字段标签包含id+type,switch赋相关值根据(id+type) switch(schemeField.id){ case:// if(schemeField.type==thrift.TType.){ struct.=iprot.read(); struct.setIsSet(true); } } //*)读取结束标签字段属性的 iprot.readFieldEnd(); } //*)读取结构体的结束标记 iprot.readStructEnd();}代码注释: 从恢复对象的功能上,我们也可以有一个初步的认识thrift定义的序列化对象,最终细化为有组织有序的调用readStructBegin、readFieldBegin、read(readString,readI32,readI64)。数据交换格式分类目前数据交换格式可分为以下几类:1.自解析 序列化数据包含一个完整的结构,包括字段名和值值。比如xml/json/javaserizable,百度的mcpack/compack,都属于这一类。即调整不同属性的顺序对序列化/反序列化没有影响。2.半解析 序列化数据舍弃了一些信息,比如字段名,而是引入索引(通常是id+type)来对应具体的属性和值。这方面的代表有googleprotobuf,thrift也属于这一类。3.非解析型 百度传说中的infpack实现就是用这种方法实现的,舍弃了很多有用的信息,性能/压缩比最好,但是向后兼容需要开发做一定量的工作,详情不详。