Class TCompactProtocol

  • All Implemented Interfaces:
    TReadProtocol, TWriteProtocol
    Direct Known Subclasses:
    TTupleProtocol

    public class TCompactProtocol
    extends TProtocol
    TCompactProtocol2 is the Java implementation of the compact protocol specified in THRIFT-110. The fundamental approach to reducing the overhead of structures is a) use variable-length integers all over the place and b) make use of unused bits wherever possible. Your savings will obviously vary based on the specific makeup of your structs, but in general, the more fields, nested structures, short strings and collections, and low-value i32 and i64 fields you have, the more benefit you'll see.
    • Constructor Detail

      • TCompactProtocol

        public TCompactProtocol​(TTransport transport,
                                long stringLengthLimit,
                                long containerLengthLimit)
        Create a TCompactProtocol.
        Parameters:
        transport - the TTransport object to read from or write to.
        stringLengthLimit - the maximum number of bytes to read for variable-length fields.
        containerLengthLimit - the maximum number of elements to read for containers.
      • TCompactProtocol

        @Deprecated
        public TCompactProtocol​(TTransport transport,
                                long stringLengthLimit)
        Deprecated.
        Use constructor specifying both string limit and container limit instead
        Create a TCompactProtocol.
        Parameters:
        transport - the TTransport object to read from or write to.
        stringLengthLimit - the maximum number of bytes to read for variable-length fields.
      • TCompactProtocol

        public TCompactProtocol​(TTransport transport)
        Create a TCompactProtocol.
        Parameters:
        transport - the TTransport object to read from or write to.
    • Method Detail

      • reset

        public void reset()
        Description copied from class: TProtocol
        Reset any internal state back to a blank slate. This method only needs to be implemented for stateful protocols.
        Overrides:
        reset in class TProtocol
      • writeMessageBegin

        public void writeMessageBegin​(TMessage message)
                               throws TException
        Write a message header to the wire. Compact Protocol messages contain the protocol version so we can migrate forwards in the future if need be.
        Throws:
        TException
      • writeStructBegin

        public void writeStructBegin​(TStruct struct)
                              throws TException
        Write a struct begin. This doesn't actually put anything on the wire. We use it as an opportunity to put special placeholder markers on the field stack so we can get the field id deltas correct.
        Throws:
        TException
      • writeStructEnd

        public void writeStructEnd()
                            throws TException
        Write a struct end. This doesn't actually put anything on the wire. We use this as an opportunity to pop the last field from the current struct off of the field stack.
        Throws:
        TException
      • writeFieldBegin

        public void writeFieldBegin​(TField field)
                             throws TException
        Write a field header containing the field id and field type. If the difference between the current field id and the last one is small (< 15), then the field id will be encoded in the 4 MSB as a delta. Otherwise, the field id will follow the type header as a zigzag varint.
        Throws:
        TException
      • writeFieldStop

        public void writeFieldStop()
                            throws TException
        Write the STOP symbol so we know there are no more fields in this struct.
        Throws:
        TException
      • writeMapBegin

        public void writeMapBegin​(TMap map)
                           throws TException
        Write a map header. If the map is empty, omit the key and value type headers, as we don't need any additional information to skip it.
        Throws:
        TException
      • writeBool

        public void writeBool​(boolean b)
                       throws TException
        Write a boolean value. Potentially, this could be a boolean field, in which case the field header info isn't written yet. If so, decide what the right type header is for the value and then write the field header. Otherwise, write a single byte.
        Throws:
        TException
      • writeByte

        public void writeByte​(byte b)
                       throws TException
        Write a byte. Nothing to see here!
        Throws:
        TException
      • writeI16

        public void writeI16​(short i16)
                      throws TException
        Write an I16 as a zigzag varint.
        Throws:
        TException
      • writeI32

        public void writeI32​(int i32)
                      throws TException
        Write an i32 as a zigzag varint.
        Throws:
        TException
      • writeI64

        public void writeI64​(long i64)
                      throws TException
        Write an i64 as a zigzag varint.
        Throws:
        TException
      • writeDouble

        public void writeDouble​(double dub)
                         throws TException
        Write a double to the wire as 8 bytes.
        Throws:
        TException
      • writeString

        public void writeString​(java.lang.String str)
                         throws TException
        Write a string to the wire with a varint size preceding.
        Throws:
        TException
      • writeBinary

        public void writeBinary​(java.nio.ByteBuffer bin)
                         throws TException
        Write a byte array, using a varint for the size.
        Throws:
        TException
      • writeCollectionBegin

        protected void writeCollectionBegin​(byte elemType,
                                            int size)
                                     throws TException
        Abstract method for writing the start of lists and sets. List and sets on the wire differ only by the type indicator.
        Throws:
        TException
      • readStructBegin

        public TStruct readStructBegin()
                                throws TException
        Read a struct begin. There's nothing on the wire for this, but it is our opportunity to push a new struct begin marker onto the field stack.
        Throws:
        TException
      • readStructEnd

        public void readStructEnd()
                           throws TException
        Doesn't actually consume any wire data, just removes the last field for this struct from the field stack.
        Throws:
        TException
      • readMapBegin

        public TMap readMapBegin()
                          throws TException
        Read a map header off the wire. If the size is zero, skip reading the key and value type. This means that 0-length maps will yield TMaps without the "correct" types.
        Throws:
        TException
      • readListBegin

        public TList readListBegin()
                            throws TException
        Read a list header off the wire. If the list size is 0-14, the size will be packed into the element type header. If it's a longer list, the 4 MSB of the element type header will be 0xF, and a varint will follow with the true size.
        Throws:
        TException
      • readSetBegin

        public TSet readSetBegin()
                          throws TException
        Read a set header off the wire. If the set size is 0-14, the size will be packed into the element type header. If it's a longer set, the 4 MSB of the element type header will be 0xF, and a varint will follow with the true size.
        Throws:
        TException
      • readBool

        public boolean readBool()
                         throws TException
        Read a boolean off the wire. If this is a boolean field, the value should already have been read during readFieldBegin, so we'll just consume the pre-stored value. Otherwise, read a byte.
        Throws:
        TException
      • readByte

        public byte readByte()
                      throws TException
        Read a single byte off the wire. Nothing interesting here.
        Throws:
        TException
      • readI16

        public short readI16()
                      throws TException
        Read an i16 from the wire as a zigzag varint.
        Throws:
        TException
      • readI32

        public int readI32()
                    throws TException
        Read an i32 from the wire as a zigzag varint.
        Throws:
        TException
      • readI64

        public long readI64()
                     throws TException
        Read an i64 from the wire as a zigzag varint.
        Throws:
        TException
      • readDouble

        public double readDouble()
                          throws TException
        No magic here - just read a double off the wire.
        Throws:
        TException
      • readString

        public java.lang.String readString()
                                    throws TException
        Reads a byte[] (via readBinary), and then UTF-8 decodes it.
        Throws:
        TException
      • readBinary

        public java.nio.ByteBuffer readBinary()
                                       throws TException
        Read a ByteBuffer from the wire.
        Throws:
        TException
      • getMinSerializedSize

        public int getMinSerializedSize​(byte type)
                                 throws TTransportException
        Return the minimum number of bytes a type will consume on the wire
        Specified by:
        getMinSerializedSize in class TProtocol
        Parameters:
        type - Returns the minimum amount of bytes needed to store the smallest possible instance of TType.
        Returns:
        min serialized size
        Throws:
        TTransportException