예제 #1
0
 /** Write a single field. */
 public static void writeField(
     final FieldDescriptorLite<?> descriptor, final Object value, final CodedOutputStream output)
     throws IOException {
   WireFormat.FieldType type = descriptor.getLiteType();
   int number = descriptor.getNumber();
   if (descriptor.isRepeated()) {
     final List<?> valueList = (List<?>) value;
     if (descriptor.isPacked()) {
       output.writeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED);
       // Compute the total data size so the length can be written.
       int dataSize = 0;
       for (final Object element : valueList) {
         dataSize += computeElementSizeNoTag(type, element);
       }
       output.writeRawVarint32(dataSize);
       // Write the data itself, without any tags.
       for (final Object element : valueList) {
         writeElementNoTag(output, type, element);
       }
     } else {
       for (final Object element : valueList) {
         writeElement(output, type, number, element);
       }
     }
   } else {
     writeElement(output, type, number, value);
   }
 }
예제 #2
0
 /** Compute the number of bytes needed to encode a particular field. */
 public static int computeFieldSize(final FieldDescriptorLite<?> descriptor, final Object value) {
   WireFormat.FieldType type = descriptor.getLiteType();
   int number = descriptor.getNumber();
   if (descriptor.isRepeated()) {
     if (descriptor.isPacked()) {
       int dataSize = 0;
       for (final Object element : (List<?>) value) {
         dataSize += computeElementSizeNoTag(type, element);
       }
       return dataSize
           + CodedOutputStream.computeTagSize(number)
           + CodedOutputStream.computeRawVarint32Size(dataSize);
     } else {
       int size = 0;
       for (final Object element : (List<?>) value) {
         size += computeElementSize(type, number, element);
       }
       return size;
     }
   } else {
     return computeElementSize(type, number, value);
   }
 }