title: Protocol Buffers: How to parse a .proto file in Java
body: <p>I am trying to dynamically parse a given .proto file in Java to decode a Protobuf-encoded binary.</p>
  
  <p>I have the following parsing method, in which the "proto" string contains the content of the .proto file:</p>
  
  <pre><code>public static Descriptors.FileDescriptor parseProto (String proto) throws InvalidProtocolBufferException, Descriptors.DescriptorValidationException {
          DescriptorProtos.FileDescriptorProto descriptorProto = DescriptorProtos.FileDescriptorProto.parseFrom(proto.getBytes());
          return Descriptors.FileDescriptor.buildFrom(descriptorProto, null);
  }
  </code></pre>
  
  <p>Though, on execution the previous method throws an exception with the message "Protocol message tag had invalid wire type.". I use the example .proto file from Google so I guess it is valid: <a href="https://github.com/google/protobuf/blob/master/examples/addressbook.proto" rel="noreferrer">https://github.com/google/protobuf/blob/master/examples/addressbook.proto</a></p>
  
  <p>Here is the stack trace:</p>
  
  <pre><code>15:43:24.707 [pool-1-thread-1] ERROR com.github.whiver.nifi.processor.ProtobufDecoderProcessor - ProtobufDecoderProcessor[id=42c8ab94-2d8a-491b-bd99-b4451d127ae0] Protocol message tag had invalid wire type.
  com.google.protobuf.InvalidProtocolBufferException$InvalidWireTypeException: Protocol message tag had invalid wire type.
      at com.google.protobuf.InvalidProtocolBufferException.invalidWireType(InvalidProtocolBufferException.java:115)
      at com.google.protobuf.UnknownFieldSet$Builder.mergeFieldFrom(UnknownFieldSet.java:551)
      at com.google.protobuf.GeneratedMessageV3.parseUnknownField(GeneratedMessageV3.java:293)
      at com.google.protobuf.DescriptorProtos$FileDescriptorSet.&lt;init&gt;(DescriptorProtos.java:88)
      at com.google.protobuf.DescriptorProtos$FileDescriptorSet.&lt;init&gt;(DescriptorProtos.java:53)
      at com.google.protobuf.DescriptorProtos$FileDescriptorSet$1.parsePartialFrom(DescriptorProtos.java:773)
      at com.google.protobuf.DescriptorProtos$FileDescriptorSet$1.parsePartialFrom(DescriptorProtos.java:768)
      at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:163)
      at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:197)
      at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:209)
      at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:214)
      at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
      at com.google.protobuf.DescriptorProtos$FileDescriptorSet.parseFrom(DescriptorProtos.java:260)
      at com.github.whiver.nifi.parser.SchemaParser.parseProto(SchemaParser.java:9)
      at com.github.whiver.nifi.processor.ProtobufDecoderProcessor.lambda$onTrigger$0(ProtobufDecoderProcessor.java:103)
      at org.apache.nifi.util.MockProcessSession.write(MockProcessSession.java:895)
      at org.apache.nifi.util.MockProcessSession.write(MockProcessSession.java:62)
      at com.github.whiver.nifi.processor.ProtobufDecoderProcessor.onTrigger(ProtobufDecoderProcessor.java:100)
      at org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
      at org.apache.nifi.util.StandardProcessorTestRunner$RunProcessor.call(StandardProcessorTestRunner.java:251)
      at org.apache.nifi.util.StandardProcessorTestRunner$RunProcessor.call(StandardProcessorTestRunner.java:245)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
      at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
  </code></pre>
  
  <p>Any idea?
  Thank you!</p>