Во-первых, обратите внимание, когда вы говорите неизвестные поля. В 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()....
Надеюсь, это поможет.
person
Antal Attila
schedule
11.02.2020