Class RawMessageInfo

  • All Implemented Interfaces:
    MessageInfo

    final class RawMessageInfo
    extends java.lang.Object
    implements MessageInfo
    RawMessageInfo stores the same amount of information as MessageInfo but in a more compact format.
    • Field Detail

      • defaultInstance

        private final MessageLite defaultInstance
      • info

        private final java.lang.String info
        The compact format packs everything in a String object and a Object[] array. The String object is encoded with field number, field type, hasbits offset, oneof index, etc., whereas the Object[] array contains field references, class references, instance references, etc.

        The String object encodes a sequence of integers into UTF-16 characters. For each int, it will be encoding into 1 to 3 UTF-16 characters depending on its unsigned value:

        • 1 char: [c1: 0x0000 - 0xD7FF] = int of the same value.
        • 2 chars: [c1: 0xE000 - 0xFFFF], [c2: 0x0000 - 0xD7FF] = (c2 << 13) | (c1 & 0x1FFF)
        • 3 chars: [c1: 0xE000 - 0xFFFF], [c2: 0xE000 - 0xFFFF], [c3: 0x0000 - 0xD7FF] = (c3 << 26) | ((c2 & 0x1FFF) << 13) | (c1 & 0x1FFF)

        Note that we don't use UTF-16 surrogate pairs [0xD800 - 0xDFFF] because they have to come in pairs to form a valid UTF-16char sequence and don't help us encode values more efficiently.

        The integer sequence encoded in the String object has the following layout:

        • [0]: flags, flags & 0x1 = is proto2?, flags & 0x2 = is message?.
        • [1]: field count, if 0, this is the end of the integer sequence and the corresponding Object[] array should be null.
        • [2]: oneof count
        • [3]: hasbits count, how many hasbits integers are generated.
        • [4]: min field number
        • [5]: max field number
        • [6]: total number of entries need to allocate
        • [7]: map field count
        • [8]: repeated field count, this doesn't include map fields.
        • [9]: size of checkInitialized array
        • [...]: field entries

        Each field entry starts with a field number and the field type:

        • [0]: field number
        • [1]: field type with extra bits:
          • v & 0xFF = field type as defined in the FieldType class
          • v & 0x100 = is required?
          • v & 0x200 = is checkUtf8?
          • v & 0x400 = needs isInitialized check?
          • v & 0x800 = is map field with proto2 enum value?
        If the file is proto2 and this is a singular field:
        • [2]: hasbits offset
        If the field is in an oneof:
        • [2]: oneof index
        For other types, the field entry only has field number and field type.

        The Object[] array has 3 sections:

        • ---- oneof section ----
          • [0]: value field for oneof 1.
          • [1]: case field for oneof 1.
          • ...
          • [.]: value field for oneof n.
          • [.]: case field for oneof n.
        • ---- hasbits section ----
          • [.]: hasbits field 1
          • [.]: hasbits field 2
          • ...
          • [.]: hasbits field n
        • ---- field section ----
          • [...]: field entries

        In the Object[] array, field entries are ordered in the same way as field entries in the String object. The size of each entry is determined by the field type.

        • Oneof field:
          • Oneof message field:
            • [0]: message class reference.
          • Oneof enum fieldin proto2:
            • [0]: EnumLiteMap
          • For all other oneof fields, field entry in the Object[] array is empty.
        • Repeated message field:
          • [0]: field reference
          • [1]: message class reference
        • Proto2 singular/repeated enum field:
          • [0]: field reference
          • [1]: EnumLiteMap
        • Map field with a proto2 enum value:
          • [0]: field reference
          • [1]: map default entry instance
          • [2]: EnumLiteMap
        • Map field with other value types:
          • [0]: field reference
          • [1]: map default entry instance
        • All other field type:
          • [0]: field reference

        In order to read the field info from this compact format, a reader needs to progress through the String object and the Object[] array simultaneously.

      • objects

        private final java.lang.Object[] objects
      • flags

        private final int flags
    • Constructor Detail

      • RawMessageInfo

        RawMessageInfo​(MessageLite defaultInstance,
                       java.lang.String info,
                       java.lang.Object[] objects)