首先请注意当你说未知字段时。在 protobuf 中,根据定义,您可以拥有未知字段,但另一方面 - 我想这就是您的情况 - 您可以拥有当前原型文件中没有的字段。
在这两种情况下,您都可以轻松访问这些值。假设您有一条名为的原始消息foo.
您必须访问描述符并按名称从那里获取字段,最后获取如下所示的值:
Builder builder = foo.toBuilder();
FieldDescriptor field = builder.getDescriptorForType().findFieldByName("whatever field");
Object obj = builder.getField(field);
// if your field is int32 cast to int
int value = (int) obj
如果您想写入“未知”值,您可以以相反的方式进行:
Builder builder = foo.toBuilder();
FieldDescriptor field = builder.getDescriptorForType().findFieldByName("whatever field");
builder.setField(field, 100); // 100 is an example int value
Foo foo = builder.build();
如果您确实想插入原始定义的未知字段,您必须执行以下操作:
UnknownFieldSet.Field seqField = UnknownFieldSet.Field
.newBuilder()
.addFixed32(100) // 100 is an example int value
.build();
UnknownFieldSet unkFieldSet = UnknownFieldSet
.newBuilder()
.addField(99, seqField) // 99 is a proto index number chosen by me
.build();
Foo message = foo.toBuilder().setUnknownFields(unkFieldSet).build();
再次读取定义的未知字段是通过以下方式完成的:
foo.toBuilder().getUnknownFields()....
我希望这有帮助。