protobuf是一种用于序列化结构数据的工具,实现数据的存储与交换,与编程语言和开发平台无关,性能高效果,速度快,体积小。
定义proto文件:
package space;
option optimize_for = SPEED;
message course{
optional string name = 1;
optional int32 score = 2;
}
message student{
optional string name = 1;
optional int32 age = 2;
repeated course mCourse = 3;
}
我们需要将proto文件转换成对应的java文件,此时需要protoc.exe文件(官网可以下载)
项目build.gradle也要依赖
最后再加上一个脚本可以方便生成:
下面就是生成的类:
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: pb_teacher.proto
package space;
public final class PbTeacher {
private PbTeacher() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
}
public interface courseOrBuilder
extends com.google.protobuf.MessageOrBuilder {
// optional string name = 1;
/**
* <code>optional string name = 1;</code>
*/
boolean hasName();
/**
* <code>optional string name = 1;</code>
*/
java.lang.String getName();
/**
* <code>optional string name = 1;</code>
*/
com.google.protobuf.ByteString
getNameBytes();
// optional int32 score = 2;
/**
* <code>optional int32 score = 2;</code>
*/
boolean hasScore();
/**
* <code>optional int32 score = 2;</code>
*/
int getScore();
}
/**
* Protobuf type {@code space.course}
*/
public static final class course extends
com.google.protobuf.GeneratedMessage
implements courseOrBuilder {
// Use course.newBuilder() to construct.
private course(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
super(builder);
this.unknownFields = builder.getUnknownFields();
}
private course(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
private static final course defaultInstance;
public static course getDefaultInstance() {
return defaultInstance;
}
public course getDefaultInstanceForType() {
return defaultInstance;
}
private final com.google.protobuf.UnknownFieldSet unknownFields;
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private course(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
initFields();
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!parseUnknownField(input, unknownFields,
extensionRegistry, tag)) {
done = true;
}
break;
}
case 10: {
bitField0_ |= 0x00000001;
name_ = input.readBytes();
break;
}
case 16: {
bitField0_ |= 0x00000002;
score_ = input.readInt32();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e.getMessage()).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return space.PbTeacher.internal_static_space_course_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return space.PbTeacher.internal_static_space_course_fieldAccessorTable
.ensureFieldAccessorsInitialized(
space.PbTeacher.course.class, space.PbTeacher.course.Builder.class);
}
public static com.google.protobuf.Parser<course> PARSER =
new com.google.protobuf.AbstractParser<course>() {
public course parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new course(input, extensionRegistry);
}
};
@java.lang.Override
public com.google.protobuf.Parser<course> getParserForType() {
return PARSER;
}
private int bitField0_;
// optional string name = 1;
public static final int NAME_FIELD_NUMBER = 1;
private java.lang.Object name_;
/**
* <code>optional string name = 1;</code>
*/
public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
/**
* <code>optional string name = 1;</code>
*/
public 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>optional string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
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;
}
}
// optional int32 score = 2;
public static final int SCORE_FIELD_NUMBER = 2;
private int score_;
/**
* <code>optional int32 score = 2;</code>
*/
public boolean hasScore() {
return ((bitField0_ & 0x00000002) == 0x00000002);
}
/**
* <code>optional int32 score = 2;</code>
*/
public int getScore() {
return score_;
}
private void initFields() {
name_ = "";
score_ = 0;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1;
memoizedIsInitialized = 1;
return true;
}
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
getSerializedSize();
if (((bitField0_ & 0x00000001) == 0x00000001)) {
output.writeBytes(1, getNameBytes());
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
output.writeInt32(2, score_);
}
getUnknownFields().writeTo(output);
}
private int memoizedSerializedSize = -1;
public int getSerializedSize() {
int size = memoizedSerializedSize;
if (size != -1) return size;
size = 0;
if (((bitField0_ & 0x00000001) == 0x00000001)) {
size += com.google.protobuf.CodedOutputStream
.computeBytesSize(1, getNameBytes());
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(2, score_);
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
@java.lang.Override
protected java.lang.Object writeReplace()
throws java.io.ObjectStreamException {
return super.writeReplace();
}
public static space.PbTeacher.course parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static space.PbTeacher.course parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static space.PbTeacher.course parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static space.PbTeacher.course parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static space.PbTeacher.course parseFrom(java.io.InputStream input)
throws java.io.IOException {
return PARSER.parseFrom(input);
}
public static space.PbTeacher.course parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseFrom(input, extensionRegistry);
}
public static space.PbTeacher.course parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return PARSER.parseDelimitedFrom(input);
}
public static space.PbTeacher.course parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseDelimitedFrom(input, extensionRegistry);
}
public static space.PbTeacher.course parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return PARSER.parseFrom(input);
}
public static space.PbTeacher.course parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseFrom(input, extensionRegistry);
}
public static Builder newBuilder() { return Builder.create(); }
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder(space.PbTeacher.course prototype) {
return newBuilder().mergeFrom(prototype);
}
public Builder toBuilder() { return newBuilder(this); }
@java.lang.Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code space.course}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessage.Builder<Builder>
implements space.PbTeacher.courseOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return space.PbTeacher.internal_static_space_course_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return space.PbTeacher.internal_static_space_course_fieldAccessorTable
.ensureFieldAccessorsInitialized(
space.PbTeacher.course.class, space.PbTeacher.course.Builder.class);
}
// Construct using space.PbTeacher.course.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
}
}
private static Builder create() {
return new Builder();
}
public Builder clear() {
super.clear();
name_ = "";
bitField0_ = (bitField0_ & ~0x00000001);
score_ = 0;
bitField0_ = (bitField0_ & ~0x00000002);
return this;
}
public Builder clone() {
return create().mergeFrom(buildPartial());
}
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return space.PbTeacher.internal_static_space_course_descriptor;
}
public space.PbTeacher.course getDefaultInstanceForType() {
return space.PbTeacher.course.getDefaultInstance();
}
public space.PbTeacher.course build() {
space.PbTeacher.course result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
public space.PbTeacher.course buildPartial() {
space.PbTeacher.course result = new space.PbTeacher.course(this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
to_bitField0_ |= 0x00000001;
}
result.name_ = name_;
if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
to_bitField0_ |= 0x00000002;
}
result.score_ = score_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof space.PbTeacher.course) {
return mergeFrom((space.PbTeacher.course)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(space.PbTeacher.course other) {
if (other == space.PbTeacher.course.getDefaultInstance()) return this;
if (other.hasName()) {
bitField0_ |= 0x00000001;
name_ = other.name_;
onChanged();
}
if (other.hasScore()) {
setScore(other.getScore());
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
public final boolean isInitialized() {
return true;
}
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
space.PbTeacher.course parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (space.PbTeacher.course) e.getUnfinishedMessage();
throw e;
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private int bitField0_;
// optional string name = 1;
private java.lang.Object name_ = "";
/**
* <code>optional string name = 1;</code>
*/
public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
/**
* <code>optional string name = 1;</code>
*/
public java.lang.String getName() {
java.lang.Object ref = name_;
if (!(ref instanceof java.lang.String)) {
java.lang.String s = ((com.google.protobuf.ByteString) ref)
.toStringUtf8();
name_ = s;
return s;
} else {
return (java.lang.String) ref;
}
}
/**
* <code>optional string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
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>optional string name = 1;</code>
*/
public Builder setName(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000001;
name_ = value;
onChanged();
return this;
}
/**
* <code>optional string name = 1;</code>
*/
public Builder clearName() {
bitField0_ = (bitField0_ & ~0x00000001);
name_ = getDefaultInstance().getName();
onChanged();
return this;
}
/**
* <code>optional string name = 1;</code>
*/
public Builder setNameBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000001;
name_ = value;
onChanged();
return this;
}
// optional int32 score = 2;
private int score_ ;
/**
* <code>optional int32 score = 2;</code>
*/
public boolean hasScore() {
return ((bitField0_ & 0x00000002) == 0x00000002);
}
/**
* <code>optional int32 score = 2;</code>
*/
public int getScore() {
return score_;
}
/**
* <code>optional int32 score = 2;</code>
*/
public Builder setScore(int value) {
bitField0_ |= 0x00000002;
score_ = value;
onChanged();
return this;
}
/**
* <code>optional int32 score = 2;</code>
*/
public Builder clearScore() {
bitField0_ = (bitField0_ & ~0x00000002);
score_ = 0;
onChanged();
return this;
}
// @@protoc_insertion_point(builder_scope:space.course)
}
static {
defaultInstance = new course(true);
defaultInstance.initFields();
}
// @@protoc_insertion_point(class_scope:space.course)
}
public interface studentOrBuilder
extends com.google.protobuf.MessageOrBuilder {
// optional string name = 1;
/**
* <code>optional string name = 1;</code>
*/
boolean hasName();
/**
* <code>optional string name = 1;</code>
*/
java.lang.String getName();
/**
* <code>optional string name = 1;</code>
*/
com.google.protobuf.ByteString
getNameBytes();
// optional int32 age = 2;
/**
* <code>optional int32 age = 2;</code>
*/
boolean hasAge();
/**
* <code>optional int32 age = 2;</code>
*/
int getAge();
// repeated .space.course mCourse = 3;
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
java.util.List<space.PbTeacher.course>
getMCourseList();
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
space.PbTeacher.course getMCourse(int index);
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
int getMCourseCount();
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
java.util.List<? extends space.PbTeacher.courseOrBuilder>
getMCourseOrBuilderList();
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
space.PbTeacher.courseOrBuilder getMCourseOrBuilder(
int index);
}
/**
* Protobuf type {@code space.student}
*/
public static final class student extends
com.google.protobuf.GeneratedMessage
implements studentOrBuilder {
// Use student.newBuilder() to construct.
private student(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
super(builder);
this.unknownFields = builder.getUnknownFields();
}
private student(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
private static final student defaultInstance;
public static student getDefaultInstance() {
return defaultInstance;
}
public student getDefaultInstanceForType() {
return defaultInstance;
}
private final com.google.protobuf.UnknownFieldSet unknownFields;
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private student(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
initFields();
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!parseUnknownField(input, unknownFields,
extensionRegistry, tag)) {
done = true;
}
break;
}
case 10: {
bitField0_ |= 0x00000001;
name_ = input.readBytes();
break;
}
case 16: {
bitField0_ |= 0x00000002;
age_ = input.readInt32();
break;
}
case 26: {
if (!((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
mCourse_ = new java.util.ArrayList<space.PbTeacher.course>();
mutable_bitField0_ |= 0x00000004;
}
mCourse_.add(input.readMessage(space.PbTeacher.course.PARSER, extensionRegistry));
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.InvalidProtocolBufferException(
e.getMessage()).setUnfinishedMessage(this);
} finally {
if (((mutable_bitField0_ & 0x00000004) == 0x00000004)) {
mCourse_ = java.util.Collections.unmodifiableList(mCourse_);
}
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return space.PbTeacher.internal_static_space_student_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return space.PbTeacher.internal_static_space_student_fieldAccessorTable
.ensureFieldAccessorsInitialized(
space.PbTeacher.student.class, space.PbTeacher.student.Builder.class);
}
public static com.google.protobuf.Parser<student> PARSER =
new com.google.protobuf.AbstractParser<student>() {
public student parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return new student(input, extensionRegistry);
}
};
@java.lang.Override
public com.google.protobuf.Parser<student> getParserForType() {
return PARSER;
}
private int bitField0_;
// optional string name = 1;
public static final int NAME_FIELD_NUMBER = 1;
private java.lang.Object name_;
/**
* <code>optional string name = 1;</code>
*/
public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
/**
* <code>optional string name = 1;</code>
*/
public 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>optional string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
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;
}
}
// optional int32 age = 2;
public static final int AGE_FIELD_NUMBER = 2;
private int age_;
/**
* <code>optional int32 age = 2;</code>
*/
public boolean hasAge() {
return ((bitField0_ & 0x00000002) == 0x00000002);
}
/**
* <code>optional int32 age = 2;</code>
*/
public int getAge() {
return age_;
}
// repeated .space.course mCourse = 3;
public static final int MCOURSE_FIELD_NUMBER = 3;
private java.util.List<space.PbTeacher.course> mCourse_;
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public java.util.List<space.PbTeacher.course> getMCourseList() {
return mCourse_;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public java.util.List<? extends space.PbTeacher.courseOrBuilder>
getMCourseOrBuilderList() {
return mCourse_;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public int getMCourseCount() {
return mCourse_.size();
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.course getMCourse(int index) {
return mCourse_.get(index);
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.courseOrBuilder getMCourseOrBuilder(
int index) {
return mCourse_.get(index);
}
private void initFields() {
name_ = "";
age_ = 0;
mCourse_ = java.util.Collections.emptyList();
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
byte isInitialized = memoizedIsInitialized;
if (isInitialized != -1) return isInitialized == 1;
memoizedIsInitialized = 1;
return true;
}
public void writeTo(com.google.protobuf.CodedOutputStream output)
throws java.io.IOException {
getSerializedSize();
if (((bitField0_ & 0x00000001) == 0x00000001)) {
output.writeBytes(1, getNameBytes());
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
output.writeInt32(2, age_);
}
for (int i = 0; i < mCourse_.size(); i++) {
output.writeMessage(3, mCourse_.get(i));
}
getUnknownFields().writeTo(output);
}
private int memoizedSerializedSize = -1;
public int getSerializedSize() {
int size = memoizedSerializedSize;
if (size != -1) return size;
size = 0;
if (((bitField0_ & 0x00000001) == 0x00000001)) {
size += com.google.protobuf.CodedOutputStream
.computeBytesSize(1, getNameBytes());
}
if (((bitField0_ & 0x00000002) == 0x00000002)) {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(2, age_);
}
for (int i = 0; i < mCourse_.size(); i++) {
size += com.google.protobuf.CodedOutputStream
.computeMessageSize(3, mCourse_.get(i));
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
}
private static final long serialVersionUID = 0L;
@java.lang.Override
protected java.lang.Object writeReplace()
throws java.io.ObjectStreamException {
return super.writeReplace();
}
public static space.PbTeacher.student parseFrom(
com.google.protobuf.ByteString data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static space.PbTeacher.student parseFrom(
com.google.protobuf.ByteString data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static space.PbTeacher.student parseFrom(byte[] data)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data);
}
public static space.PbTeacher.student parseFrom(
byte[] data,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf.InvalidProtocolBufferException {
return PARSER.parseFrom(data, extensionRegistry);
}
public static space.PbTeacher.student parseFrom(java.io.InputStream input)
throws java.io.IOException {
return PARSER.parseFrom(input);
}
public static space.PbTeacher.student parseFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseFrom(input, extensionRegistry);
}
public static space.PbTeacher.student parseDelimitedFrom(java.io.InputStream input)
throws java.io.IOException {
return PARSER.parseDelimitedFrom(input);
}
public static space.PbTeacher.student parseDelimitedFrom(
java.io.InputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseDelimitedFrom(input, extensionRegistry);
}
public static space.PbTeacher.student parseFrom(
com.google.protobuf.CodedInputStream input)
throws java.io.IOException {
return PARSER.parseFrom(input);
}
public static space.PbTeacher.student parseFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
return PARSER.parseFrom(input, extensionRegistry);
}
public static Builder newBuilder() { return Builder.create(); }
public Builder newBuilderForType() { return newBuilder(); }
public static Builder newBuilder(space.PbTeacher.student prototype) {
return newBuilder().mergeFrom(prototype);
}
public Builder toBuilder() { return newBuilder(this); }
@java.lang.Override
protected Builder newBuilderForType(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
Builder builder = new Builder(parent);
return builder;
}
/**
* Protobuf type {@code space.student}
*/
public static final class Builder extends
com.google.protobuf.GeneratedMessage.Builder<Builder>
implements space.PbTeacher.studentOrBuilder {
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return space.PbTeacher.internal_static_space_student_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return space.PbTeacher.internal_static_space_student_fieldAccessorTable
.ensureFieldAccessorsInitialized(
space.PbTeacher.student.class, space.PbTeacher.student.Builder.class);
}
// Construct using space.PbTeacher.student.newBuilder()
private Builder() {
maybeForceBuilderInitialization();
}
private Builder(
com.google.protobuf.GeneratedMessage.BuilderParent parent) {
super(parent);
maybeForceBuilderInitialization();
}
private void maybeForceBuilderInitialization() {
if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
getMCourseFieldBuilder();
}
}
private static Builder create() {
return new Builder();
}
public Builder clear() {
super.clear();
name_ = "";
bitField0_ = (bitField0_ & ~0x00000001);
age_ = 0;
bitField0_ = (bitField0_ & ~0x00000002);
if (mCourseBuilder_ == null) {
mCourse_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000004);
} else {
mCourseBuilder_.clear();
}
return this;
}
public Builder clone() {
return create().mergeFrom(buildPartial());
}
public com.google.protobuf.Descriptors.Descriptor
getDescriptorForType() {
return space.PbTeacher.internal_static_space_student_descriptor;
}
public space.PbTeacher.student getDefaultInstanceForType() {
return space.PbTeacher.student.getDefaultInstance();
}
public space.PbTeacher.student build() {
space.PbTeacher.student result = buildPartial();
if (!result.isInitialized()) {
throw newUninitializedMessageException(result);
}
return result;
}
public space.PbTeacher.student buildPartial() {
space.PbTeacher.student result = new space.PbTeacher.student(this);
int from_bitField0_ = bitField0_;
int to_bitField0_ = 0;
if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
to_bitField0_ |= 0x00000001;
}
result.name_ = name_;
if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
to_bitField0_ |= 0x00000002;
}
result.age_ = age_;
if (mCourseBuilder_ == null) {
if (((bitField0_ & 0x00000004) == 0x00000004)) {
mCourse_ = java.util.Collections.unmodifiableList(mCourse_);
bitField0_ = (bitField0_ & ~0x00000004);
}
result.mCourse_ = mCourse_;
} else {
result.mCourse_ = mCourseBuilder_.build();
}
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
}
public Builder mergeFrom(com.google.protobuf.Message other) {
if (other instanceof space.PbTeacher.student) {
return mergeFrom((space.PbTeacher.student)other);
} else {
super.mergeFrom(other);
return this;
}
}
public Builder mergeFrom(space.PbTeacher.student other) {
if (other == space.PbTeacher.student.getDefaultInstance()) return this;
if (other.hasName()) {
bitField0_ |= 0x00000001;
name_ = other.name_;
onChanged();
}
if (other.hasAge()) {
setAge(other.getAge());
}
if (mCourseBuilder_ == null) {
if (!other.mCourse_.isEmpty()) {
if (mCourse_.isEmpty()) {
mCourse_ = other.mCourse_;
bitField0_ = (bitField0_ & ~0x00000004);
} else {
ensureMCourseIsMutable();
mCourse_.addAll(other.mCourse_);
}
onChanged();
}
} else {
if (!other.mCourse_.isEmpty()) {
if (mCourseBuilder_.isEmpty()) {
mCourseBuilder_.dispose();
mCourseBuilder_ = null;
mCourse_ = other.mCourse_;
bitField0_ = (bitField0_ & ~0x00000004);
mCourseBuilder_ =
com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
getMCourseFieldBuilder() : null;
} else {
mCourseBuilder_.addAllMessages(other.mCourse_);
}
}
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
public final boolean isInitialized() {
return true;
}
public Builder mergeFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws java.io.IOException {
space.PbTeacher.student parsedMessage = null;
try {
parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
parsedMessage = (space.PbTeacher.student) e.getUnfinishedMessage();
throw e;
} finally {
if (parsedMessage != null) {
mergeFrom(parsedMessage);
}
}
return this;
}
private int bitField0_;
// optional string name = 1;
private java.lang.Object name_ = "";
/**
* <code>optional string name = 1;</code>
*/
public boolean hasName() {
return ((bitField0_ & 0x00000001) == 0x00000001);
}
/**
* <code>optional string name = 1;</code>
*/
public java.lang.String getName() {
java.lang.Object ref = name_;
if (!(ref instanceof java.lang.String)) {
java.lang.String s = ((com.google.protobuf.ByteString) ref)
.toStringUtf8();
name_ = s;
return s;
} else {
return (java.lang.String) ref;
}
}
/**
* <code>optional string name = 1;</code>
*/
public com.google.protobuf.ByteString
getNameBytes() {
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>optional string name = 1;</code>
*/
public Builder setName(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000001;
name_ = value;
onChanged();
return this;
}
/**
* <code>optional string name = 1;</code>
*/
public Builder clearName() {
bitField0_ = (bitField0_ & ~0x00000001);
name_ = getDefaultInstance().getName();
onChanged();
return this;
}
/**
* <code>optional string name = 1;</code>
*/
public Builder setNameBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000001;
name_ = value;
onChanged();
return this;
}
// optional int32 age = 2;
private int age_ ;
/**
* <code>optional int32 age = 2;</code>
*/
public boolean hasAge() {
return ((bitField0_ & 0x00000002) == 0x00000002);
}
/**
* <code>optional int32 age = 2;</code>
*/
public int getAge() {
return age_;
}
/**
* <code>optional int32 age = 2;</code>
*/
public Builder setAge(int value) {
bitField0_ |= 0x00000002;
age_ = value;
onChanged();
return this;
}
/**
* <code>optional int32 age = 2;</code>
*/
public Builder clearAge() {
bitField0_ = (bitField0_ & ~0x00000002);
age_ = 0;
onChanged();
return this;
}
// repeated .space.course mCourse = 3;
private java.util.List<space.PbTeacher.course> mCourse_ =
java.util.Collections.emptyList();
private void ensureMCourseIsMutable() {
if (!((bitField0_ & 0x00000004) == 0x00000004)) {
mCourse_ = new java.util.ArrayList<space.PbTeacher.course>(mCourse_);
bitField0_ |= 0x00000004;
}
}
private com.google.protobuf.RepeatedFieldBuilder<
space.PbTeacher.course, space.PbTeacher.course.Builder, space.PbTeacher.courseOrBuilder> mCourseBuilder_;
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public java.util.List<space.PbTeacher.course> getMCourseList() {
if (mCourseBuilder_ == null) {
return java.util.Collections.unmodifiableList(mCourse_);
} else {
return mCourseBuilder_.getMessageList();
}
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public int getMCourseCount() {
if (mCourseBuilder_ == null) {
return mCourse_.size();
} else {
return mCourseBuilder_.getCount();
}
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.course getMCourse(int index) {
if (mCourseBuilder_ == null) {
return mCourse_.get(index);
} else {
return mCourseBuilder_.getMessage(index);
}
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder setMCourse(
int index, space.PbTeacher.course value) {
if (mCourseBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
ensureMCourseIsMutable();
mCourse_.set(index, value);
onChanged();
} else {
mCourseBuilder_.setMessage(index, value);
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder setMCourse(
int index, space.PbTeacher.course.Builder builderForValue) {
if (mCourseBuilder_ == null) {
ensureMCourseIsMutable();
mCourse_.set(index, builderForValue.build());
onChanged();
} else {
mCourseBuilder_.setMessage(index, builderForValue.build());
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder addMCourse(space.PbTeacher.course value) {
if (mCourseBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
ensureMCourseIsMutable();
mCourse_.add(value);
onChanged();
} else {
mCourseBuilder_.addMessage(value);
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder addMCourse(
int index, space.PbTeacher.course value) {
if (mCourseBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
ensureMCourseIsMutable();
mCourse_.add(index, value);
onChanged();
} else {
mCourseBuilder_.addMessage(index, value);
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder addMCourse(
space.PbTeacher.course.Builder builderForValue) {
if (mCourseBuilder_ == null) {
ensureMCourseIsMutable();
mCourse_.add(builderForValue.build());
onChanged();
} else {
mCourseBuilder_.addMessage(builderForValue.build());
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder addMCourse(
int index, space.PbTeacher.course.Builder builderForValue) {
if (mCourseBuilder_ == null) {
ensureMCourseIsMutable();
mCourse_.add(index, builderForValue.build());
onChanged();
} else {
mCourseBuilder_.addMessage(index, builderForValue.build());
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder addAllMCourse(
java.lang.Iterable<? extends space.PbTeacher.course> values) {
if (mCourseBuilder_ == null) {
ensureMCourseIsMutable();
super.addAll(values, mCourse_);
onChanged();
} else {
mCourseBuilder_.addAllMessages(values);
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder clearMCourse() {
if (mCourseBuilder_ == null) {
mCourse_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000004);
onChanged();
} else {
mCourseBuilder_.clear();
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public Builder removeMCourse(int index) {
if (mCourseBuilder_ == null) {
ensureMCourseIsMutable();
mCourse_.remove(index);
onChanged();
} else {
mCourseBuilder_.remove(index);
}
return this;
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.course.Builder getMCourseBuilder(
int index) {
return getMCourseFieldBuilder().getBuilder(index);
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.courseOrBuilder getMCourseOrBuilder(
int index) {
if (mCourseBuilder_ == null) {
return mCourse_.get(index); } else {
return mCourseBuilder_.getMessageOrBuilder(index);
}
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public java.util.List<? extends space.PbTeacher.courseOrBuilder>
getMCourseOrBuilderList() {
if (mCourseBuilder_ != null) {
return mCourseBuilder_.getMessageOrBuilderList();
} else {
return java.util.Collections.unmodifiableList(mCourse_);
}
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.course.Builder addMCourseBuilder() {
return getMCourseFieldBuilder().addBuilder(
space.PbTeacher.course.getDefaultInstance());
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public space.PbTeacher.course.Builder addMCourseBuilder(
int index) {
return getMCourseFieldBuilder().addBuilder(
index, space.PbTeacher.course.getDefaultInstance());
}
/**
* <code>repeated .space.course mCourse = 3;</code>
*/
public java.util.List<space.PbTeacher.course.Builder>
getMCourseBuilderList() {
return getMCourseFieldBuilder().getBuilderList();
}
private com.google.protobuf.RepeatedFieldBuilder<
space.PbTeacher.course, space.PbTeacher.course.Builder, space.PbTeacher.courseOrBuilder>
getMCourseFieldBuilder() {
if (mCourseBuilder_ == null) {
mCourseBuilder_ = new com.google.protobuf.RepeatedFieldBuilder<
space.PbTeacher.course, space.PbTeacher.course.Builder, space.PbTeacher.courseOrBuilder>(
mCourse_,
((bitField0_ & 0x00000004) == 0x00000004),
getParentForChildren(),
isClean());
mCourse_ = null;
}
return mCourseBuilder_;
}
// @@protoc_insertion_point(builder_scope:space.student)
}
static {
defaultInstance = new student(true);
defaultInstance.initFields();
}
// @@protoc_insertion_point(class_scope:space.student)
}
private static com.google.protobuf.Descriptors.Descriptor
internal_static_space_course_descriptor;
private static
com.google.protobuf.GeneratedMessage.FieldAccessorTable
internal_static_space_course_fieldAccessorTable;
private static com.google.protobuf.Descriptors.Descriptor
internal_static_space_student_descriptor;
private static
com.google.protobuf.GeneratedMessage.FieldAccessorTable
internal_static_space_student_fieldAccessorTable;
public static com.google.protobuf.Descriptors.FileDescriptor
getDescriptor() {
return descriptor;
}
private static com.google.protobuf.Descriptors.FileDescriptor
descriptor;
static {
java.lang.String[] descriptorData = {
"\n\020pb_teacher.proto\022\005space"%\n\006course\022\014\n\004n" +
"ame\030\001 \001(\t\022\r\n\005score\030\002 \001(\005"D\n\007student\022\014\n\004n" +
"ame\030\001 \001(\t\022\013\n\003age\030\002 \001(\005\022\036\n\007mCourse\030\003 \003(\0132" +
"\r.space.courseB\002H\001"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
public com.google.protobuf.ExtensionRegistry assignDescriptors(
com.google.protobuf.Descriptors.FileDescriptor root) {
descriptor = root;
internal_static_space_course_descriptor =
getDescriptor().getMessageTypes().get(0);
internal_static_space_course_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_space_course_descriptor,
new java.lang.String[] { "Name", "Score", });
internal_static_space_student_descriptor =
getDescriptor().getMessageTypes().get(1);
internal_static_space_student_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_space_student_descriptor,
new java.lang.String[] { "Name", "Age", "MCourse", });
return null;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
}, assigner);
}
// @@protoc_insertion_point(outer_class_scope)
}
然后再写个数据解析类:
package space
import android.os.Parcelable
import android.util.Log
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Student(
var name: String?, var age: Int?, var courseList: List<Course>
) : Parcelable {
companion object {
private const val TAG = "Student"
fun parse(pb: PbTeacher.student?): Student? {
if (pb?.mCourseList?.isEmpty() == true) {
Log.w(TAG, "fromPb: pb.PbTeacher mCourseList is empty")
return null
}
val list = mutableListOf<Course>()
pb?.mCourseList?.forEach {
list.add(Course.parse(it))
}
return Student(
pb?.name, pb?.age, list
).also {
Log.i(TAG, "[parse] Student: $it")
}
}
}
}
@Parcelize
data class Course(
val name: String,
val score: Int,
) : Parcelable {
companion object {
const val TAG = "Course"
fun parse(pb: PbTeacher.course): Course {
return Course(
pb.name, pb.score
).also {
Log.i(TAG, "fromPb: Course: $it")
}
}
}
}
在实际项目中使用: