使用3.20.3版本的protoc编译proto2和proto3
测试3.20.3的protoc编译后的proto2和proto3版本文件是否可以正常使用
背景
在工作中发现,有同学在使用protoc把proto文件转成java文件以后,有些字段前面会添加路径,在某个PR里面特意把前面的路径删除掉了,所以为了验证路径是否会对java文件的使用产生影响,写了个简单的demo进行验证。
代码
proto代码
// test2.proto
syntax = "proto2";
package example;message Person {required string name = 1;optional int32 age = 2 [default = 18];
}
// test3.proto
syntax = "proto3";
package example;message Person {string name = 1;int32 age = 2;
}
使用protoc进行转换:
protoc版本:3.20.3
转换代码:
protoc --java_out=./out test2.proto
protoc --java_out=./out test3.proto
转换结果:
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: test2.protopackage com.test.protobuf.out.example;public final class Test2 {private Test2() {}public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {}public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);}public interface PersonOrBuilder extends// @@protoc_insertion_point(interface_extends:com.test.protobuf.out.example.Person)com.google.protobuf.MessageOrBuilder {/*** <code>required string name = 1;</code>* @return Whether the name field is set.*/boolean hasName();/*** <code>required string name = 1;</code>* @return The name.*/java.lang.String getName();/*** <code>required string name = 1;</code>* @return The bytes for name.*/com.google.protobuf.ByteStringgetNameBytes();/*** <code>optional int32 age = 2 [default = 18];</code>* @return Whether the age field is set.*/boolean hasAge();/*** <code>optional int32 age = 2 [default = 18];</code>* @return The age.*/int getAge();}/*** Protobuf type {@code com.test.protobuf.out.example.Person}*/public static final class Person extendscom.google.protobuf.GeneratedMessageV3 implements// @@protoc_insertion_point(message_implements:com.test.protobuf.out.example.Person)PersonOrBuilder {private static final long serialVersionUID = 0L;// Use Person.newBuilder() to construct.private Person(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {super(builder);}private Person() {name_ = "";age_ = 18;}@java.lang.Override@SuppressWarnings({"unused"})protected java.lang.Object newInstance(UnusedPrivateParameter unused) {return new Person();}@java.lang.Overridepublic final com.google.protobuf.UnknownFieldSetgetUnknownFields() {return this.unknownFields;}public static final com.google.protobuf.Descriptors.DescriptorgetDescriptor() {return com.test.protobuf.out.example.Test2.internal_static_example_Person_descriptor;}@java.lang.Overrideprotected com.google.protobuf.GeneratedMessageV3.FieldAccessorTableinternalGetFieldAccessorTable() {return com.test.protobuf.out.example.Test2.internal_static_example_Person_fieldAccessorTable.ensureFieldAccessorsInitialized(com.test.protobuf.out.example.Test2.Person.class, com.test.protobuf.out.example.Test2.Person.Builder.class);}private int bitField0_;public static final int NAME_FIELD_NUMBER = 1;private volatile java.lang.Object name_;/*** <code>required string name = 1;</code>* @return Whether the name field is set.*/@java.lang.Overridepublic boolean hasName() {return ((bitField0_ & 0x00000001) != 0);}/*** <code>required string name = 1;</code>* @return The name.*/@java.lang.Overridepublic java.lang.String getName() {java.lang.Object ref = name_;if (ref instanceof java.lang.String) {return (java.lang.String) ref;} else {com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;java.lang.String s = bs.toStringUtf8();if (bs.isValidUtf8()) {name_ = s;}return s;}}/*** <code>required string name = 1;</code>* @return The bytes for name.*/@java.lang.Overridepublic com.google.protobuf.ByteStringgetNameBytes() {java.lang.Object ref = name_;if (ref instanceof java.lang.String) {com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);name_ = b;return b;} else {return (com.google.protobuf.ByteString) ref;}}public static final int AGE_FIELD_NUMBER = 2;private int age_;/*** <code>optional int32 age = 2 [default = 18];</code>* @return Whether the age field is set.*/@java.lang.Overridepublic boolean hasAge() {return ((bitField0_ & 0x00000002) != 0);}/*** <code>optional int32 age = 2 [default = 18];</code>* @return The age.*/@java.lang.Overridepublic int getAge() {return age_;}private byte memoizedIsInitialized = -1;@java.lang.Overridepublic final boolean isInitialized() {byte isInitialized = memoizedIsInitialized;if (isInitialized == 1) return true;if (isInitialized == 0) return false;if (!hasName()) {memoizedIsInitialized = 0;return false;}memoizedIsInitialized = 1;return true;}@java.lang.Overridepublic void writeTo(com.google.protobuf.CodedOutputStream output)throws java.io.IOException {if (((bitField0_ & 0x00000001) != 0)) {com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_);}if (((bitField0_ & 0x00000002) != 0)) {output.writeInt32(2, age_);}getUnknownFields().writeTo(output);}@java.lang.Overridepublic int getSerializedSize() {int size = memoizedSize;if (size != -1) return size;size = 0;if (((bitField0_ & 0x00000001) != 0)) {size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_);}if (((bitField0_ & 0x00000002) != 0)) {size += com.google.protobuf.CodedOutputStream.computeInt32Size(2, age_);}size += getUnknownFields().getSerializedSize();memoizedSize = size;return size;}@java.lang.Overridepublic boolean equals(final java.lang.Object obj) {if (obj == this) {return true;}if (!(obj instanceof com.test.protobuf.out.example.Test2.Person)) {return super.equals(obj);}com.test.protobuf.out.example.Test2.Person other = (com.test.protobuf.out.example.Test2.Person) obj;if (hasName() != other.hasName()) return false;if (hasName()) {if (!getName().equals(other.getName())) return false;}if (hasAge() != other.hasAge()) return false;if (hasAge()) {if (getAge()!= other.getAge()) return false;}if (!getUnknownFields().equals(other.getUnknownFields())) return false;return true;}@java.lang.Overridepublic int hashCode() {if (memoizedHashCode != 0) {return memoizedHashCode;}int hash = 41;hash = (19 * hash) + getDescriptor().hashCode();if (hasName()) {hash = (37 * hash) + NAME_FIELD_NUMBER;hash = (53 * hash) + getName().hashCode();}if (hasAge()) {hash = (37 * hash) + AGE_FIELD_NUMBER;hash = (53 * hash) + getAge();}hash = (29 * hash) + getUnknownFields().hashCode();memoizedHashCode = hash;return hash;}public static com.test.protobuf.out.example.Test2.Person parseFrom(java.nio.ByteBuffer data)throws com.google.protobuf.InvalidProtocolBufferException {return PARSER.parseFrom(data);}public static com.test.protobuf.out.example.Test2.Person parseFrom(java.nio.ByteBuffer data,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws com.google.protobuf.InvalidProtocolBufferException {return PARSER.parseFrom(data, extensionRegistry);}public static com.test.protobuf.out.example.Test2.Person parseFrom(com.google.protobuf.ByteString data)throws com.google.protobuf.InvalidProtocolBufferException {return PARSER.parseFrom(data);}public static com.test.protobuf.out.example.Test2.Person parseFrom(com.google.protobuf.ByteString data,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws com.google.protobuf.InvalidProtocolBufferException {return PARSER.parseFrom(data, extensionRegistry);}public static com.test.protobuf.out.example.Test2.Person parseFrom(byte[] data)throws com.google.protobuf.InvalidProtocolBufferException {return PARSER.parseFrom(data);}public static com.test.protobuf.out.example.Test2.Person parseFrom(byte[] data,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws com.google.protobuf.InvalidProtocolBufferException {return PARSER.parseFrom(data, extensionRegistry);}public static com.test.protobuf.out.example.Test2.Person parseFrom(java.io.InputStream input)throws java.io.IOException {return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);}public static com.test.protobuf.out.example.Test2.Person parseFrom(java.io.InputStream input,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws java.io.IOException {return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry);}public static com.test.protobuf.out.example.Test2.Person parseDelimitedFrom(java.io.InputStream input)throws java.io.IOException {return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);}public static com.test.protobuf.out.example.Test2.Person parseDelimitedFrom(java.io.InputStream input,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws java.io.IOException {return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry);}public static com.test.protobuf.out.example.Test2.Person parseFrom(com.google.protobuf.CodedInputStream input)throws java.io.IOException {return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);}public static com.test.protobuf.out.example.Test2.Person parseFrom(com.google.protobuf.CodedInputStream input,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws java.io.IOException {return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry);}@java.lang.Overridepublic Builder newBuilderForType() { return newBuilder(); }public static Builder newBuilder() {return DEFAULT_INSTANCE.toBuilder();}public static Builder newBuilder(com.test.protobuf.out.example.Test2.Person prototype) {return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);}@java.lang.Overridepublic Builder toBuilder() {return this == DEFAULT_INSTANCE? new Builder() : new Builder().mergeFrom(this);}@java.lang.Overrideprotected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {Builder builder = new Builder(parent);return builder;}/*** Protobuf type {@code com.test.protobuf.out.example.Person}*/public static final class Builder extendscom.google.protobuf.GeneratedMessageV3.Builder<Builder> implements// @@protoc_insertion_point(builder_implements:com.test.protobuf.out.example.Person)com.test.protobuf.out.example.Test2.PersonOrBuilder {public static final com.google.protobuf.Descriptors.DescriptorgetDescriptor() {return com.test.protobuf.out.example.Test2.internal_static_example_Person_descriptor;}@java.lang.Overrideprotected com.google.protobuf.GeneratedMessageV3.FieldAccessorTableinternalGetFieldAccessorTable() {return com.test.protobuf.out.example.Test2.internal_static_example_Person_fieldAccessorTable.ensureFieldAccessorsInitialized(com.test.protobuf.out.example.Test2.Person.class, com.test.protobuf.out.example.Test2.Person.Builder.class);}// Construct using com.test.protobuf.out.example.Test2.Person.newBuilder()private Builder() {}private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {super(parent);}@java.lang.Overridepublic Builder clear() {super.clear();name_ = "";bitField0_ = (bitField0_ & ~0x00000001);age_ = 18;bitField0_ = (bitField0_ & ~0x00000002);return this;}@java.lang.Overridepublic com.google.protobuf.Descriptors.DescriptorgetDescriptorForType() {return com.test.protobuf.out.example.Test2.internal_static_example_Person_descriptor;}@java.lang.Overridepublic com.test.protobuf.out.example.Test2.Person getDefaultInstanceForType() {return com.test.protobuf.out.example.Test2.Person.getDefaultInstance();}@java.lang.Overridepublic com.test.protobuf.out.example.Test2.Person build() {com.test.protobuf.out.example.Test2.Person result = buildPartial();if (!result.isInitialized()) {throw newUninitializedMessageException(result);}return result;}@java.lang.Overridepublic com.test.protobuf.out.example.Test2.Person buildPartial() {com.test.protobuf.out.example.Test2.Person result = new com.test.protobuf.out.example.Test2.Person(this);int from_bitField0_ = bitField0_;int to_bitField0_ = 0;if (((from_bitField0_ & 0x00000001) != 0)) {to_bitField0_ |= 0x00000001;}result.name_ = name_;if (((from_bitField0_ & 0x00000002) != 0)) {to_bitField0_ |= 0x00000002;}result.age_ = age_;result.bitField0_ = to_bitField0_;onBuilt();return result;}@java.lang.Overridepublic Builder clone() {return super.clone();}@java.lang.Overridepublic Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field,java.lang.Object value) {return super.setField(field, value);}@java.lang.Overridepublic Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {return super.clearField(field);}@java.lang.Overridepublic Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {return super.clearOneof(oneof);}@java.lang.Overridepublic Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field,int index, java.lang.Object value) {return super.setRepeatedField(field, index, value);}@java.lang.Overridepublic Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field,java.lang.Object value) {return super.addRepeatedField(field, value);}@java.lang.Overridepublic Builder mergeFrom(com.google.protobuf.Message other) {if (other instanceof com.test.protobuf.out.example.Test2.Person) {return mergeFrom((com.test.protobuf.out.example.Test2.Person)other);} else {super.mergeFrom(other);return this;}}public Builder mergeFrom(com.test.protobuf.out.example.Test2.Person other) {if (other == com.test.protobuf.out.example.Test2.Person.getDefaultInstance()) return this;if (other.hasName()) {bitField0_ |= 0x00000001;name_ = other.name_;onChanged();}if (other.hasAge()) {setAge(other.getAge());}this.mergeUnknownFields(other.getUnknownFields());onChanged();return this;}@java.lang.Overridepublic final boolean isInitialized() {if (!hasName()) {return false;}return true;}@java.lang.Overridepublic Builder mergeFrom(com.google.protobuf.CodedInputStream input,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws java.io.IOException {if (extensionRegistry == null) {throw new java.lang.NullPointerException();}try {boolean done = false;while (!done) {int tag = input.readTag();switch (tag) {case 0:done = true;break;case 10: {name_ = input.readBytes();bitField0_ |= 0x00000001;break;} // case 10case 16: {age_ = input.readInt32();bitField0_ |= 0x00000002;break;} // case 16default: {if (!super.parseUnknownField(input, extensionRegistry, tag)) {done = true; // was an endgroup tag}break;} // default:} // switch (tag)} // while (!done)} catch (com.google.protobuf.InvalidProtocolBufferException e) {throw e.unwrapIOException();} finally {onChanged();} // finallyreturn this;}private int bitField0_;private java.lang.Object name_ = "";/*** <code>required string name = 1;</code>* @return Whether the name field is set.*/public boolean hasName() {return ((bitField0_ & 0x00000001) != 0);}/*** <code>required string name = 1;</code>* @return The name.*/public java.lang.String getName() {java.lang.Object ref = name_;if (!(ref instanceof java.lang.String)) {com.google.protobuf.ByteString bs =(com.google.protobuf.ByteString) ref;java.lang.String s = bs.toStringUtf8();if (bs.isValidUtf8()) {name_ = s;}return s;} else {return (java.lang.String) ref;}}/*** <code>required string name = 1;</code>* @return The bytes for name.*/public com.google.protobuf.ByteStringgetNameBytes() {java.lang.Object ref = name_;if (ref instanceof String) {com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);name_ = b;return b;} else {return (com.google.protobuf.ByteString) ref;}}/*** <code>required string name = 1;</code>* @param value The name to set.* @return This builder for chaining.*/public Builder setName(java.lang.String value) {if (value == null) {throw new NullPointerException();}bitField0_ |= 0x00000001;name_ = value;onChanged();return this;}/*** <code>required string name = 1;</code>* @return This builder for chaining.*/public Builder clearName() {bitField0_ = (bitField0_ & ~0x00000001);name_ = getDefaultInstance().getName();onChanged();return this;}/*** <code>required string name = 1;</code>* @param value The bytes for name to set.* @return This builder for chaining.*/public Builder setNameBytes(com.google.protobuf.ByteString value) {if (value == null) {throw new NullPointerException();}bitField0_ |= 0x00000001;name_ = value;onChanged();return this;}private int age_ = 18;/*** <code>optional int32 age = 2 [default = 18];</code>* @return Whether the age field is set.*/@java.lang.Overridepublic boolean hasAge() {return ((bitField0_ & 0x00000002) != 0);}/*** <code>optional int32 age = 2 [default = 18];</code>* @return The age.*/@java.lang.Overridepublic int getAge() {return age_;}/*** <code>optional int32 age = 2 [default = 18];</code>* @param value The age to set.* @return This builder for chaining.*/public Builder setAge(int value) {bitField0_ |= 0x00000002;age_ = value;onChanged();return this;}/*** <code>optional int32 age = 2 [default = 18];</code>* @return This builder for chaining.*/public Builder clearAge() {bitField0_ = (bitField0_ & ~0x00000002);age_ = 18;onChanged();return this;}@java.lang.Overridepublic final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {return super.setUnknownFields(unknownFields);}@java.lang.Overridepublic final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {return super.mergeUnknownFields(unknownFields);}// @@protoc_insertion_point(builder_scope:com.test.protobuf.out.example.Person)}// @@protoc_insertion_point(class_scope:com.test.protobuf.out.example.Person)private static final com.test.protobuf.out.example.Test2.Person DEFAULT_INSTANCE;static {DEFAULT_INSTANCE = new com.test.protobuf.out.example.Test2.Person();}public static com.test.protobuf.out.example.Test2.Person getDefaultInstance() {return DEFAULT_INSTANCE;}@java.lang.Deprecated public static final com.google.protobuf.Parser<Person>PARSER = new com.google.protobuf.AbstractParser<Person>() {@java.lang.Overridepublic Person parsePartialFrom(com.google.protobuf.CodedInputStream input,com.google.protobuf.ExtensionRegistryLite extensionRegistry)throws com.google.protobuf.InvalidProtocolBufferException {Builder builder = newBuilder();try {builder.mergeFrom(input, extensionRegistry);} catch (com.google.protobuf.InvalidProtocolBufferException e) {throw e.setUnfinishedMessage(builder.buildPartial());} catch (com.google.protobuf.UninitializedMessageException e) {throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());} catch (java.io.IOException e) {throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());}return builder.buildPartial();}};public static com.google.protobuf.Parser<Person> parser() {return PARSER;}@java.lang.Overridepublic com.google.protobuf.Parser<Person> getParserForType() {return PARSER;}@java.lang.Overridepublic com.test.protobuf.out.example.Test2.Person getDefaultInstanceForType() {return DEFAULT_INSTANCE;}}private static final com.google.protobuf.Descriptors.Descriptorinternal_static_example_Person_descriptor;private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTableinternal_static_example_Person_fieldAccessorTable;public static com.google.protobuf.Descriptors.FileDescriptorgetDescriptor() {return descriptor;}private static com.google.protobuf.Descriptors.FileDescriptordescriptor;static {java.lang.String[] descriptorData = {"\n\013test2.proto\022\007example\"\'\n\006Person\022\014\n\004name" +"\030\001 \002(\t\022\017\n\003age\030\002 \001(\005:\00218"};descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData,new com.google.protobuf.Descriptors.FileDescriptor[] {});internal_static_example_Person_descriptor =getDescriptor().getMessageTypes().get(0);internal_static_example_Person_fieldAccessorTable = newcom.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_example_Person_descriptor,new java.lang.String[] { "Name", "Age", });}// @@protoc_insertion_point(outer_class_scope)
}
测试java文件是否可以正常使用
public static void testResolve() throws InvalidProtocolBufferException {byte[] protoBytes = new byte[] {0x0A, 0x05, 0x41, 0x6C, 0x69, 0x63, 0x65, // name: "Alice"0x10, 0x14 // age: 20};Test2.Person person = Test2.Person.parseFrom(protoBytes);// 4. 验证System.out.println(person.getName()); // AliceSystem.out.println(person.getAge()); // 20}
测试结果:
测试结论:变量前面的路径存在与否,都可以正常使用protoc转换后的java文件