• JAVA RPC (四) 之thrift序列化普通对象


    先简单写一个thrift文件

    本地通过thrift编译之后会生成一个java源文件。------编译口令 :thrift -gen java mytestrequest.thrift

    编译后的源代码如下:

      1 /**
      2  * Autogenerated by Thrift Compiler (0.8.0)
      3  *
      4  * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
      5  *  @generated
      6  */
      7 package com.thrift;
      8 
      9 import org.apache.thrift.scheme.IScheme;
     10 import org.apache.thrift.scheme.SchemeFactory;
     11 import org.apache.thrift.scheme.StandardScheme;
     12 
     13 import org.apache.thrift.scheme.TupleScheme;
     14 import org.apache.thrift.protocol.TTupleProtocol;
     15 import java.util.List;
     16 import java.util.ArrayList;
     17 import java.util.Map;
     18 import java.util.HashMap;
     19 import java.util.EnumMap;
     20 import java.util.Set;
     21 import java.util.HashSet;
     22 import java.util.EnumSet;
     23 import java.util.Collections;
     24 import java.util.BitSet;
     25 import java.nio.ByteBuffer;
     26 import java.util.Arrays;
     27 import org.slf4j.Logger;
     28 import org.slf4j.LoggerFactory;
     29 
     30 /**
     31  * 测试类
     32  * 
     33  */
     34 public class koalasRequest implements org.apache.thrift.TBase<koalasRequest, koalasRequest._Fields>, java.io.Serializable, Cloneable {
     35   private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("koalasRequest");
     36 
     37   private static final org.apache.thrift.protocol.TField AGE_FIELD_DESC = new org.apache.thrift.protocol.TField("age", org.apache.thrift.protocol.TType.I32, (short)1);
     38   private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)2);
     39   private static final org.apache.thrift.protocol.TField ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField("address", org.apache.thrift.protocol.TType.STRING, (short)3);
     40 
     41   private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
     42   static {
     43     schemes.put(StandardScheme.class, new koalasRequestStandardSchemeFactory());
     44     schemes.put(TupleScheme.class, new koalasRequestTupleSchemeFactory());
     45   }
     46 
     47   public int age; // required
     48   public String name; // required
     49   public String address; // required
     50 
     51   /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
     52   public enum _Fields implements org.apache.thrift.TFieldIdEnum {
     53     AGE((short)1, "age"),
     54     NAME((short)2, "name"),
     55     ADDRESS((short)3, "address");
     56 
     57     private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
     58 
     59     static {
     60       for (_Fields field : EnumSet.allOf(_Fields.class)) {
     61         byName.put(field.getFieldName(), field);
     62       }
     63     }
     64 
     65     /**
     66      * Find the _Fields constant that matches fieldId, or null if its not found.
     67      */
     68     public static _Fields findByThriftId(int fieldId) {
     69       switch(fieldId) {
     70         case 1: // AGE
     71           return AGE;
     72         case 2: // NAME
     73           return NAME;
     74         case 3: // ADDRESS
     75           return ADDRESS;
     76         default:
     77           return null;
     78       }
     79     }
     80 
     81     /**
     82      * Find the _Fields constant that matches fieldId, throwing an exception
     83      * if it is not found.
     84      */
     85     public static _Fields findByThriftIdOrThrow(int fieldId) {
     86       _Fields fields = findByThriftId(fieldId);
     87       if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
     88       return fields;
     89     }
     90 
     91     /**
     92      * Find the _Fields constant that matches name, or null if its not found.
     93      */
     94     public static _Fields findByName(String name) {
     95       return byName.get(name);
     96     }
     97 
     98     private final short _thriftId;
     99     private final String _fieldName;
    100 
    101     _Fields(short thriftId, String fieldName) {
    102       _thriftId = thriftId;
    103       _fieldName = fieldName;
    104     }
    105 
    106     public short getThriftFieldId() {
    107       return _thriftId;
    108     }
    109 
    110     public String getFieldName() {
    111       return _fieldName;
    112     }
    113   }
    114 
    115   // isset id assignments
    116   private static final int __AGE_ISSET_ID = 0;
    117   private BitSet __isset_bit_vector = new BitSet(1);
    118   public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
    119   static {
    120     Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    121     tmpMap.put(_Fields.AGE, new org.apache.thrift.meta_data.FieldMetaData("age", org.apache.thrift.TFieldRequirementType.DEFAULT, 
    122         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    123     tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData("name", org.apache.thrift.TFieldRequirementType.DEFAULT, 
    124         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    125     tmpMap.put(_Fields.ADDRESS, new org.apache.thrift.meta_data.FieldMetaData("address", org.apache.thrift.TFieldRequirementType.DEFAULT, 
    126         new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    127     metaDataMap = Collections.unmodifiableMap(tmpMap);
    128     org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(koalasRequest.class, metaDataMap);
    129   }
    130 
    131   public koalasRequest() {
    132   }
    133 
    134   public koalasRequest(
    135     int age,
    136     String name,
    137     String address)
    138   {
    139     this();
    140     this.age = age;
    141     setAgeIsSet(true);
    142     this.name = name;
    143     this.address = address;
    144   }
    145 
    146   /**
    147    * Performs a deep copy on <i>other</i>.
    148    */
    149   public koalasRequest(koalasRequest other) {
    150     __isset_bit_vector.clear();
    151     __isset_bit_vector.or(other.__isset_bit_vector);
    152     this.age = other.age;
    153     if (other.isSetName()) {
    154       this.name = other.name;
    155     }
    156     if (other.isSetAddress()) {
    157       this.address = other.address;
    158     }
    159   }
    160 
    161   public koalasRequest deepCopy() {
    162     return new koalasRequest(this);
    163   }
    164 
    165   @Override
    166   public void clear() {
    167     setAgeIsSet(false);
    168     this.age = 0;
    169     this.name = null;
    170     this.address = null;
    171   }
    172 
    173   public int getAge() {
    174     return this.age;
    175   }
    176 
    177   public koalasRequest setAge(int age) {
    178     this.age = age;
    179     setAgeIsSet(true);
    180     return this;
    181   }
    182 
    183   public void unsetAge() {
    184     __isset_bit_vector.clear(__AGE_ISSET_ID);
    185   }
    186 
    187   /** Returns true if field age is set (has been assigned a value) and false otherwise */
    188   public boolean isSetAge() {
    189     return __isset_bit_vector.get(__AGE_ISSET_ID);
    190   }
    191 
    192   public void setAgeIsSet(boolean value) {
    193     __isset_bit_vector.set(__AGE_ISSET_ID, value);
    194   }
    195 
    196   public String getName() {
    197     return this.name;
    198   }
    199 
    200   public koalasRequest setName(String name) {
    201     this.name = name;
    202     return this;
    203   }
    204 
    205   public void unsetName() {
    206     this.name = null;
    207   }
    208 
    209   /** Returns true if field name is set (has been assigned a value) and false otherwise */
    210   public boolean isSetName() {
    211     return this.name != null;
    212   }
    213 
    214   public void setNameIsSet(boolean value) {
    215     if (!value) {
    216       this.name = null;
    217     }
    218   }
    219 
    220   public String getAddress() {
    221     return this.address;
    222   }
    223 
    224   public koalasRequest setAddress(String address) {
    225     this.address = address;
    226     return this;
    227   }
    228 
    229   public void unsetAddress() {
    230     this.address = null;
    231   }
    232 
    233   /** Returns true if field address is set (has been assigned a value) and false otherwise */
    234   public boolean isSetAddress() {
    235     return this.address != null;
    236   }
    237 
    238   public void setAddressIsSet(boolean value) {
    239     if (!value) {
    240       this.address = null;
    241     }
    242   }
    243 
    244   public void setFieldValue(_Fields field, Object value) {
    245     switch (field) {
    246     case AGE:
    247       if (value == null) {
    248         unsetAge();
    249       } else {
    250         setAge((Integer)value);
    251       }
    252       break;
    253 
    254     case NAME:
    255       if (value == null) {
    256         unsetName();
    257       } else {
    258         setName((String)value);
    259       }
    260       break;
    261 
    262     case ADDRESS:
    263       if (value == null) {
    264         unsetAddress();
    265       } else {
    266         setAddress((String)value);
    267       }
    268       break;
    269 
    270     }
    271   }
    272 
    273   public Object getFieldValue(_Fields field) {
    274     switch (field) {
    275     case AGE:
    276       return Integer.valueOf(getAge());
    277 
    278     case NAME:
    279       return getName();
    280 
    281     case ADDRESS:
    282       return getAddress();
    283 
    284     }
    285     throw new IllegalStateException();
    286   }
    287 
    288   /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
    289   public boolean isSet(_Fields field) {
    290     if (field == null) {
    291       throw new IllegalArgumentException();
    292     }
    293 
    294     switch (field) {
    295     case AGE:
    296       return isSetAge();
    297     case NAME:
    298       return isSetName();
    299     case ADDRESS:
    300       return isSetAddress();
    301     }
    302     throw new IllegalStateException();
    303   }
    304 
    305   @Override
    306   public boolean equals(Object that) {
    307     if (that == null)
    308       return false;
    309     if (that instanceof koalasRequest)
    310       return this.equals((koalasRequest)that);
    311     return false;
    312   }
    313 
    314   public boolean equals(koalasRequest that) {
    315     if (that == null)
    316       return false;
    317 
    318     boolean this_present_age = true;
    319     boolean that_present_age = true;
    320     if (this_present_age || that_present_age) {
    321       if (!(this_present_age && that_present_age))
    322         return false;
    323       if (this.age != that.age)
    324         return false;
    325     }
    326 
    327     boolean this_present_name = true && this.isSetName();
    328     boolean that_present_name = true && that.isSetName();
    329     if (this_present_name || that_present_name) {
    330       if (!(this_present_name && that_present_name))
    331         return false;
    332       if (!this.name.equals(that.name))
    333         return false;
    334     }
    335 
    336     boolean this_present_address = true && this.isSetAddress();
    337     boolean that_present_address = true && that.isSetAddress();
    338     if (this_present_address || that_present_address) {
    339       if (!(this_present_address && that_present_address))
    340         return false;
    341       if (!this.address.equals(that.address))
    342         return false;
    343     }
    344 
    345     return true;
    346   }
    347 
    348   @Override
    349   public int hashCode() {
    350     return 0;
    351   }
    352 
    353   public int compareTo(koalasRequest other) {
    354     if (!getClass().equals(other.getClass())) {
    355       return getClass().getName().compareTo(other.getClass().getName());
    356     }
    357 
    358     int lastComparison = 0;
    359     koalasRequest typedOther = (koalasRequest)other;
    360 
    361     lastComparison = Boolean.valueOf(isSetAge()).compareTo(typedOther.isSetAge());
    362     if (lastComparison != 0) {
    363       return lastComparison;
    364     }
    365     if (isSetAge()) {
    366       lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.age, typedOther.age);
    367       if (lastComparison != 0) {
    368         return lastComparison;
    369       }
    370     }
    371     lastComparison = Boolean.valueOf(isSetName()).compareTo(typedOther.isSetName());
    372     if (lastComparison != 0) {
    373       return lastComparison;
    374     }
    375     if (isSetName()) {
    376       lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, typedOther.name);
    377       if (lastComparison != 0) {
    378         return lastComparison;
    379       }
    380     }
    381     lastComparison = Boolean.valueOf(isSetAddress()).compareTo(typedOther.isSetAddress());
    382     if (lastComparison != 0) {
    383       return lastComparison;
    384     }
    385     if (isSetAddress()) {
    386       lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.address, typedOther.address);
    387       if (lastComparison != 0) {
    388         return lastComparison;
    389       }
    390     }
    391     return 0;
    392   }
    393 
    394   public _Fields fieldForId(int fieldId) {
    395     return _Fields.findByThriftId(fieldId);
    396   }
    397 
    398   public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
    399     schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
    400   }
    401 
    402   public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
    403     schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
    404   }
    405 
    406   @Override
    407   public String toString() {
    408     StringBuilder sb = new StringBuilder("koalasRequest(");
    409     boolean first = true;
    410 
    411     sb.append("age:");
    412     sb.append(this.age);
    413     first = false;
    414     if (!first) sb.append(", ");
    415     sb.append("name:");
    416     if (this.name == null) {
    417       sb.append("null");
    418     } else {
    419       sb.append(this.name);
    420     }
    421     first = false;
    422     if (!first) sb.append(", ");
    423     sb.append("address:");
    424     if (this.address == null) {
    425       sb.append("null");
    426     } else {
    427       sb.append(this.address);
    428     }
    429     first = false;
    430     sb.append(")");
    431     return sb.toString();
    432   }
    433 
    434   public void validate() throws org.apache.thrift.TException {
    435     // check for required fields
    436   }
    437 
    438   private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
    439     try {
    440       write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
    441     } catch (org.apache.thrift.TException te) {
    442       throw new java.io.IOException(te);
    443     }
    444   }
    445 
    446   private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
    447     try {
    448       // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
    449       __isset_bit_vector = new BitSet(1);
    450       read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
    451     } catch (org.apache.thrift.TException te) {
    452       throw new java.io.IOException(te);
    453     }
    454   }
    455 
    456   private static class koalasRequestStandardSchemeFactory implements SchemeFactory {
    457     public koalasRequestStandardScheme getScheme() {
    458       return new koalasRequestStandardScheme();
    459     }
    460   }
    461 
    462   private static class koalasRequestStandardScheme extends StandardScheme<koalasRequest> {
    463 
    464     public void read(org.apache.thrift.protocol.TProtocol iprot, koalasRequest struct) throws org.apache.thrift.TException {
    465       org.apache.thrift.protocol.TField schemeField;
    466       iprot.readStructBegin();
    467       while (true)
    468       {
    469         schemeField = iprot.readFieldBegin();
    470         if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
    471           break;
    472         }
    473         switch (schemeField.id) {
    474           case 1: // AGE
    475             if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
    476               struct.age = iprot.readI32();
    477               struct.setAgeIsSet(true);
    478             } else { 
    479               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
    480             }
    481             break;
    482           case 2: // NAME
    483             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
    484               struct.name = iprot.readString();
    485               struct.setNameIsSet(true);
    486             } else { 
    487               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
    488             }
    489             break;
    490           case 3: // ADDRESS
    491             if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
    492               struct.address = iprot.readString();
    493               struct.setAddressIsSet(true);
    494             } else { 
    495               org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
    496             }
    497             break;
    498           default:
    499             org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
    500         }
    501         iprot.readFieldEnd();
    502       }
    503       iprot.readStructEnd();
    504 
    505       // check for required fields of primitive type, which can't be checked in the validate method
    506       struct.validate();
    507     }
    508 
    509     public void write(org.apache.thrift.protocol.TProtocol oprot, koalasRequest struct) throws org.apache.thrift.TException {
    510       struct.validate();
    511 
    512       oprot.writeStructBegin(STRUCT_DESC);
    513       oprot.writeFieldBegin(AGE_FIELD_DESC);
    514       oprot.writeI32(struct.age);
    515       oprot.writeFieldEnd();
    516       if (struct.name != null) {
    517         oprot.writeFieldBegin(NAME_FIELD_DESC);
    518         oprot.writeString(struct.name);
    519         oprot.writeFieldEnd();
    520       }
    521       if (struct.address != null) {
    522         oprot.writeFieldBegin(ADDRESS_FIELD_DESC);
    523         oprot.writeString(struct.address);
    524         oprot.writeFieldEnd();
    525       }
    526       oprot.writeFieldStop();
    527       oprot.writeStructEnd();
    528     }
    529 
    530   }
    531 
    532   private static class koalasRequestTupleSchemeFactory implements SchemeFactory {
    533     public koalasRequestTupleScheme getScheme() {
    534       return new koalasRequestTupleScheme();
    535     }
    536   }
    537 
    538   private static class koalasRequestTupleScheme extends TupleScheme<koalasRequest> {
    539 
    540     @Override
    541     public void write(org.apache.thrift.protocol.TProtocol prot, koalasRequest struct) throws org.apache.thrift.TException {
    542       TTupleProtocol oprot = (TTupleProtocol) prot;
    543       BitSet optionals = new BitSet();
    544       if (struct.isSetAge()) {
    545         optionals.set(0);
    546       }
    547       if (struct.isSetName()) {
    548         optionals.set(1);
    549       }
    550       if (struct.isSetAddress()) {
    551         optionals.set(2);
    552       }
    553       oprot.writeBitSet(optionals, 3);
    554       if (struct.isSetAge()) {
    555         oprot.writeI32(struct.age);
    556       }
    557       if (struct.isSetName()) {
    558         oprot.writeString(struct.name);
    559       }
    560       if (struct.isSetAddress()) {
    561         oprot.writeString(struct.address);
    562       }
    563     }
    564 
    565     @Override
    566     public void read(org.apache.thrift.protocol.TProtocol prot, koalasRequest struct) throws org.apache.thrift.TException {
    567       TTupleProtocol iprot = (TTupleProtocol) prot;
    568       BitSet incoming = iprot.readBitSet(3);
    569       if (incoming.get(0)) {
    570         struct.age = iprot.readI32();
    571         struct.setAgeIsSet(true);
    572       }
    573       if (incoming.get(1)) {
    574         struct.name = iprot.readString();
    575         struct.setNameIsSet(true);
    576       }
    577       if (incoming.get(2)) {
    578         struct.address = iprot.readString();
    579         struct.setAddressIsSet(true);
    580       }
    581     }
    582   }
    583 
    584 }

     生成了一个500多行的代码,那么我们现在对这个请求对象进行序列化,看看序列化结果。 

    import org.apache.thrift.TException;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TIOStreamTransport;
    
    import java.io.ByteArrayOutputStream;
    import java.util.Arrays;
    
    public class KoalaThriftSerialization {
    
        public static void main(String[] args) throws TException {
    
            koalasRequest request = new koalasRequest (  );
            request.setName ( "小明" );
            request.setAge ( 20 );
            request.setAddress ( "北京" );
    
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            TIOStreamTransport tioStreamTransport = new TIOStreamTransport (out);
            TProtocol protocol = new TBinaryProtocol (tioStreamTransport);
            request.write ( protocol );
            System.out.println (Arrays.toString ( out.toByteArray () ) );
    
        }
    
    }

    看一看对于这么个简单的request对象,thrift到底序列化成什么了

    实际生产中的传输方式一般采用TFramedTransport,序列化采用二进制序列化协议TBinaryProtocol,当然也有json和压缩协议等等,二进制确实最高效的。

    我们来看看thrift的序列化方法。

    1  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
    2     schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
    3   }
     1 public void write(org.apache.thrift.protocol.TProtocol oprot, koalasRequest struct) throws org.apache.thrift.TException {
     2       struct.validate();
     3 
     4       oprot.writeStructBegin(STRUCT_DESC);
     5       oprot.writeFieldBegin(AGE_FIELD_DESC);
     6       oprot.writeI32(struct.age);
     7       oprot.writeFieldEnd();
     8       if (struct.name != null) {
     9         oprot.writeFieldBegin(NAME_FIELD_DESC);
    10         oprot.writeString(struct.name);
    11         oprot.writeFieldEnd();
    12       }
    13       if (struct.address != null) {
    14         oprot.writeFieldBegin(ADDRESS_FIELD_DESC);
    15         oprot.writeString(struct.address);
    16         oprot.writeFieldEnd();
    17       }
    18       oprot.writeFieldStop();
    19       oprot.writeStructEnd();
    20     }

    1:validate 验证一下request中是否合法,主要是验证在thrift文件里属性为required的,但是实际传输中为空的字段。required字段为空则会报错。

    2:writeStructBegin 开始序列化request,TBinaryProtocol什么也不做,当然用户可以自己自定义Protocol。

    3:  writeFieldBegin 写入age字段开始,下面来看看writeFieldBegin到底写了什么

      private static final org.apache.thrift.protocol.TField AGE_FIELD_DESC = new org.apache.thrift.protocol.TField("age", org.apache.thrift.protocol.TType.I32, (short)1);
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.apache.thrift.protocol;
    
    public final class TType {
        public static final byte STOP = 0;
        public static final byte VOID = 1;
        public static final byte BOOL = 2;
        public static final byte BYTE = 3;
        public static final byte DOUBLE = 4;
        public static final byte I16 = 6;
        public static final byte I32 = 8;
        public static final byte I64 = 10;
        public static final byte STRING = 11;
        public static final byte STRUCT = 12;
        public static final byte MAP = 13;
        public static final byte SET = 14;
        public static final byte LIST = 15;
        public static final byte ENUM = 16;
    
        public TType() {
        }
    }
    public void writeFieldBegin(TField field) throws TException {
            this.writeByte(field.type);
            this.writeI16(field.id);
        }
    public void writeByte(byte b) throws TException {
            this.bout[0] = b;
            this.trans_.write(this.bout, 0, 1);
        }
    public void writeI16(short i16) throws TException {
            this.i16out[0] = (byte)(255 & i16 >> 8);
            this.i16out[1] = (byte)(255 & i16);
            this.trans_.write(this.i16out, 0, 2);
        }

    (1)首先先写入age的类型和序号,age为int类型,int类型在thrift里面设置是byte类型的【8】,在写入age的位置,因为thrift的定义的age的位置序号是1,thrift会写入一下short类型的1,也就说thrift的请求体的成员最大数量不能超过short的最大值32767,一般来说够了,哪有变态的请求体需要几万个成员变量啊,不得把程序员搞死!写入short占用两个字节那么继续写入【0 1】

    4: writeI32

    public void writeI32(int i32) throws TException {
            this.i32out[0] = (byte)(255 & i32 >> 24);
            this.i32out[1] = (byte)(255 & i32 >> 16);
            this.i32out[2] = (byte)(255 & i32 >> 8);
            this.i32out[3] = (byte)(255 & i32);
            this.trans_.write(this.i32out, 0, 4);
        }

    直接将age的值写入,也就是 0 0 0 20 占4个字节

    5:writeFieldEnd 写入age字段结束,什么也不做。

    以上写入一个int类型的字段就写完了,接下来写入String类型的name和String类型的address同理,需要注意的是

    public void writeString(String str) throws TException {
            try {
                byte[] dat = str.getBytes("UTF-8");
                this.writeI32(dat.length);
                this.trans_.write(dat, 0, dat.length);
            } catch (UnsupportedEncodingException var3) {
                throw new TException("JVM DOES NOT SUPPORT UTF-8");
            }
        }

    在写入String的时候需要先write字符串的长度,int类型占4个字节,因为string类型占用的字节不固定,反序列化时需要知道字符串类型到底是几个字节。

    重复这个过程一直到写完所有的字段,这个过程都是由thrift给java语言自动生成的,很方便吧。

    所以对于thrift来说,他的序列化就是对各个字段进行写入 1 字段类型 (1 byte)、2字段位置(2 byte)、3字段内容 ,TBinaryProtocol中对java所有的类型的写入都有封装,小伙伴们可以自行下载代码查看!

    高级java交流群:825199617

    欢迎热爱源码志同道合的朋友加入。

    koalas rpc源码地址https://gitee.com/a1234567891/koalas-rpc

  • 相关阅读:
    Linux 10字符串命令病毒的处理记录
    Spring的核心模块解析
    干货 | 教你如何监控 Java 线程池运行状态
    关于Spring事物的面试题
    Integer、new Integer() 和 int 比较的面试题
    性能监控工具-JDK命令行工具
    JVM调优总结 -Xms -Xmx -Xmn -Xss
    JVM系列三:JVM参数设置、分析
    JVM—内存溢出、OutOfMemoryError、StackOverflowError
    7种垃圾收集器
  • 原文地址:https://www.cnblogs.com/zyl2016/p/10044234.html
Copyright © 2020-2023  润新知